【问题标题】:2021-04-05T16:25:45.000+00:00 Time stamp change in SimpleDateFormat("yyyy-MM-dd hh:mm:ss a")2021-04-05T16:25:45.000+00:00 SimpleDateFormat 中的时间戳更改(“yyyy-MM-dd hh:mm:ss a”)
【发布时间】:2021-07-23 17:39:44
【问题描述】:

我的代码

String date = "2021-04-05T16:25:45.000+00:00";
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");
Date parsedDate = null;
try {
    parsedDate = inputFormat.parse(date);
} catch (ParseException e) {
    e.printStackTrace();
}
String formattedDate = outputFormat.format(parsedDate);

错误:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“long java.util.Date.getTime()”

【问题讨论】:

  • 顺便考虑扔掉长期过时且臭名昭著的麻烦SimpleDateFormat和朋友。看看您是否可以使用desugaring 或将ThreeTenABP 添加到您的Android 项目中,以便使用现代Java 日期和时间API 的java.time。使用起来感觉好多了。
  • 您遇到了解析异常。检查来自e.printStackTrace(); 的输出。
  • 这是否全部或部分回答了您的问题? Generic support for ISO 8601 format in Java 6。和/或这个? String date into Epoch time

标签: java android date timestamp


【解决方案1】:

java.time 脱糖

考虑为您的日期和时间工作使用现代 Java 日期和时间 API java.time。例如使用这个输出格式化程序:

private static final DateTimeFormatter OUTPUT_FORMATTER
        = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss a", Locale.forLanguageTag("en-IN"));

有了它:

    String date = "2021-04-05T16:25:45.000+00:00";
    OffsetDateTime dateTime = OffsetDateTime.parse(date);
    String formattedDate = dateTime.format(OUTPUT_FORMATTER);
    
    System.out.println(formattedDate);

输出:

2021-04-05 下午 4:25:45

您可以根据需要为输出格式化程序使用不同的语言环境。语言环境的选择决定了哪些字符串用于 AM 和 PM。

我正在利用您获得的字符串是 ISO 8601 格式的事实。 offsetDateTime 将此格式解析为默认格式,即没有任何显式格式化程序。

你的代码出了什么问题?

您尝试将格式模式字符串yyyy-MM-dd'T'HH:mm:ss.SSS'Z' 用于日期字符串2021-04-05T16:25:45.000+00:00。格式模式字符串中单引号中的'Z' 意味着您的日期字符串必须以文字Z 结尾。相反,当它以+00:00 结束时,解析失败并出现ParseException。如果您在代码中没有看到来自e.printStackTrace(); 的输出,那么您的项目设置中有一个严重的缺陷,您应该在担心如何解析日期字符串之前修复它。无论如何,由于解析失败,parsedDate 保持其初始值null,这导致outputFormat.format(parsedDate) 抛出您确实看到的NullPointerException

问题:java.time 不需要 Android API 26 级吗?

java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
  • 在非 Android 的 Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
  • 在较旧的 Android 上,请使用脱糖或 Android 版本的 ThreeTen Backport。它被称为 ThreeTenABP。在后一种情况下,请确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2021-07-05
    • 2013-12-06
    • 1970-01-01
    • 2021-04-28
    相关资源
    最近更新 更多