问题 Java 8 Date API vs Calendar / Date / DateFormat


Java 8中有这个新的非常酷的Date API java.time包。我明白这是 更好的设计,更少的模糊和更安全的线程 比旧班。不过,我不知道如何使用它:

  • 我应该专门使用它而不是旧类吗?
  • 我应该更换旧课程的现有用法,因为新的东西要好得多吗?
  • 我应该不要使用 java.util.Calendar, java.util.Datejava.sql.Date 和 java.text.DateFormat 一起赞成新的API或是否有用例 旧班级仍然可取的地方
  • Joda Time API 由于新的Date API类似于替换而变得过时 番石榴FluentIterable 通过Java 8流API?

我知道这些是很多问题,但他们感觉彼此有些相关。如果有人可以回答整个问题,那将是非常棒的,但是也可以赞赏好的部分答案。


2952
2017-07-28 12:41


起源

你是在研究现有的代码库 - 特别是没有良好测试的代码库 - 重要的重构会引入风险吗? - Jon Skeet
我正在研究现有的代码库(没有很好的测试覆盖率)以及新项目。 - Fritz Duchardt


答案:


我应该专门使用它而不是旧类吗?

不,不需要排除旧班级。旧的java.util.Date/.Calendar工作原理相同,不变。有  已被弃用。

您可以混合和匹配所有三个框架(旧类,Joda-Time和java.time)。小心一些相同或相似的班级名称 - 注意你的 import 声明!

请参阅教程, 旧版日期时间码

而且, ThreeTen-EXTRA project扩展了带有附加功能的java.time。 “ThreeTen”指的是 JSR 310 定义java.time。

我应该更换旧课程的现有用法,因为新的东西要好得多吗?

如果旧代码按预期工作,则无需立即更改。

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

我应该避免使用java.util.Calendar,java.util.Date,java.sql.Date和java.text.DateFormat来支持新的API,还是有旧的类仍然更可取的用例?

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

新的java.time类  远远优越,这就是为什么他们被添加。它们更合乎逻辑,更易于使用。所以,是的,学习如何使用它们将是有益和愉快的。但并不紧急。在紧张的情况下,用您习惯的旧方式编写代码。当你有足够的时间学习(教程并且为了执行额外的测试,开始使用新类。

一个新手程序员当然应该把他们的学习重点放在java.time上。

由于新的Date API类似于使用Java 8流API替换Guava FluentIterable,Joda Time 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都有其他缺少的功能。所以,就个人而言,我混搭最合适。我在使用java.time时依赖Joda-Time。

计划最终转换到java.time但不急,没有恐慌。


14
2017-07-28 16:25