如何将“2020-12-20T00:00:00.000Z”转换为java.util.Date?

如何将“2020-12-20T00:00:00.000Z”转换为java.util.Date?,java,date,localdate,datetime-parsing,datetimeformatter,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默认时间戳吗?这似乎是默认格式,请试试这个 ZonedDateTime日期时间=Zoned

我试着用

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH);
LocalDate date = LocalDate.parse(d.toString(), formatter);
但它抛出了一个错误


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

这似乎是默认格式,请试试这个

ZonedDateTime日期时间=ZonedDateTime.parse2020-07-28T14:28:52.877Z; //如果您仍然需要LocalDateTime LocalDateTime LocalDateTime=dateTime.toLocalDateTime;
这似乎是默认格式,请尝试此格式

ZonedDateTime日期时间=ZonedDateTime.parse2020-07-28T14:28:52.877Z; //如果您仍然需要LocalDateTime LocalDateTime LocalDateTime=dateTime.toLocalDateTime; 您需要使用LocalDateTime

您需要使用LocalDateTime

您不需要DateTimeFormatter来解析日期时间字符串 将给定的日期字符串直接解析为OffsetDateTime。现代日期时间API基于并且不需要显式使用DateTimeFormatter对象,只要日期时间字符串符合ISO 8601标准。日期时间字符串中的Z表示零时区偏移。它代表Zulu并指定时区偏移量为+00:00小时的Etc/UTC时区

将OffsetDateTime转换为Instant 使用将OffsetDateTime转换为即时。表示时间线上的瞬时点。它独立于时区,因此始终以UTC为单位

Instant instant = odt.toInstant();
停止使用旧的日期时间API 随着2014年3月Java SE 8的发布,过时且容易出错的遗留日期时间API Java.util日期时间类型及其格式类型SimpleDateFormat等被Java.time取代,后者是*。强烈建议停止使用旧API并切换到此新API。如果需要java.util.Date,请使用

请注意,java.util.Date对象不像;相反,它表示自称为历元的标准基准时间(即1970年1月1日、00:00:00 GMT或UTC)以来的毫秒数。打印java.util.Date对象时,其toString方法返回JVM时区中的日期时间,该时间是根据该毫秒值计算得出的。如果需要在不同的时区打印日期时间,则需要将时区设置为SimpleDataFormat并从中获取格式化字符串,例如

Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println(sdf.format(date));
您可以将瞬间转换为其他日期时间类型 您可以轻松地将瞬间转换为其他日期时间类型,例如,如果您想将其转换为表示伦敦日期时间的ZonedDateTime实例,您可以按如下操作

ZonedDateTime zdt = instant.atZone(ZoneId.of("Europe/London"));
LocalDateTime在您的情况下是无用的 是对LocalDateTime用法的一个很好的描述:

此类可用于表示特定事件,例如 美国杯路易威登杯决赛的第一场比赛 挑战者系列,于2013年8月17日下午1:10开始。笔记 这意味着当地时间下午1点10分

日期时间字符串的最佳用途是作为在第一步中获得的OffsetDateTime

演示:

输出:

了解更多关于java.time的信息,从

*无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。

您不需要DateTimeFormatter来解析日期时间字符串 将给定的日期字符串直接解析为OffsetDateTime。现代日期时间API基于并且不需要显式使用DateTimeFormatter对象,只要日期时间字符串符合ISO 8601标准。日期时间字符串中的Z表示零时区偏移。它代表Zulu并指定时区偏移量为+00:00小时的Etc/UTC时区

将OffsetDateTime转换为Instant 使用将OffsetDateTime转换为即时。表示时间线上的瞬时点。它独立于时区,因此始终以UTC为单位

Instant instant = odt.toInstant();
停止使用旧的日期时间API 随着2014年3月Java SE 8的发布,过时且容易出错的遗留日期时间API Java.util日期时间类型及其格式类型SimpleDateFormat等被Java.time取代,后者是*。强烈建议停止使用旧API并切换到此新API。如果需要java.util.Date,请使用

请注意,java.util.Date对象不像;相反,它表示自称为历元的标准基准时间(即1970年1月1日、00:00:00 GMT或UTC)以来的毫秒数。打印java.util.Date对象时,其toString方法返回JVM时区中的日期时间,该时间是根据该毫秒值计算得出的。如果需要在不同的时区打印日期时间,则需要将时区设置为SimpleDataFormat并从中获取格式化字符串,例如

Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println(sdf.format(date));
您可以将一个瞬间转换为其他日期时间t 类型 您可以轻松地将瞬间转换为其他日期时间类型,例如,如果您想将其转换为表示伦敦日期时间的ZonedDateTime实例,您可以按如下操作

ZonedDateTime zdt = instant.atZone(ZoneId.of("Europe/London"));
LocalDateTime在您的情况下是无用的 是对LocalDateTime用法的一个很好的描述:

此类可用于表示特定事件,例如 美国杯路易威登杯决赛的第一场比赛 挑战者系列,于2013年8月17日下午1:10开始。笔记 这意味着当地时间下午1点10分

日期时间字符串的最佳用途是作为在第一步中获得的OffsetDateTime

演示:

输出:

了解更多关于java.time的信息,从

*无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。

Z是祖鲁时区,即UTC时区,而不是文字Z

整个格式是ISO-8601即时格式

有一个预先存在的格式化程序:

从javadoc中摘录:

公共静态最终日期TimeFormatter ISO_INSTANT

以UTC格式格式化或解析瞬间的ISO即时格式化程序,如“2011-12-03T10:15:30Z”

这将返回一个能够格式化和解析ISO-8601即时格式的不可变格式化程序。格式化时,始终输出秒数。根据需要,nano of second输出零、三、六或九位数。解析时,至少需要到秒字段的时间。从0到9的小数秒被解析。不使用本地化的十进制样式

这是一个特例格式化程序,旨在允许即时消息的可读形式。Instant类被设计为仅表示一个时间点,并在内部以纳秒为单位存储1970-01-01Z这一固定历元的值。因此,如果不提供某种形式的时区,则不能将瞬间格式化为日期或时间。通过使用ZoneOffset.UTC提供适当的转换,此格式化程序允许对即时进行格式化

格式包括:

ISO_偏移量_日期_时间,其中使用UTC偏移量从ChronoField.instant_秒和ChronoField.NANO_秒转换为瞬间。解析不区分大小写

返回的格式化程序没有覆盖时间顺序或区域。它使用严格的解析器样式

Z是祖鲁时区,即UTC时区,而不是文字Z

整个格式是ISO-8601即时格式

有一个预先存在的格式化程序:

从javadoc中摘录:

公共静态最终日期TimeFormatter ISO_INSTANT

以UTC格式格式化或解析瞬间的ISO即时格式化程序,如“2011-12-03T10:15:30Z”

这将返回一个能够格式化和解析ISO-8601即时格式的不可变格式化程序。格式化时,始终输出秒数。根据需要,nano of second输出零、三、六或九位数。解析时,至少需要到秒字段的时间。从0到9的小数秒被解析。不使用本地化的十进制样式

这是一个特例格式化程序,旨在允许即时消息的可读形式。Instant类被设计为仅表示一个时间点,并在内部以纳秒为单位存储1970-01-01Z这一固定历元的值。因此,如果不提供某种形式的时区,则不能将瞬间格式化为日期或时间。通过使用ZoneOffset.UTC提供适当的转换,此格式化程序允许对即时进行格式化

格式包括:

ISO_偏移量_日期_时间,其中使用UTC偏移量从ChronoField.instant_秒和ChronoField.NANO_秒转换为瞬间。解析不区分大小写

返回的格式化程序没有覆盖时间顺序或区域。它使用严格的解析器样式


对于如何将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);

对于如何将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);

它到底抛出了什么错误?如果可以避免,请不要使用java.util.Date。改为使用Instant。我在HibernateSee中使用了它。答案是:由于您的格式似乎符合ISO标准,因此,如果这是来自JSON,您的JSON解析器库也可能为此提供一个函数。它会抛出什么错误?如果可以避免,请不要使用java.util.Date。我在HibernateSee中使用的是Instant,答案是:由于您的格式似乎符合ISO标准,因此,如果这是来自JSON,您的JSON解析器库也可能为此提供一个函数。
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);