Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么是;新日期(整年、整月、整日)“;不赞成?_Java_Date_Deprecated - Fatal编程技术网

Java 为什么是;新日期(整年、整月、整日)“;不赞成?

Java 为什么是;新日期(整年、整月、整日)“;不赞成?,java,date,deprecated,Java,Date,Deprecated,我最近继承的应用程序中充满了有关构造函数的弃用警告: Date d = new Date(int year, int month, int day) 有人知道或能指出这样简单的东西被这样的东西“取代”的原因吗 Date d = null; Calendar cal = GregorianCalendar.getInstance(); cal.set(1900 + year, month, day); d = cal.getTime(); 现在,显然,弃用警告本身并不是问题,但是你能想象如果这

我最近继承的应用程序中充满了有关构造函数的弃用警告:

Date d = new Date(int year, int month, int day)
有人知道或能指出这样简单的东西被这样的东西“取代”的原因吗

Date d = null;
Calendar cal = GregorianCalendar.getInstance();
cal.set(1900 + year, month, day);
d = cal.getTime();
现在,显然,弃用警告本身并不是问题,但是你能想象如果这个构造函数被移除,数百万LOC将痛苦地呼喊吗


在我关于基准测试的简短讨论中,后者的执行时间增加了约50%。

答案是可移植性

Date
不是很灵活。您可以定义日期,但不能转换为其他日历格式。因此Sun决定使用一个额外的类层次结构(
Calendar
),使其更加灵活


尽管如此,它并不十分方便。

Java日期API长期以来一直受到批评,例如,请参阅


您可能希望签出或查找其他日期/时间实用程序。

主要是因为原始java.util.Date过于臃肿,不完全支持时区,也不支持国际化

然而,Date仍然在使用中,并且在值对象中,或者说作为一种数据类型。只要显式地使其不可变,就可以轻松地进行。我倾向于认为它必须是不变的,因为我们有日历可以操纵。在预期操纵的情况下,人们应该考虑一些类似于JoDA时间的问题。 [编辑]


只是不要在后面的代码中实例化日期。这没有用。您可以为您的基准测试获得更好的结果。

最初,
Date
旨在包含所有与日期有关的逻辑,但API设计者最终意识到,他们迄今为止使用的API严重不足,无法完全扩展以正确处理时区、地区、不同日历等问题,夏令时等

因此,他们创建了
Calendar
来处理所有这些复杂性,并将
Date
降级为一个简单的时间戳,取消了它处理格式化、解析和单个日期字段的所有功能

顺便说一句,在内部,这些方法,例如
Date(int,int,int)
构造函数现在调用
Calendar
,因此如果您看到速度上的差异,那么在调用
Calendar
时,您就犯了错误


底线:不是Java的
Calendar
API过于复杂,而是人类对日期的概念,
Calendar
的唯一问题是,它没有为最常见的用法提供多少快捷方式。

当然,没有人使用任何其他日历格式,但是新的API增加了99%常见情况下需要编写的代码量,因此这对LoC付费的Java程序员来说是一个巨大的福音。

从技术上讲,Michael Borgwardt给出了最好的答案。 但他为什么要把我们太阳系的布局方式归咎于人类呢

好的,我们想出了秒、分、小时的概念

但地球日是近似的并不是我们的错(取决于我们所说的是真正的太阳日、平均太阳日还是恒星日,每一天都是周期性和随机变化的)。地球绕太阳公转的时间大约是365天,这不是我们的错,月球绕地球公转的时间大约是27.3天,这也不是我们的错(取决于我们谈论的是恒星月、同向月、热带月、不规则月还是龙月)


日历没有考虑到所有这些细节,你不高兴吗?那么我们的软件缺陷可能确实取决于月球的相位。

第一行不是完全浪费时间吗?您从cal to Calendar.getTime()中获得了一个日期,那么为什么要使用新的Date()调用创建一个日期,然后将其丢弃呢?特别是如果你在测试这个…@放松:一个好的捕获。为什么不呢,发个帖子吧。也许是因为美国人在期待日期(整数年,整数日,整数月);-)“LOC”是什么意思?请查看Java8新日期api!哈,在今天这个时代,LoC肯定没有被用作生产力的衡量标准?人们希望不会,但也许Sun公司一直在生产这样的API的家伙们没有听说事情发生了变化……我真的记得不久前在Parleys上观看了Joda的一场演示,并对之印象深刻。至于追溯到1000秒的100秒或LOC的实现,我不太确定。说得好。JoDa时间后来被用作发展的基础。也是从Java8内置的。这是我建议大家现在都使用的。舰长又一次明显的攻击了!无需复制,只需指向
java.util.Date
重新使用公历的静态实例。至少可以说这很有趣。但性能会比为每个循环创建新日历更好。