Подтвердить что ты не робот

Устройства Motorola: org.threeten.bp.DateTimeException при анализе даты в ThreeTen

У меня очень странное поведение на некоторых устройствах Motorola, где LocalDateTime.now() возвращает 0000-00-00T00:00:00.0 с ThreeTenABP.

Код выглядит следующим образом:

@Override
protected void onResume() {
    super.onResume();
    if (!TextUtils.isEmpty(timeout)) {
        LocalDateTime savedTime = LocalDateTime.parse(timeout, DateTimeFormatter.ISO_DATE_TIME);
        if (LocalDateTime.now().isAfter(savedTime)) {
            refresh()
        }
    }
}

@Override
protected void onPause() {
    super.onPause();
    LocalDateTime currentTime = LocalDateTime.now().plus(Duration.ofMinutes(10));
    timeout = currentTime.format(DateTimeFormatter.ISO_DATE_TIME);
}

Только на этих устройствах (только 3 устройства Motorola, работающие под управлением 6.0):

У меня этот сбой:

Fatal Exception: java.lang.RuntimeException: Unable to resume activity {com.myapp/com.myapp.MainActivity}: org.threeten.bp.format.DateTimeParseException: Text '0000-00-00T00:00:00.8' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 0
       at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3121)
       at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3152)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1398)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:148)
       at android.app.ActivityThread.main(ActivityThread.java:5443)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
Caused by org.threeten.bp.format.DateTimeParseException: Text '0000-00-00T00:00:00.8' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 0
       at org.threeten.bp.format.DateTimeFormatter.createError(DateTimeFormatter.java:1559)
       at org.threeten.bp.format.DateTimeFormatter.parse(DateTimeFormatter.java:1496)
       at org.threeten.bp.LocalDateTime.parse(LocalDateTime.java:444)
       at com.myapp.MainActivity.onResume(MainActivity.java:273)
       at android.app.Activity.performResume(Activity.java:6344)
       at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3110)
       at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3152)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1398)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:148)
       at android.app.ActivityThread.main(ActivityThread.java:5443)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
Caused by org.threeten.bp.DateTimeException: Invalid value for MonthOfYear (valid values 1 - 12): 0
       at org.threeten.bp.temporal.ValueRange.checkValidValue(ValueRange.java:278)
       at org.threeten.bp.temporal.ChronoField.checkValidValue(ChronoField.java:557)
       at org.threeten.bp.LocalDate.of(LocalDate.java:237)
       at org.threeten.bp.chrono.IsoChronology.resolveDate(IsoChronology.java:452)
       at org.threeten.bp.format.DateTimeBuilder.mergeDate(DateTimeBuilder.java:297)
       at org.threeten.bp.format.DateTimeBuilder.resolve(DateTimeBuilder.java:206)
       at org.threeten.bp.format.DateTimeFormatter.parse(DateTimeFormatter.java:1491)
       at org.threeten.bp.LocalDateTime.parse(LocalDateTime.java:444)
       at com.myapp.MainActivity.onPostResume(MainActivity.java:273)
       at android.app.Activity.performResume(Activity.java:6344)
       at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3110)
       at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3152)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1398)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:148)
       at android.app.ActivityThread.main(ActivityThread.java:5443)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

Строка 273:

LocalDateTime savedTime = LocalDateTime.parse(timeout, DateTimeFormatter.ISO_DATE_TIME);

Таким образом, в основном LocaleDateTime.now() возвращает недопустимое время дат и его разбор не выполняется.

Другое интересное, что это произошло только с начала января. Кто-нибудь когда-либо сталкивался с этой проблемой?

4b9b3361

Ответ 1

Используйте вместо этого

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MINUTE,10);
Date date =   calendar.getTime();

Ответ 2

попробуй это:-

String dateFormat = "HH:mm:ss MM/dd/uuuu";
        String dateString = "11:30:59 02/31/2015";
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter
            .ofPattern(dateFormat, Locale.US)
            .withResolverStyle(ResolverStyle.STRICT);
        try {
            LocalDateTime date = LocalDateTime.parse(dateString, dateTimeFormatter);
            System.out.println(date);
        } catch (DateTimeParseException e) {
            // Throw invalid date message
            System.out.println("Exception was thrown");
        }

Ответ 3

Вы можете увидеть сообщение об ошибке "Недопустимое значение для MonthOfYear (допустимые значения 1–12)". MonthOfYear начинается с нуля (0). Поэтому, где бы вы ни использовали MonthOfYear, добавьте 1. так, чтобы оно было в правильном формате.

Ответ 4

Вы можете использовать этот формат для анализа даты txtldate.setText(Utility.convertMilliSecondsToFormatedDate(leedsModel.getCreatedDateTimeLong(), GLOBAL_DATE_FORMATE));

txtldate - это текст редактирования, или это может быть textview, а GLOBAL_DATE_FORMATE - константа со значением "dd MMM гггг"

Ответ 5

Попробуй это:

Класс SimpleDateFormat работает с экземплярами java.util.Date.

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

String dateString = format.format( new Date()   );
Date   date       = format.parse ( "2009-12-31" ); 

Ниже приведен список наиболее распространенных шаблонных букв, которые вы можете использовать

y   = year   (yy or yyyy)
M   = month  (MM)
d   = day in month (dd)
h   = hour (0-12)  (hh)
H   = hour (0-23)  (HH)
m   = minute in hour (mm)
s   = seconds (ss)
S   = milliseconds (SSS)
z   = time zone  text        (e.g. Pacific Standard Time...)
Z   = time zone, time offset (e.g. -0800)

Вот несколько примеров

yyyy-MM-dd           (2009-12-31)

dd-MM-YYYY           (31-12-2009)

yyyy-MM-dd HH:mm:ss  (2009-12-31 23:59:59)

HH:mm:ss.SSS         (23:59.59.999)

yyyy-MM-dd HH:mm:ss.SSS   (2009-12-31 23:59:59.999)

yyyy-MM-dd HH:mm:ss.SSS Z   (2009-12-31 23:59:59.999 +0100)

Может быть, это поможет вам :)

Ответ 6

Это известная ошибка на старом TBP: Threetenbp - форматирование даты не выполняется на некоторых устройствах Android, но оно разрешается на ThreeTenABP, который вы используете.

Эти три строки в значительной степени рассказывают вам все:

1.

Fatal Exception: java.lang.RuntimeException: Unable to resume activity {com.myapp/com.myapp.MainActivity}: org.threeten.bp.format.DateTimeParseException: Text '0000-00-00T00:00:00.8' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 0

2.

Caused by org.threeten.bp.format.DateTimeParseException: Text '0000-00-00T00:00:00.8' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 0

3.

Caused by org.threeten.bp.DateTimeException: Invalid value for MonthOfYear (valid values 1 - 12): 0

Вы передали "0000-00-00T00: 00: 00.8" в качестве аргумента.

Я решил эту проблему, используя ZonedDateTime (также рекомендованный, чтобы быть самым безопасным в использовании и рекомендованным даже Google) вместо LocalDateTime.

И еще один глупый вопрос, прежде чем что-то делать на ThreeTenABP. Вы инициировали ThreeTenABP в своем классе приложений?

public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        AndroidThreeTen.init(this); // Without this ThreeTenABP cannot work properly
    }
}

Кроме того, НЕ используйте никакую другую библиотеку Date/Time, поскольку все они устарели, на данный момент поддерживаются только два - ThreeTenABP (если вам нужно приложение, работающее на устройствах до QPI 26) и java.time(API 26+), никто другой Не говорить о проблемах производительности с другими старыми библиотеками.