Java LocalDateTime 从 UTC 时区中删除毫秒
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));
这会输出以下内容:
====Event date Time before truncate===
2021-03-09T20:46:24.081Z
====Event date Time after truncate===
2021-03-09T20:46:24Z
Z
是时区信息。您可以像这样将 OffsetDateTime
实例转换为 LocalDateTime
:
eventDateTime.truncatedTo(ChronoUnit.SECONDS).toLocalDateTime()
祖鲁时代
末尾的 Z
代表重要信息:日期时间代表一个时刻,与 UTC 的偏移量为零小时-分钟-秒。该字母被定义为 ISO 8601 标准格式的一部分。根据 aviation/military 传统,该字母发音为“Zulu”。
如果您不关心问题域中的偏移量或时区,那么您使用了错误的类型。
类型Instant
、OffsetDateTime
和ZonedDateTime
都代表一个时刻,时间轴上的一个特定点。这三个都涉及偏移量或时区。
LocalDateTime
如果您只想要一个带有时间但缺少 offset/zone 上下文的日期,则使用 LocalDateTime
。没有 Z
会出现在表示 LocalDateTime
值的文本中,因为不涉及偏移量。
请注意,LocalDateTime
对象本质上是不明确的,并不代表一个时刻。换句话说,调用 LocalDateTime.now
几乎从来都不是正确的做法。但如果你坚持:
LocalDateTime ldt = LocalDateTime.now( ZoneOffset.UTC ) ;
可以有两种方式:
- 首选方式:使用
DateTimeFormatter
- 使用
OffsetDateTime#toLocalDateTime
:这种方法的问题是如果秒部分为零,输出字符串会自动截断为分钟。
演示:
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)));
}
}
输出:
====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
小时的时区偏移)。
以下table为您提供java.time类型的概览:
如您所见,OffsetDateTime
、ZonedDateTime
等携带时区信息,您可以使用上述解决方案中提到的技术仅获取日期时间部分。
了解有关现代日期时间的更多信息 API
我正在尝试截断 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));
这会输出以下内容:
====Event date Time before truncate===
2021-03-09T20:46:24.081Z
====Event date Time after truncate===
2021-03-09T20:46:24Z
Z
是时区信息。您可以像这样将 OffsetDateTime
实例转换为 LocalDateTime
:
eventDateTime.truncatedTo(ChronoUnit.SECONDS).toLocalDateTime()
祖鲁时代
末尾的 Z
代表重要信息:日期时间代表一个时刻,与 UTC 的偏移量为零小时-分钟-秒。该字母被定义为 ISO 8601 标准格式的一部分。根据 aviation/military 传统,该字母发音为“Zulu”。
如果您不关心问题域中的偏移量或时区,那么您使用了错误的类型。
类型Instant
、OffsetDateTime
和ZonedDateTime
都代表一个时刻,时间轴上的一个特定点。这三个都涉及偏移量或时区。
LocalDateTime
如果您只想要一个带有时间但缺少 offset/zone 上下文的日期,则使用 LocalDateTime
。没有 Z
会出现在表示 LocalDateTime
值的文本中,因为不涉及偏移量。
请注意,LocalDateTime
对象本质上是不明确的,并不代表一个时刻。换句话说,调用 LocalDateTime.now
几乎从来都不是正确的做法。但如果你坚持:
LocalDateTime ldt = LocalDateTime.now( ZoneOffset.UTC ) ;
可以有两种方式:
- 首选方式:使用
DateTimeFormatter
- 使用
OffsetDateTime#toLocalDateTime
:这种方法的问题是如果秒部分为零,输出字符串会自动截断为分钟。
演示:
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)));
}
}
输出:
====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
小时的时区偏移)。
以下table为您提供java.time类型的概览:
如您所见,OffsetDateTime
、ZonedDateTime
等携带时区信息,您可以使用上述解决方案中提到的技术仅获取日期时间部分。