Java日期和日历

时间:2018-10-17 15:31:33

标签: java date

我知道Java 8具有基于Joda Time的改进的日期和时间库,但是我对旧库中的决策感到非常好奇。我没有找到有关java.util.Date构造函数弃用基本原理的任何很好的解释(我发现的最接近的问题是:Difference between new Date() and Calendar date,但它没有询问过时的方法/构造函数,并且没有可接受的答案)。

构造函数java.util.Date(年,月,日)被认为已弃用,我们应该使用新的GregorianCalendar(年+ 1900,月,日)。如果我们在Calendar实例上调用getTime()(返回Date ...),除了避免使用不推荐使用的构造方法外,我们获得了什么?甚至java.sql.Date.toLocalDate在内部也使用了一些不赞成使用的方法。

我的代码库中充斥着这种模式(新的GregorianCalendar后跟getTime)只是为了避免过时的java.util.Date方法(我需要JPA和JDBC中的java.util.Date和java.sql.Date),但我不确定当时的意义是什么(*)。

(*)如今,我终于可以将它们全部更改为LocalDate了,因为无论如何,这就是我真正需要的-保存用户键入的内容而无需任何时区转换。

2 个答案:

答案 0 :(得分:3)

请参见java.util.Date的javadoc中的第二段:

  

在JDK 1.1之前,类Date具有两个附加功能。它允许将日期解释为年,月,日,小时,分钟和秒值。它还允许格式化和解析日期字符串。不幸的是,这些功能的API 不适合国际化。从JDK 1.1开始,应使用Calendar类在日期和时间字段之间进行转换,而应使用DateFormat类来格式化和解析日期字符串。 Date中的相应方法已弃用。

因此,要回答您的问题“我们获得了什么?”,答案是“支持国际化”:

  • 能够指定时区(使用Calendar)。

  • 使用非格里高里历的能力(使用Calendar)。

  • 能够使用日期字符串的本地化格式和解析(使用DateFormat)。

答案 1 :(得分:1)

旧图书馆允许传入年,月,日等物品,从而根据阳历中的条目构造java.util.Date物品。

由于许多原因,这是有问题的。首先,公历系统是从儒略历系统过渡而来的混合日历系统。这种过渡包括需要“跳过”日期以使儒略历系统与季节重新对齐。因此,还有很多日子。令人惊讶的是,java.util.Date在捕获此行为方面做得不错,

  • 要跳过的日期取决于采用过渡的时间,大多数情况下映射日期取决于语言环境。
  • 与核心java.util.Date对象的格里高利日历的牢固绑定意味着实现其他日历系统是有问题的,因为您需要在格里高利系统之上实现它们。
  • 将日期与Locale和TimeZone绑定在一起还意味着您必须调整平台的Locale和TimeZone才能获得所需的适当的Date行为,并且经常将其调回以用于非本地日期计算。

新的日历系统尝试通过以下方式避免这种情况:

  • 具有一个在字段中传递以设置值的API,可防止日历字段直接绑定到API方法。
  • 具有允许子类化日历的API,这样人们就可以实现具有不同定义的月,日和年的日历(例如阴历,犹太历,阿拉伯历,中国历等)。

展望未来,人们仅应将java.util.Date用作时间戳的薄包装,而更多的是与旧API兼容。所有Date操作都应在适当的Calendar实例中完成。