Java 8 日期 API 与日历/日期/日期格式

Java 8 Date API vs Calendar / Date / DateFormat

Java 8 中有这个新的 n-cool 日期 API,java.time package。我知道它 比旧的 类 设计得更好,更明确,线程安全性更高 。不过,我不确定如何使用它:

我知道这些问题很多,但感觉它们之间有些关联。如果有人能回答全部,那就太棒了,但也感谢部分好的回答。

Should I use it exclusively instead of the old classes?

不,不需要排除旧的 classes。旧的 java.util.Date/.Calendar 工作相同,没有变化。 没有被弃用。

您可以混合搭配所有三个框架(旧 classes、Joda-Time 和 java.time)。请注意一些相同或相似的 class 名称——注意您的 import 陈述!

参见教程,Legacy Date-Time Code

此外,定义 java.time 的 ThreeTen-Extra project extends java.time with additional features. The "ThreeTen" refers to JSR 310

Should I replace existing usages of old classes whereever I spot them because the new stuff is so much better?

如果旧代码按预期工作,那么现在无需更改。

如果您担心旧代码可能无法正确处理时区或一直想做更多的本地化,您可能想使用 java.time 重新编写它们。即便如此,请记住您可以轻松地在 j.u.Date 和 Instant 之间进行转换。因此,您可以使用 j.u.Date/.Calendar 保持业务逻辑不变,仅更改用户表示代码以使用 java.time。

Should I refrain from using java.util.Calendar, java.util.Date, java.sql.Date and java.text.DateFormat in favor of the new API all together OR are there use cases where the old classes are still preferable?

您将需要旧的 classes 来与需要旧类型的旧代码和库进行互操作。同样,旧的 classes 没有被弃用,也不会消失。考虑到它们的广泛使用和 Java 团队的首要任务是保持向后兼容性,它们可能永远不会消失。

新的 java.time classes 更优越,这就是添加它们的原因。而且它们更合乎逻辑且更易于使用。所以是的,学习如何使用它们将是有益和愉快的。但并不紧急。在紧要关头,以您习惯的旧方式编写代码。当您有时间学习 (Tutorial) 和执行额外测试时,开始使用新的 classes。

新手程序员当然应该把学习重点放在java.time。

Has the Joda Time API become obsolete thanks to the new Date API similarly to the substitution of Guava FluentIterable by Java 8 stream API?

Joda-Time 是 java.time 的灵​​感来源。同一个人发明了两者。他们打算 java.time 成为他们对 Joda-Time 的“2.0”重新发明,如果他们知道他们现在所知道的,他们当时会做什么。他们说 Joda-Time 用户应该过渡到 java.time。

也就是说,Joda-Time 不会消失。它仍在工作中,仍在更新错误修复和新的 tz 时区数据。对于没有其他像样的日期时间库(据我所知)的大型 Android 社区,它 非常 重要。因此,您可以继续依赖 Joda-Time,不必迫切需要删除旧代码,但不会期望有新功能或增强功能。

Joda-Time 已经过时并经过验证,而 java.time 有一些小错误和问题需要解决。 Joda-Time 和 java.time 各有各的特点。所以就个人而言,我混合搭配以达到最佳效果。我依赖 Joda-Time,同时涉足 java.time。

计划最终过渡到 java.time,但不要急于求成。