java - 我们如何决定是使用 ZonedDateTime 还是 LocalDateTime?
问题描述
有时,当我们想解决某些日期/时间问题时,我们很难判断是否使用ZonedDateTime
或。LocalDateTime
例如,给定一个纪元,我们想知道星期几。
ZonedDateTime
我们发现我们可以使用或来完成这项任务LocalDateTime
。这是代码示例
import java.time.*;
public class Main {
public static void main(String[] args) {
long currentTimeMillis = System.currentTimeMillis();
// Yield correct result.
System.out.println("useLocalDateTime -> " + useLocalDateTime(currentTimeMillis));
// Also yield correct result.
System.out.println("useZonedDateTime -> " + useZonedDateTime(currentTimeMillis));
}
public static DayOfWeek useLocalDateTime(long currentTimeMillis) {
LocalDateTime localDateTime = LocalDateTime.ofInstant(
Instant.ofEpochMilli(currentTimeMillis),
ZoneId.systemDefault()
);
DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();
return dayOfWeek;
}
public static DayOfWeek useZonedDateTime(long currentTimeMillis) {
ZonedDateTime zonedDateTime = Instant.ofEpochMilli(currentTimeMillis).atZone(ZoneId.systemDefault());
DayOfWeek dayOfWeek = zonedDateTime.getDayOfWeek();
return dayOfWeek;
}
}
在上述情况下,使用ZonedDateTime
or更好LocalDateTime
?是否有任何指导方针,以便我们可以选择正确的类作为工具?
我总觉得ZonedDateTime
比LocalDateTime
. 能做到的事LocalDateTime
,也能做到ZonedDateTime
,反之不行。因此,如果我坚持选择哪个,我会ZonedDateTime
默认选择。这是一个正确的概念吗?
解决方案
而不是使用System.currentTimeMillis()
useZonedDateTime.now(ZoneId)
或Instant.now()
. currentTimeMillis()
在现代 Java 中你几乎不需要。在整个应用程序中使用专用java.time
API,这样您就可以使用类型良好的数据结构,而不是像long currentTimeMillis
.
给定一个纪元,我们想知道星期几
值得承认的是,如果没有时区,这不是一个有意义的问题。在任何时候,地球上不同的地方都有两天(或更多?)天。所以在我们走得更远之前,我们需要问一下你关心哪个时区?
一般来说,systemDefault()
时区不是你想要的。相反,调用者应该提供他们期望的时区。如果您的程序在本地运行并且只需要您机器的时钟,那可能没问题,但是在LocalDateTime
和之间拆分的真正原因ZonedDateTime
是因为系统通常不是要使用的正确时区。
对于琐碎的情况,例如在本地计算机上运行的 Java 进程不关心时区随时间的变化,您可能会正确使用系统时区。但在这种情况下,最好在您的main()
方法附近查询系统,然后将该区域传递给您的应用程序。如果系统区域不再是正确的方法,这将使应用程序更具可扩展性和可测试性。
推荐阅读
- javascript - 如何在 document.ready 之前隐藏元素?
- php - 防止密码重置时更改电子邮件laravel 5.7
- angular - 在Angular的网页上单击外部时如何折叠展开的下拉菜单?
- excel - 在“DoEvents”期间将用户踢出单元格
- elasticsearch - elasticsearch嵌套查询,多一个对象应满足条件
- ios - IONIC白屏问题与初始屏幕挂起第一次加载(iOS - ionic3)
- reactjs - 如何将 firestoreConnect 指向 React-Redux-Firebase 中的嵌套集合?
- woocommerce - 在“订单编辑页面”上添加自定义字段,在 woocommerce 中显示“总节省”
- flutter - 颤振:英语不适用于阿拉伯字体
- rust - 如果迭代器中的每个值都为真,我如何定义一个返回真的函数?