threeten jakewharton android motorola threetenbp

android - com jakewharton threetenabp threetenabp 1.1 1



Dispositivos Motorola: org.threeten.bp.DateTimeException al analizar una fecha en ThreeTen (6)

Este es un error conocido en TBP antiguo: Threetenbp: el formato de fecha falla en algunos dispositivos Android, pero se resuelve en ThreeTenABP que está utilizando.

Estas tres líneas casi te dicen todo:

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

Has pasado ''0000-00-00T00: 00: 00.8'' como argumento.

He resuelto esto usando ZonedDateTime (también se recomienda que sea el más seguro de usar y recomendado incluso por Google) en lugar de LocalDateTime.

Y una pregunta estúpida antes de hacer algo en ThreeTenABP. ¿Inició ThreeTenABP en su clase de aplicación?

public class App extends Application { @Override public void onCreate() { super.onCreate(); AndroidThreeTen.init(this); // Without this ThreeTenABP cannot work properly } }

Además, NO use ninguna otra lib de fecha / hora, ya que están en desuso, las dos únicas admitidas en este momento son ThreeTenABP (si necesita que la aplicación se ejecute en dispositivos anteriores a la API 26) y java.time (API 26+), ninguna otro. No hablar sobre problemas de rendimiento con otras bibliotecas antiguas.

Tengo un comportamiento muy extraño en algunos dispositivos Motorola donde LocalDateTime.now() está devolviendo 0000-00-00T00:00:00.0 con ThreeTenABP .

El código es el siguiente:

@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); }

Solo en estos dispositivos (solo 3 dispositivos Motorola con 6.0):

Tengo este accidente:

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)

La línea 273 es:

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

Entonces, básicamente LocaleDateTime.now() está devolviendo una fecha y hora no válidas y el análisis falla.

La otra cosa interesante es que solo sucedió desde principios de enero. ¿Alguien ha enfrentado alguna vez ese problema?


Puede usar este formato para analizar la fecha txtldate.setText (Utility.convertMilliSecondsToFormatedDate (leedsModel.getCreatedDateTimeLong (), GLOBAL_DATE_FORMATE));

txtldate es un texto de edición o puede ser una vista de texto y GLOBAL_DATE_FORMATE es una constante con el valor "dd MMM aaaa"


Puede ver el error que dice "Valor no válido para MonthOfYear (valores válidos 1 - 12)" MonthOfYear comienza con cero (0). Entonces, donde sea que esté usando MonthOfYear, agregue 1. para que esté en el formato correcto.


Use lo siguiente en su lugar

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


prueba esto:-

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"); }


Prueba esto:

La clase SimpleDateFormat funciona en instancias java.util.Date.

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

A continuación se muestra una lista de las letras de patrón más comunes que puede usar

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)

Aquí hay algunos ejemplos de patrones.

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)

Puede que esto te ayude :)