很多时候,我遇到有关Java Date
和其他与日期时间相关的类的负面反馈。作为.NET开发人员,我无法完全理解(不使用它们)它们到底有什么问题。
有人能对此有所启发吗?
很多时候,我遇到有关Java Date
和其他与日期时间相关的类的负面反馈。作为.NET开发人员,我无法完全理解(不使用它们)它们到底有什么问题。
有人能对此有所启发吗?
Answers:
啊,Java Date
类。最好的例子之一就是如何不以任何语言在任何地方做某事。我从哪里开始?
阅读JavaDoc可能会使人们认为开发人员实际上有了一些好主意。它接着约之间的区别UTC和GMT在长度,尽管两者之间的差别基本上是闰秒(这发生非常 罕见)。
但是,设计决定实际上是在浪费任何被认为是设计良好的API的想法。以下是一些最喜欢的错误:
null
。结果,我们有0..11(今天是109年的第11个月)。为了转换为字符串,在月份中有类似数量的++和-。Calendar
,旨在“修复”这一点,实际上使同样的错误。他们仍然是可变的。Date
代表DateTime
,但是为了顺应SQL领域的需求,还有另一个子类java.sql.Date
,代表了一天(尽管没有与之关联的时区)。TimeZone
与关联的Date
,因此范围(例如“全天”)通常表示为午夜至午夜(通常在任意时区)最后,值得注意的是,leap秒通常会在一个小时内用ntp更新的良好系统时钟进行自我校正(请参见下面的链接)。在引入两个leap跃秒(最少每六个月,实际上每隔几年)的情况下,系统仍无法正常运行的可能性,尤其是考虑到必须不时重新部署新版本的代码这一事实。即使使用重新生成类或诸如WAR引擎之类的动态语言,也会污染类空间并最终耗尽permgen。
JSR 310在Java 8 中用java.time替换了旧的日期时间类,并在原始JSR中证明了自己的理由,如下所示:
2.5建议的规范将满足Java社区的哪些需求?
当前,Java SE具有两个单独的日期和时间API-java.util.Date和java.util.Calendar。Java开发人员在Weblog和论坛上一致认为这两个API难以使用。值得注意的是,两个月都使用零索引,这是许多错误的原因。多年来,Calendar还遭受了许多错误和性能问题,这主要是由于内部以两种不同方式存储了其状态。
一个经典错误(4639407)阻止了在Calendar对象中创建某些日期。可以编写一系列代码,这些代码可以在几年内创建日期,而不能在其他年份内创建日期,从而导致某些用户无法输入正确的出生日期。这是由Calendar类引起的,夏季仅允许夏令时增加一小时,而从历史上看,第二次世界大战前后的夏令时增加了两小时。尽管此错误已得到修复,但如果将来某个时候某个国家/地区选择在夏季增加三小时的夏令时,那么Calendar类将再次被破坏。
当前的Java SE API在多线程环境中也受到影响。不可变类由于其状态无法更改而具有固有的线程安全性。但是,日期和日历都是可变的,这要求程序员明确考虑克隆和线程化。此外,DateTimeFormat中缺乏线程安全性尚未广为人知,并且已成为导致许多难以追踪线程问题的原因。
除了Java SE在日期时间上存在的类问题之外,它还没有用于建模其他概念的类。非时区日期或时间,持续时间,期间和间隔在Java SE中没有类表示形式。结果,开发人员经常使用int表示持续时间,而javadoc指定了单位。
缺乏全面的日期和时间模型也导致许多常见的操作比应有的操作更为棘手。例如,计算两个日期之间的天数是当前特别困难的问题。
该JSR将解决完整的日期和时间模型的问题,包括日期和时间(带和不带时区),持续时间和时间段,间隔,格式和解析。
我为您感到...作为前.NET程序员,我问了同样的问题,.NET中的时间API(时间跨度,运算符重载)非常方便。
首先,要创建特定日期,请使用已弃用的API,或:
Calendar c = Calendar.getInstance();
c.set(2000, 31, 12)
要减去一天,你会做一些邪恶的事情,例如
Date firstDate = ...
Calendar c = Calendar.getInstance();
c.setTime(fistDate);
c.add(Calendar.DATE,-1);
Date dayAgo = c.getTime();
或更糟
Date d = new Date();
Date d2 = new Date(d.getTime() - 1000*60*60*24);
要找出两个日期之间相隔的时间(以天/周/月为单位),情况会变得更糟
但是,来自apache()的DateUtilsorg.apache.commons.lang.time.DateUtils
提供了一些便捷的方法,最近我发现自己仅使用它们
正如Brabster所写,Joda Time也是一个很好的外部库,但是apache似乎比其他任何东西都更“普通”。