每次我需要使用Java中的日期和/或时间戳时,我总觉得我做错了什么并花费无数个小时试图找到一种更好的API工作方式,而无需编写我自己的日期和时间实用程序类.这是我遇到的一些烦人的事情:
基于0的月份.我意识到最好的做法是使用Calendar.SEPTEMBER而不是8,但令人讨厌的是8代表9月而不是8月.
获取没有时间戳的日期.我总是需要将日期的时间戳部分归零的实用程序.
我知道我过去还有其他问题,但不记得了.随意在您的回复中添加更多内容.
所以,我的问题是......你使用什么第三方API来简化Java对日期和时间操作的使用,如果有的话?有关使用Joda的任何想法?有人仔细观察JSR-310 Date and Time API吗?
这篇文章对比较Java Date/Time API和JODA进行了很好的讨论.
我个人只需要使用Gregorian Calendar和SimpleDateFormat,我需要在Java中操作日期/时间.我从来没有在使用Java API时遇到任何问题,并且发现它很容易使用,因此没有真正研究过任何替代方案.
Java 8及更高版本现在包含java.time框架.受JSR 310定义的Joda-Time的启发,由ThreeTen-Extra项目扩展.请参阅教程.
该框架取代了旧的java.util.Date/.Calendar类.转换方法允许您来回转换以使用尚未针对java.time类型更新的旧代码.
核心课程是:
Instant
时间轴上的一个时刻,始终是UTC.
ZoneId
一个时区.子类ZoneOffset
包括UTC的常量.
ZonedDateTime
= Instant
+ ZoneId
表示调整到特定时区的时间轴上的时刻.
该框架解决了您列出的几个问题.
java.time中的月号为1-12.
更好的是,a Enum
(Month
)为一年中的每个月提供一个对象实例.因此,您无需依赖代码中的"魔术"数字,如9
或10
.
if ( theMonth.equals ( Month.OCTOBER ) ) { …
此外,该枚举包括一些方便的实用程序方法,如获取一个月的本地化名称.
如果还不熟悉Java枚举,请阅读教程并进行学习.它们出奇地方便且功能强大.
该LocalDate
级表示日期,只值,没有时间的天,没有时区.
LocalDate localDate = LocalDate.parse( "2015-01-02" );
请注意,确定日期需要时区.新的一天在巴黎早些时候比蒙特利尔还要早,那里仍然是"昨天".本ZoneId
类代表一个时区.
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
同样,还有一个LocalTime
班级,其中一个时间段尚未与日期或时区相关联.
该java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date
,Calendar
,和SimpleDateFormat
.
现在处于维护模式的Joda-Time项目建议迁移到java.time类.
要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.
从哪里获取java.time类?
Java SE 8, Java SE 9及更高版本
内置.
带有捆绑实现的标准Java API的一部分.
Java 9增加了一些小功能和修复.
Java SE 6和 Java SE 7
许多java.time功能都被反向移植到ThreeTen-Backport中的 Java 6和7 .
Android的
所述ThreeTenABP项目适应ThreeTen-反向移植为Android(上面提到的)特异性.
请参阅如何使用ThreeTenABP ....
该ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval
,YearWeek
,YearQuarter
,和更多.