tl; dr
建议当前的“最佳做法”,Date
并Calendar
是它最好的总是青睐Calendar
过度Date
完全避免使用这些旧类。请改用java.time类。
细节
Ortomala Lokni 的Answer是正确的建议,建议使用现代的java.time类,而不是麻烦的旧旧日期时间类(Date
,Calendar
,等)。但是那个答案提示错误的类是等效的(请参阅我对该答案的评论)。
使用java.time
java.time类相对于旧的日期-时间类,昼夜差异有很大的改进。旧的类设计欠佳,令人困惑且麻烦。您应尽可能避免使用旧类。但是,当您需要与旧版本/新版本之间进行转换时,可以通过调用添加到旧版本的新方法来实现类中的。
有关转换的更多信息,请参阅我的答案和精美图表到另一个问题,将java.util.Date转换为“ java.time”类型?。
搜索堆栈溢出给出了使用java.time的数百个示例问题与解答。但这是一个简短的摘要。
Instant
使用获取当前时刻Instant
。该Instant
级表示时间轴上的时刻UTC,分辨率为纳秒(最多小数的9个位数)。
Instant instant = Instant.now();
ZonedDateTime
要通过某个特定区域的挂钟时间的镜头看到同一瞬间,请应用一个时区(ZoneId
)以获得ZonedDateTime
。
时区
指定适当的时区名称,格式continent/region
,如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用3-4字母缩写,例如EST
或,IST
因为它们不是真实的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone();
偏移量
时区是区域从UTC偏移量变化的历史。但是有时您只会得到没有完整区域的偏移量。在这种情况下,请使用OffsetDateTime
该类。
ZoneOffset offset = ZoneOffset.parse( "+05:30" );
OffsetDateTime odt = instant.atOffset( offset );
使用时区优于仅使用偏移量。
LocalDateTime
类中的“本地”是Local…
指任何地区,而不是特定的地区。因此,该名称可能违反直觉。
LocalDateTime
,,LocalDate
并且LocalTime
故意缺少有关偏移或时区的任何信息。因此,他们不能代表实际的时刻,他们是不是在时间轴上的点。如有疑问或困惑,请使用ZonedDateTime
而不是LocalDateTime
。搜索堆栈溢出以获取更多讨论。
弦乐
不要将日期时间对象与代表其值的字符串混淆。您可以解析字符串以获取日期时间对象,并且可以从日期时间对象生成字符串。但是字符串永远不是日期时间本身。
了解java.time类中默认使用的标准ISO 8601格式。
关于java.time
该java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.Date
,Calendar
,和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见 Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为 JSR 310。
使用兼容的JDBC驱动程序 JDBC 4.2或更高版本,您可以直接与数据库交换java.time对象。不需要字符串或java.sql。*类。
在哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。