2021-04-05T16:25:45.000+00:00 简单日期格式("yyyy-MM-dd hh:mm:ss a" ) 中的时间戳更改



我的代码

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((">

java.time通过desugaring

考虑使用现代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 04:25:45 PM

根据您的需求,您可以为输出格式化程序使用不同的区域设置。区域设置的选择决定了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不需要安卓API 26级吗

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

  • 在Java 8及更高版本中,以及在较新的Android设备上(从API 26级开始(,现代API内置
  • 在非Android Java 6和7中,获得ThreeTen Backport,即现代类的Backport(JSR310的ThreeTen;请参阅底部的链接(
  • 在旧的安卓系统上,可以使用desugaring或安卓版的ThreeTen Backport。它被称为ThreeTenABP。在后一种情况下,请确保使用子包从org.threeten.bp导入日期和时间类

链接

  • Oracle教程:日期时间,解释如何使用java.Time
  • Java规范请求(JSR(310,其中首次描述了java.time
  • ThreeTen Backport项目,java.time到Java 6和7的Backport(JSR-310的ThreeTen(
  • 通过降级提供Java 8+API
  • ThreeTenABP,安卓版ThreeTen背包
  • 问题:如何在Android项目中使用ThreeTenABP,有一个非常彻底的解释
  • 维基百科文章:ISO 8601

最新更新