Устройства 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()
возвращает неверное время даты и не может выполнить синтаксический анализ.
Другая интересная вещь - это произошло только с начала января. Кто-нибудь когда-либо сталкивался с этой проблемой?
1 ответ
Используйте следующее вместо
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MINUTE,10);
Date date = calendar.getTime();
Попробуй это:
Класс 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)
Может быть, это поможет вам:)
Это известная ошибка на старом 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 (если вам нужно приложение, работающее на устройствах до API 26) и java.time (API 26+), ни один Другой. Не говорить о проблемах производительности с другими старыми библиотеками.
Вы можете увидеть сообщение об ошибке "Недопустимое значение для MonthOfYear (допустимые значения 1–12)". MonthOfYear начинается с нуля (0). Поэтому, где бы вы ни использовали MonthOfYear, добавьте 1. так, чтобы оно было в правильном формате.
Попробуй это:-
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");
}
Вы можете использовать этот формат для анализа даты txtldate.setText (Utility.convertMilliSecondsToFormatedDate (leedsModel.getCreatedDateTimeLong (), GLOBAL_DATE_FORMATE));
txtldate - это текст редактирования, или это может быть textview, а GLOBAL_DATE_FORMATE - константа со значением "dd MMM гггг"