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