用Java处理日期和时间戳的最佳方法是什么?

时间:2020-03-05 19:00:03  来源:igfitidea点击:

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

  • 从0开始的月份。我意识到最佳实践是使用Calendar.SEPTEMBER而不是8,但是令人讨厌的是8代表9月而不是8月。
  • 获取没有时间戳的日期。我始终需要将日期的时间戳部分清零的实用程序。
  • 我知道过去还有其他问题,但不记得了。随时在回复中添加更多内容。

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

解决方案

回答

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

回答

我随时随地都在使用GregorianCalendar。简单的java.util.Date太复杂了。

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

回答

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

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

回答

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

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

回答

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

另一方面,他们在三分之二的问题上做到了正确。

回答

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

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

回答

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

  • 日期(即年月日)
  • 即时(即currentTimeMillis)

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

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

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

如果这看起来令人生畏,则可以在后台使用Calendar和SimpleDateFormat。我们将在一天之内做到这一点,永远不会后悔。

回答

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

我经常使用DateUtils.truncate(),它将为我们"清除"日期的某些部分(如果我们希望Date对象表示一个日期而不包含任何时间信息,则很有用)。每种方法都适用于"日期"和"日历"对象。

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

回答

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

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