在Java中操作日期和时间戳的最佳方法是什么?

Joe*_*ean 15 java datetime

每次我需要使用Java中的日期和/或时间戳时,我总觉得我做错了什么并花费无数个小时试图找到一种更好的API工作方式,而无需编写我自己的日期和时间实用程序类.这是我遇到的一些烦人的事情:

  • 基于0的月份.我意识到最好的做法是使用Calendar.SEPTEMBER而不是8,但令人讨厌的是8代表9月而不是8月.

  • 获取没有时间戳的日期.我总是需要将日期的时间戳部分归零的实用程序.

  • 我知道我过去还有其他问题,但不记得了.随意在您的回复中添加更多内容.

所以,我的问题是......你使用什么第三方API来简化Java对日期和时间操作的使用,如果有的话?有关使用Joda的任何想法?有人仔细观察JSR-310 Date and Time API吗?

Ric*_*ams 10

这篇文章对比较Java Date/Time API和JODA进行了很好的讨论.

我个人只需要使用Gregorian CalendarSimpleDateFormat,我需要在Java中操作日期/时间.我从来没有在使用Java API时遇到任何问题,并且发现它很容易使用,因此没有真正研究过任何替代方案.


Bas*_*que 7

java.time

Java 8及更高版本现在包含java.time框架.受JSR 310定义的Joda-Time的启发,由ThreeTen-Extra项目扩展.请参阅教程.

该框架取代了旧的java.util.Date/.Calendar类.转换方法允许您来回转换以使用尚未针对java.time类型更新的旧代码.

核心课程是:

该框架解决了您列出的几个问题.

基于0的月份

java.time中的月号为1-12.

更好的是,a Enum(Month)为一年中的每个月提供一个对象实例.因此,您无需依赖代码中的"魔术"数字,如910.

if ( theMonth.equals ( Month.OCTOBER ) ) {  …
Run Code Online (Sandbox Code Playgroud)

此外,该枚举包括一些方便的实用程序方法,如获取一个月的本地化名称.

如果还不熟悉Java枚举,请阅读教程并进行学习.它们出奇地方便且功能强大.

没有时间的约会

LocalDate级表示日期,只值,没有时间的天,没有时区.

LocalDate localDate = LocalDate.parse( "2015-01-02" );
Run Code Online (Sandbox Code Playgroud)

请注意,确定日期需要时区.新的一天在巴黎早些时候比蒙特利尔还要早,那里仍然是"昨天".本ZoneId类代表一个时区.

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
Run Code Online (Sandbox Code Playgroud)

同样,还有一个LocalTime班级,其中一个时间段尚未与日期或时区相关联.


关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

现在处于维护模式Joda-Time项目建议迁移到java.time类.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.