[英]Java LocalDateTime remove the milliseconds from UTC timezone
我正在尝试从 UTC 时区截断毫秒。 我有下面的代码,我可以在其中删除毫秒,但最后我仍然得到 Z。
OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC );
OffsetDateTime eventDateTime=now.minus(4, ChronoUnit.MINUTES);
System.out.println("====Event date Time before truncate===");
System.out.println(eventDateTime);
System.out.println("====Event date Time after truncate===");
System.out.println(eventDateTime.truncatedTo(ChronoUnit.SECONDS));
这将输出以下内容:
====事件日期截断前的时间===
2021-03-09T20:46:24.081Z
====截断后的事件日期时间===
2021-03-09T20:46:24Z
Z
是时区信息。 您可以像这样将OffsetDateTime
实例转换为LocalDateTime
:
eventDateTime.truncatedTo(ChronoUnit.SECONDS).toLocalDateTime()
最后的Z
代表重要信息:日期时间代表一个时刻,与 UTC 的偏移量为 0 小时-分钟-秒。 该字母被定义为 ISO 8601 标准格式的一部分。根据航空/军事传统,该字母发音为“Zulu”。
如果您不关心问题域中的偏移量或时区,那么您使用了错误的类型。
Instant
、 OffsetDateTime
和ZonedDateTime
类型都代表一个时刻,即时间线上的一个特定点。 这三个都涉及偏移量或时区。
LocalDateTime
如果您只想要一个带有时间但缺少偏移量/区域上下文的日期,请使用LocalDateTime
。 没有Z
将出现在表示LocalDateTime
值的文本中,因为不涉及偏移量。
请注意, LocalDateTime
object 本质上是模棱两可的,并不代表片刻。 换句话说,调用LocalDateTime.now
几乎从来都不是正确的做法。 但如果你坚持:
LocalDateTime ldt = LocalDateTime.now( ZoneOffset.UTC ) ;
可以有两种方式:
DateTimeFormatter
OffsetDateTime#toLocalDateTime
:这种方法的问题是如果秒部分为零,output 字符串会自动截断为分钟。演示:
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtfWithoutSecFraction = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss");
DateTimeFormatter dtfWithSecFraction = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSS");
OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC);
OffsetDateTime eventDateTime = now.minusMinutes(4);
System.out.println("====Event date Time before truncate===");
System.out.println(eventDateTime);
System.out.println(eventDateTime.toLocalDateTime());
System.out.println(dtfWithSecFraction.format(eventDateTime));
System.out.println("====Event date Time after truncate===");
System.out.println(eventDateTime.truncatedTo(ChronoUnit.SECONDS));
System.out.println(eventDateTime.truncatedTo(ChronoUnit.SECONDS).toLocalDateTime());
System.out.println(dtfWithoutSecFraction.format(eventDateTime.truncatedTo(ChronoUnit.SECONDS)));
}
}
Output:
====Event date Time before truncate===
2021-03-09T21:17:17.589016Z
2021-03-09T21:17:17.589016
2021-03-09T21:17:17.589016
====Event date Time after truncate===
2021-03-09T21:17:17Z
2021-03-09T21:17:17
2021-03-09T21:17:17
请注意, Z
代表Zulu
,它以 UTC 指定日期时间(即时区偏移量为+00:00
小时)。
下表概述了java.time类型:
如您所见, OffsetDateTime
, ZonedDateTime
等携带时区信息,您可以使用上述解决方案中提到的技术仅获取日期时间部分。
从Trail: Date Time了解有关现代日期时间 API 的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.