Устройства 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() возвращает недопустимую дату и время, и ее синтаксический анализ терпит неудачу.

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


person Romain Piel    schedule 27.01.2016    source источник
comment
Возможно, та же проблема, что описана в этом SO-вопросе, см. также мой ответ там.   -  person Meno Hochschild    schedule 17.02.2016
comment
Вы отказались от библиотеки? Такая проблема крайне раздражает.   -  person ar-g    schedule 19.02.2016
comment
@MenoHochschild Спасибо за соответствующий вопрос, он выглядит очень похоже, хотя по какой-то причине нет упоминания о Motorola и Android 6.   -  person Romain Piel    schedule 26.02.2016
comment
@ ar-g Мы все еще используем его, он все еще дает сбой, но я совершенно уверен, что когда-нибудь мы это исправим. Сначала я пытаюсь воспроизвести проблему, чтобы правильно ее отладить.   -  person Romain Piel    schedule 26.02.2016
comment
Для помощи в диагностике и отладке, если вы используете мою библиотеку Time4A и замените LocalDateTime.now() на SystemClock.inLocalView().now(), вы, вероятно, сможете определить, какое конкретное значение часов сходит с ума, потому что Time4A выполняет правильную проверку.   -  person Meno Hochschild    schedule 04.03.2016
comment
FWIW, что-то кажется ужасно неправильным на этих устройствах. В нашем случае это форматирование ZonedDateTime, которое дает сбой, но только для определенных значений. Например, Instant.ofEpochMillis(1457636400000L).atZone(ZoneId.getSystemDefault()) должно быть 3 марта 2016 года, но форматирование в формате гггг-ММ-дд приводит к сбою... только на устройствах Moto G. Ответов пока нет, просто еще одна точка данных.   -  person Ben    schedule 05.03.2016
comment
Достигли ли вы какого-либо прогресса в анализе того, какое значение часов вызывает такие проблемы?   -  person Meno Hochschild    schedule 14.04.2016
comment
О проблеме было сообщено в ThreeTenBp: github.com/ThreeTen/threetenbp/issues/50.   -  person Romain Piel    schedule 05.09.2016
comment
Причина проблемы четко указана в журнале ошибок.   -  person Chandler    schedule 21.02.2019


Ответы (6)


Вместо этого используйте следующее

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MINUTE,10);
Date date =   calendar.getTime();
person Daniel Raouf    schedule 13.12.2017

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

Класс 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)

Возможно, это поможет вам :)

person AndroWaqar    schedule 10.04.2019

Это известная ошибка в старой версии 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
    }
}

Кроме того, НЕ ИСПОЛЬЗУЙТЕ какие-либо другие библиотеки даты/времени, так как все они устарели. На данный момент поддерживаются только две: ThreeTenABP (если вам нужно приложение, работающее на устройствах, предшествующих API 26) и java.time (API 26+). ), никакое другое. Не говоря уже о проблемах с производительностью других старых библиотек.

person Slobodan Antonijević    schedule 03.05.2019

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

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");
        }
person Sejpal Pavan    schedule 27.02.2019

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

person Amruta    schedule 01.03.2019

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

txtldate — это edittext или это может быть textview, а GLOBAL_DATE_FORMATE — это константа со значением «dd MMM yyyy»

person sagar deshmukh    schedule 13.03.2019