java تحليل سلسلة المدة إلى مللي ثانية



convert string to date javascript (3)

أحتاج إلى تحليل سلسلة المدة، من النموذج 98d 01h 23m 45s إلى ميلي ثانية.

كنت آمل أن يكون هناك ما يعادل SimpleDateFormat مثل هذا، ولكن لم أتمكن من العثور على أي شيء. ھل یوصي أي شخص بمحاولة استخدام قوات الدفاع الذاتیة أو ضدھا لھذا الغرض؟

خطتي الحالية هي استخدام التعبير العادي لتتناسب مع الأرقام وتفعل شيئا من هذا القبيل

Pattern p = Pattern.compile("(\\d+)");
Matcher m = p.matcher("98d 01h 23m 45s");

if (m.find()) {
    int days = Integer.parseInt(m.group());
}
// etc. for hours, minutes, seconds

ومن ثم استخدام تيمونيت لوضع كل ذلك معا وتحويل إلى ميلي ثانية.

أعتقد سؤالي هو، وهذا يبدو وكأنه مبالغة، ويمكن أن يتم ذلك أسهل؟ الكثير من الأسئلة حول التواريخ والطوابع الزمنية تحولت ولكن هذا هو مختلف قليلا، ربما.


Answer #1

تحقق من PeriodFormatter PeriodParser من مكتبة جوداتيم .

يمكنك أيضا استخدام PeriodFormatterBuilder لبناء محلل لسلاسل الخاص بك مثل هذا

String periodString = "98d 01h 23m 45s";

PeriodParser parser = new PeriodFormatterBuilder()
   .appendDays().appendSuffix("d ")
   .appendHours().appendSuffix("h ")
   .appendMinutes().appendSuffix("m ")
   .appendSeconds().appendSuffix("s ")
   .toParser();

MutablePeriod period = new MutablePeriod();
parser.parseInto(period, periodString, 0, Locale.getDefault());

long millis = period.toDurationFrom(new DateTime(0)).getMillis();

الآن، كل هذا (وخاصة toDurationFrom(...) جزء قد تبدو صعبة، ولكن أنا حقا نصيحة لك للنظر في JodaTime إذا كنت تتعامل مع فترات ومدد في جافا.

ننظر أيضا في هذه الإجابة عن الحصول على ميلي ثانية من فترة جودايم لمزيد من التوضيح.


Answer #2

استخدام Pattern هو وسيلة معقولة للذهاب. ولكن لماذا لا تستخدم واحدة للحصول على جميع الحقول الأربعة؟

Pattern p = Pattern.compile("(\\d+)d\\s+(\\d+)h\\s+(\\d+)m\\s+(\\d+)s");

ثم استخدم جلب المجموعة المفهرسة.

تصحيح:

بناء على فكرتك، كتبت في نهاية المطاف الطريقة التالية

private static Pattern p = Pattern
        .compile("(\\d+)d\\s+(\\d+)h\\s+(\\d+)m\\s+(\\d+)s");

/**
 * Parses a duration string of the form "98d 01h 23m 45s" into milliseconds.
 * 
 * @throws ParseException
 */
public static long parseDuration(String duration) throws ParseException {
    Matcher m = p.matcher(duration);

    long milliseconds = 0;

    if (m.find() && m.groupCount() == 4) {
        int days = Integer.parseInt(m.group(1));
        milliseconds += TimeUnit.MILLISECONDS.convert(days, TimeUnit.DAYS);
        int hours = Integer.parseInt(m.group(2));
        milliseconds += TimeUnit.MILLISECONDS
                .convert(hours, TimeUnit.HOURS);
        int minutes = Integer.parseInt(m.group(3));
        milliseconds += TimeUnit.MILLISECONDS.convert(minutes,
                TimeUnit.MINUTES);
        int seconds = Integer.parseInt(m.group(4));
        milliseconds += TimeUnit.MILLISECONDS.convert(seconds,
                TimeUnit.SECONDS);
    } else {
        throw new ParseException("Cannot parse duration " + duration, 0);
    }

    return milliseconds;
}

Answer #3

فئة java.time.Duration الجديدة في جافا 8 تتيح لك تحليل فترات من خارج منطقة الجزاء:

Duration.parse("P98DT01H23M45S").toMillis();

الشكل يختلف قليلا لذلك سوف تحتاج إلى تعديل قبل التحليل.





time