在 Java 中获取当前日期/时间的最佳方法是什么?
这取决于您想要什么形式的日期/时间:
如果您希望将日期/时间作为单个数值,则System.currentTimeMillis()给您它,表示为 UNIX 纪元之后的毫秒数(作为 Java long)。此值是 UTC 时间点的增量,与本地时区1无关。
System.currentTimeMillis()
long
如果您希望日期/时间的形式允许您以数字方式访问组件(年、月等),则可以使用以下方法之一:
new Date()给你一个Date用当前日期/时间初始化的对象。问题在于DateAPI 方法大多存在缺陷......并且已被弃用。
new Date()
Date
Calendar.getInstance()为您提供一个Calendar使用当前日期/时间初始化的对象,使用默认值Locale和TimeZone. 其他重载允许您使用特定的Locale和/或TimeZone. 日历工作......但 API 仍然很麻烦。
Calendar.getInstance()
Calendar
Locale
TimeZone
new org.joda.time.DateTime()使用默认时区和年表,为您提供使用当前日期/时间初始化的Joda-time对象。还有很多其他的 Joda 替代品……这里无法描述。(但请注意,有些人报告说 Joda 时间存在性能问题。;例如https://stackoverflow.com/questions/6280829。)
new org.joda.time.DateTime()
在 Java 8 中,调用java.time.LocalDateTime.now()并将java.time.ZonedDateTime.now()为您提供当前日期/时间的表示2。
java.time.LocalDateTime.now()
java.time.ZonedDateTime.now()
在 Java 8 之前,大多数了解这些事情的人都建议Joda-time拥有(迄今为止)最好的 Java API,用于处理涉及时间点和持续时间计算的事情。
对于 Java 8 及更高版本,java.time建议使用标准包。Joda 时间现在被认为是“过时的”,Joda 维护人员建议人们迁移。3 .
java.time
1 -System.currentTimeMillis()给出“系统”时间。虽然将系统时钟设置为(标称)UTC 是正常做法,但本地 UTC 时钟和真正的 UTC 之间会有差异(增量)。增量的大小取决于系统时钟与 UTC 同步的程度(以及频率)。 2 - 请注意,LocalDateTime 不包括时区。正如 javadoc 所说: “如果没有偏移或时区等附加信息,它就不能代表时间线上的瞬间。” 3 - 注意:如果您不迁移,您的 Java 8 代码不会中断,但 Joda 代码库最终可能会停止获取错误修复和其他补丁。截至 2020 年 2 月,Joda 的官方“生命终结”尚未宣布,Joda API 也未标记为已弃用。