我尝试使用
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH);
LocalDate date = LocalDate.parse(d.toString(), formatter);
但是会引发错误。
有什么方法可以转换JSON默认时间戳?
答案 0 :(得分:4)
您需要使用LocalDateTime
。
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH);
LocalDateTime date = LocalDateTime.parse(d.toString(), formatter);
答案 1 :(得分:2)
Z
是Zulu时区(即UTC时区),而不是文字Z。
整个格式是ISO-8601即时格式。
有一个预先存在的格式化程序:DateTimeFormatter#ISO_INSTANT
从javadoc中提取:
公共静态最终DateTimeFormatter ISO_INSTANT
用于格式化或解析UTC即时消息的ISO即时格式化程序,例如“ 2011-12-03T10:15:30Z”。
这将返回一个不变的格式化程序,该格式化程序能够格式化和解析ISO-8601即时格式。格式化时,始终输出分钟。毫微秒的秒根据需要输出零,三,六或九位数字。解析时,至少需要秒数字段的时间。解析从零到九的小数秒。不使用本地化的十进制样式。
这是一种特殊情况的格式化程序,旨在使人们可以理解形式的Instant。 Instant类旨在仅表示一个时间点,并在内部存储距离1970-01-01Z固定纪元为十亿分之一秒的值。因此,如果不提供某种形式的时区,Instant不能格式化为日期或时间。通过使用ZoneOffset.UTC提供适当的转换,此格式化程序允许对Instant进行格式化。
格式包括:
使用UTC偏移量从ChronoField.INSTANT_SECONDS和ChronoField.NANO_OF_SECOND转换瞬间的ISO_OFFSET_DATE_TIME。解析不区分大小写。
返回的格式化程序没有覆盖时间顺序或区域。它使用STRICT解析器样式。
答案 2 :(得分:1)
这似乎是默认格式,请尝试使用此格式。
ZonedDateTime dateTime = ZonedDateTime.parse("2020-07-28T14:28:52.877Z");
// In case you still need LocalDateTime
LocalDateTime localDateTime = dateTime.toLocalDateTime();
答案 3 :(得分:1)
对于有关如何将LocalDate
转换为java.util.Date
的问题,可以使用Date.from
方法,如下所示。让我知道这是否是您期望实现的目标。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH);
LocalDate localDate = LocalDate.parse("2020-12-20T00:00:00.000Z", formatter);
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
System.out.println(date);
答案 4 :(得分:0)
请勿使用LocalDate
,它会丢弃时区信息。使用OffsetDateTime
或ZonedDateTime
代替this table所示:
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
// The given date-time string
String strDate = "2020-12-20T00:00:00.000Z";
// Define formatter
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX");
// Get OffsetDateTime by applying the formatter
OffsetDateTime odt = OffsetDateTime.parse(strDate, formatter);
System.out.println(odt);
// -OR- Get ZoneDateTime by applying the formatter
ZonedDateTime zdt = ZonedDateTime.parse(strDate, formatter);
System.out.println(zdt);
// You can print it in different forms using DateTimeFormatter patterns e.g.
System.out.println("\nThe given date-time formatted in different patterns:");
System.out.println(DateTimeFormatter.ofPattern("MMM dd uuuu", Locale.ENGLISH).format(odt));
System.out
.println(DateTimeFormatter.ofPattern("MMM dd uuuu HH:mm:ss.SSSSSSS ZZZZZ", Locale.ENGLISH).format(odt));
System.out.println(
zdt.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withLocale(Locale.ENGLISH)));
System.out.println(DateTimeFormatter.ofPattern("MM/uuuu/dd hh:mm:ss a").format(odt));
}
}
输出:
2020-12-20T00:00Z
2020-12-20T00:00Z
The given date-time formatted in different patterns:
Dec 20 2020
Dec 20 2020 00:00:00.0000000 Z
Sunday, December 20, 2020 at 12:00:00 AM Z
12/2020/20 12:00:00 am