Java 日期格式解析

Java Date Format Parsing

我正在尝试更改 JSON 响应的日期格式,但我一直收到 java.text.ParseException

这是来自服务器 2015-02-03T08:37:38.000Z 的日期,我希望它显示为 2015/02/03 那是 yyyy-MM-dd。而我做到了。

DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");
String dateResp = transactionItem.get(position).getDate();
try {
    Date date = df1.parse(dateResp);
    transDate.setText(dateFormatter.format(date));
} catch (ParseException e) {
    e.printStackTrace();
}

但是一直显示异常

您必须转义 Z:

"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"

尝试将其用于格式化目的,而不是您提供的格式化字符串。它应该工作得很好:)

tl;博士

Instant.parse( "2015-02-03T08:37:38.000Z" )
       .atZone( ZoneId.of( "America/Montreal" ) )
       .toLocalDate()
       .toString() // 2015-02-03

使用java.time

处理日期时间工作的现代方法是使用 java.time 类。

您输入的字符串格式恰好符​​合ISO 8601标准。 java.time 类 在 parsing/generating 表示日期时间值的字符串时默认使用 ISO 8601 格式。所以根本不需要指定格式模式。

将该字符串解析为 InstantInstant class represents a moment on the timeline in UTC with a resolution of nanoseconds(最多九 (9) 位小数)。

Instant instant = Instant.parse( "2015-02-03T08:37:38.000Z" ) ;

要提取日期,您必须指定时区。对于任何给定时刻,日期在全球范围内因地区而异。例如,在法国巴黎午夜过后的片刻是新的一天,而在加拿大蒙特利尔仍然是“昨天”。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

您只需要日期部分而不需要一天中的时间。所以提取一个LocalDate。虽然 LocalDate 缺少任何与 UTC 或时区的偏移量概念,但 toLocalDate 方法在确定日期时尊重 ZonedDateTime 对象的时区。

LocalDate ld = zdt.toLocalDate();

您似乎需要标准的 ISO 8601 格式,YYYY-MM-DD。只需调用 toString,无需指定格式模式。

String output = ld.toString();

2015-02-03


关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time 类.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

在哪里获取java.time类?

  • Java SE 8 and SE 9 及更高版本
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and SE 7
  • Android
    • ThreeTenABP 项目专门为 Android 改编 ThreeTen-Backport(如上所述)。
    • 参见

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.