关于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能够做到如此出色的事实是其开发人员的真实荣誉。要回答您的问题,尽管我自己从未玩过它,但除了该库的其他方面,我什么都没有听到。


    推荐阅读

      linux操作数据库命令?

      linux操作数据库命令?,地址,服务,系统,密码,数据库,工具,名字,首页,命令,参

      linux系命令的操作?

      linux系命令的操作?,工作,系统,信息,网络,命令,基础,简介,管理,目录,操作,lin

      linux操作常用命令?

      linux操作常用命令?,工作,系统,地址,信息,命令,目录,管理,标准,基础,工具,lin

      linux操作命令重命名?

      linux操作命令重命名?,图片,软件,名称,名字,文件,命令,状态,代码,工具,系统,L

      linux目录操作命令d?

      linux目录操作命令d?,工作,系统,信息,命令,情况,基础,数据,名称,地址,目录,li

      linux初学者操作命令?

      linux初学者操作命令?,工作,系统,信息,命令,网络,地址,单位,位置,管理,数据,L

      linux操作命令远程?

      linux操作命令远程?,软件,密码,系统,名称,图片,电脑,地址,网站,工具,服务,如

      linux操作命令实验一?

      linux操作命令实验一?,系统,基础,设备,西安,概念,软件,电脑,技术,管理,分析,

      linux里的操作命令?

      linux里的操作命令?,工作,系统,信息,地址,命令,标准,位置,目录,功能,操作,lin

      linux分辨率操作命令?

      linux分辨率操作命令?,系统,情况,分辨率,底部,状态,命令,屏幕,屏幕分辨率,

      linux命令行操作软件?

      linux命令行操作软件?,软件,工具,系统,名称,管理,工作,命令,设计,平台,标准,

      linux常见操作命令?

      linux常见操作命令?,系统,工作,信息,管理,地址,命令,目录,单位,数据,标准,lin

      红帽子linux操作命令?

      红帽子linux操作命令?,服务,系统,密码,环境,信息,通用,软件,状态,设备,命令,

      红帽子linux操作命令?

      红帽子linux操作命令?,服务,系统,密码,环境,信息,通用,软件,状态,设备,命令,

      linux中日期相关命令?

      linux中日期相关命令?,时间,系统,信息,命令,代码,服务,工作,工具,终端,时分,l

      linux日常操作命令?

      linux日常操作命令?,工作,系统,地址,信息,命令,目录,基础,管理,操作,功能,lin

      linux设日期时间命令?

      linux设日期时间命令?,时间,系统,命令,国家,环境,数据,电脑,标准,信息,大陆,l

      linux使用命令的方法?

      linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,

      go操作linux命令?

      go操作linux命令?,系统,工具,环境,软件,标准,网上,最新,信息,设备,电脑,Linux

      linux命令操作vim?

      linux命令操作vim?,系统,地址,工作,命令,模式,标准,信息,入口,连续,时间,Linu