Java:为什么不赞成使用Date构造函数,我该使用什么呢?
|
我来自C#领域,因此对Java不太熟悉。 Eclipse告诉我,不赞成
Date
:
Person p = new Person();
p.setDateOfBirth(new Date(1985, 1, 1));
为什么?并且应该改用什么(尤其是在上述情况下)?
没有找到相关结果
已邀请:
13 个回复
嫩昧竞莫
描述不赞成使用哪些构造函数,以及如何使用
替换它们。
抢垢洛韧
类实际上并未被弃用,只是弃用了该构造函数以及其他几个构造函数/方法。不建议使用它,因为这种用法不适用于国际化。应改用
类:
看一下Javadoc的日期: http://download.oracle.com/javase/6/docs/api/java/util/Date.html
抹持奠糙驰
…要么…
细节 Java首次启动和发展时,
,
和
类赶得太快。这些类的设计或实施不正确。已尝试进行改进,因此发现了不推荐使用的地方。不幸的是,改进的尝试在很大程度上失败了。您应该完全避免这些类。在Java 8中,新类取代了它们。 代码中的问题 java.util.Date同时具有日期和时间部分。您忽略了代码中的时间部分。因此,Date类将采用JVM的默认时区定义的一天的开始,并将该时间应用于Date对象。因此,代码的结果将根据它运行的计算机或设置的时区而有所不同。可能不是您想要的。 如果只需要日期,而没有时间部分,例如出生日期,则可能不希望使用“ 0”对象。您可能只想存储日期的字符串,格式为
的ISO 8601。或使用Joda-Time提供的
对象(请参见下文)。 乔达时代 在Java中要学习的第一件事:避免与Java捆绑在一起的臭名昭著的java.util.Date和java.util.Calendar类。 正如user3277382的答案正确指出的那样,请在Java 8中使用Joda-Time或新的java.time。*包。 Joda-Time 2.3中的示例代码
转储到控制台...
运行时...
java.time 在这种情况下,java.time的代码与Joda-Time几乎相同。 我们得到一个时区(
),并构造一个分配给该时区(
)的日期时间对象。然后使用“不可变对象”模式,我们根据旧对象的同一瞬间(自纪元以来的纳秒数)创建了新的日期时间,但分配了其他时区。最后,我们得到一个
,它没有时间和时区,尽管在确定该日期时会注意到时区适用(例如,奥斯陆比纽约早到了新的一天)。
关于java.time java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧式传统日期时间类,例如
,
和
。 现在处于维护模式的Joda-Time项目建议迁移到java.time类。 要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格是JSR 310。 您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC驱动程序。不需要字符串,不需要
类。 在哪里获取java.time类? Java SE 8,Java SE 9,Java SE 10和更高版本 内置的 标准Java API的一部分,具有捆绑的实现。 Java 9添加了一些次要功能和修复。 Java SE 6和Java SE 7 很多java.time功能都在ThreeTen-Backport中反向移植到Java 6和7。 安卓系统 更高版本的Android捆绑了java.time类的实现。 对于早期的Android(<26),ThreeTenABP项目改编了ThreeTen-Backport(如上所述)。请参阅如何使用ThreeTenABP…。 ThreeTen-Extra项目使用其他类扩展了java.time。该项目是将来可能向java.time添加内容的试验场。您可能会在这里找到一些有用的类,例如
,
,
等。
剿畦缄饥小
以来的年数,因此您的示例代码很可能不会执行您期望的操作。这就是重点。 通常,“ 0” API仅支持现代西方日历,具有特殊指定的组件,并且如果您设置字段,则行为会不一致。
和
API比
好,并且通常认为第三方Joda-time API是最好的。在Java 8中,他们引入了
软件包,现在推荐使用这些软件包。
箩冀娥
类,直到Java 8出来之前都是如此。但是从Java 8开始,执行此操作的标准方法是:
然后,如果您确实确实需要
,则可以使用此问题中的建议。 有关更多信息,请查看API或Java 8教程。
碉罕城爸
是不确定的,因为日期时间部分默认为当前时间。 要重现,请尝试多次运行以下代码:
输出例如:
几分钟后运行完全相同的代码将产生:
因此,尽管
强制相应的字段更正值,但它会浪费其他字段的系统时间。 (在上面使用Sun jdk6和jdk7进行了测试)
委婪绷冗诉
本身不被弃用。这只是它的很多方法。有关详细信息,请参见此处。 改用
。
芯伶句餐绕
抵舵
慷祈霖黑
类,可以在代码中创建类似于
的方法。
就像
弃用的构造函数一样工作
部窖空
邵酮
(Java-8之前的方式)
娠侈脚惮顽
因此,对于已过时的Date构造函数使用Calendar替换(从零开始的年份,从零开始的月份,从一个开始的日子),我们需要类似以下内容:
或使用Java 1.8(具有从零开始的年份和从一开始的月份和日期):
以下是日期,日历和Java 1.8的相同版本: