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

What's the best way to manipulate Dates and Timestamps in Java?

每次我需要使用Java中的日期和/或时标时,我总是觉得自己做错了事,花了无尽的时间试图找到使用API??的更好方法,而不必编写自己的Date和时间实用程序类。这是我刚遇到的一些烦人的事情:

  • 从0开始的月份。我意识到最佳实践是使用Calendar.SEPTEMBER而不是8,但是令人讨厌的是8代表9月而不是8月。

  • 获取没有时间戳的日期。我始终需要将日期的时间戳部分清零的实用程序。

  • 我知道过去还有其他问题,但不记得了。随时在响应中添加更多内容。

因此,我的问题是...您使用什么第三方API来简化Java对Date and Time操作的使用(如果有)?对使用Joda有任何想法吗?任何人都仔细看过JSR-310日期和时间API?


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

我个人只要需要在Java中操作日期/时间,就可以使用Gregorian Calendar和SimpleDateFormat。我在使用Java API方面从未遇到任何问题,并且发现它非常易于使用,因此没有真正研究任何替代方法。


java.time

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

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

Table9或10

1
if ( theMonth.equals ( Month.OCTOBER ) ) {  a€|

此外,该枚举还包含一些便捷的实用方法,例如获取一个月的本地化名称。

如果您还不熟悉Java枚举,请阅读该教程并继续学习。它们出奇的方便和强大。

没有时间的date

LocalDate类表示仅日期的值,没有日期,没有时区。

1
LocalDate localDate = LocalDate.parse("2015-01-02" );

请注意,确定日期需要一个时区。巴黎比蒙塔尔(Monter)的新天还早,那里仍然是"昨天"。 ZoneId类表示时区。

1
LocalDate today = LocalDate.now( ZoneId.of("America/Montreal" ) );

类似地,有一个LocalTime类用于一天中尚未绑定到日期或时区的时间。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧版旧式日期时间类,例如java.util.DateCalendar


Apache Commons Lang项目具有一个DateUtils类,该类执行有用的Date操作。

我经常使用DateUtils.truncate(),这将为您"日期"部分"清零"(如果您希望Date对象表示一个日期而不包含任何时间信息,这将很有帮助)。每种方法都适用于DateCalendar对象。

http://commons.apache.org/lang/


我已经专门使用Joda三年了,肯定会推荐它-它的整个区域都覆盖有一个"按其说的做"的界面。

Joda在您启动时可能看起来很复杂,例如它具有周期,持续时间和间隔的概念,看起来很相似,但是您可以简单地通过将org.joda.time.DateTime(或org.joda.time.DateMidnight)替换为java.util.Date来开始。您的代码,并在理解其他区域之前坚持使用这些类包含的许多有用方法。


使用Java总是能让我受益的是日期时间库。我从来没有使用过Joda,只是简要地看过它,看起来像是一个不错的实现,如果我正确地理解JSR-130,它会从Joda那里获取知识并将其最终包含在JavaSE中。

对于过去的项目,我经常包装Java日期时间对象,这本身就是一项任务。然后使用包装器进行日期处理。


与javascript中的相同。当有人认为吸烟是个好主意时,让2008表示2008年,即31表示该月的第31天,这是一个好主意,而且-这是最好的部分-11表示第12个月。

另一方面,他们三分之二做到了。


我正在使用GregorianCalendar-始终无处不在。简单的java.util.Date太复杂了。

所以,我的建议是-使用GC,它很简单


编写您自己的日期API非常简单,它位于原始Java类Date和Calendar之上。基本上,日期和日历都遭受以下事实的困扰:它们试图将两个概念塞入一个类:

  • 日期(即年月日)
  • 即时(即currentTimeMillis)
  • 理解了这一点,它将彻底改变您在代码中处理类似日期的概念的方式。事情将变得更简单,更清晰,更好。在任何意义上!

    对我而言,Joda过于复杂,至少出于绝大多数目的,我尤其不喜欢它们违反标准Java格式的事实,其中一个例子就是它们如何解析和格式化日期。 JODA的负责人Stephen Colebourne是JSR-310的规范负责人,这也遇到了相同的问题,恕我直言(在过去的几年中,我一直关注并为讨论做出了贡献)。

    自己动手做;这很容易。只需填写以下类:MyDate(包装年月日),Month(一个枚举),TimeOfDay(小时-分钟-秒-毫秒),DayOfWeek(枚举),Instant(包装一个长整数)。在"即时"和"日期"之间进行转换时,请始终考虑时区。

    如果这看起来令人生畏,则可以在后台使用Calendar和SimpleDateFormat。您将在一天内完成此操作,永远不会后悔。


    许多程序员从使用Date开始,它具有许多不赞成使用的重载构造函数(使其很难使用),但是一旦弄清楚了GregorianCalendar,它就会变得更易于管理。这里的示例非常有帮助:

    http://java.sun.com/j2se/1.4.2/docs/api/java/util/GregorianCalendar.html


    日期API很难设计,尤其是在必须处理本地化的情况下。尝试自己动手,看看,值得至少做一次。 Joda能够做到如此出色的事实是其开发人员的真实荣誉。要回答您的问题,尽管我自己从未玩过它,但除了该库的其他方面,我什么都没有听到。


    推荐阅读