提问人:Romain Piel 提问时间:1/28/2016 最后编辑:Romain Piel 更新时间:5/3/2019 访问量:1684
摩托罗拉设备:org.threeten.bp.DateTimeException 在 ThreeTen 中解析日期时
Motorola devices : org.threeten.bp.DateTimeException when parsing a date in ThreeTen
问:
我在某些摩托罗拉设备上有一个非常奇怪的行为,其中返回了 ThreeTenABP。LocalDateTime.now()
0000-00-00T00:00:00.0
代码如下:
@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);
}
我有这个崩溃:
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()
另一件有趣的事情是,它只发生在一月初。有人遇到过这个问题吗?
答:
请改用以下命令
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MINUTE,10);
Date date = calendar.getTime();
试试这个:-
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");
}
您可以看到错误“MonthOfYear 的值无效(有效值 1 - 12)” MonthOfYear 以 0(0) 开头。因此,无论您在哪里使用 MonthOfYear,都添加 1。所以它将采用正确的格式。
您可以使用此格式来分析日期 txtldate.setText(Utility.convertMilliSecondsToFormatedDate(leedsModel.getCreatedDateTimeLong(), GLOBAL_DATE_FORMATE));
txtldate 是一个 edittext,也可以是 textview,GLOBAL_DATE_FORMATE是一个值为“dd MMM yyyy”的常量
试试这个:
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做任何事情之前,还有一个愚蠢的问题。 您是否在 Application 类中初始化了 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+),没有其他。更不用说其他旧库的性能问题了。
评论
LocalDateTime.now()
SystemClock.inLocalView().now()