怎么把“ 2020-12-20T00:00:00.000Z”转换成java.util.Date?

时间:2020-07-29 15:21:15

标签: java date localdate datetime-parsing datetimeformatter

我尝试使用

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH);
LocalDate date = LocalDate.parse(d.toString(), formatter);

但是会引发错误。

有什么方法可以转换JSON默认时间戳?

5 个答案:

答案 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,它会丢弃时区信息。使用OffsetDateTimeZonedDateTime代替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