我经常遇到关于 Java 的负面反馈Date
以及其他与日期时间相关的课程。作为一名 .NET 开发人员,我无法完全(没有使用过它们)理解它们到底出了什么问题。
有人能解释一下吗?
啊,爪哇Date
班级。也许这是如何不在任何地方用任何语言做某事的最好例子之一。我从哪开始呢?
阅读 JavaDoc 可能会让人认为开发人员实际上已经有了一些好主意。它继续关于之间的区别UTC http://en.wikipedia.org/wiki/Coordinated_Universal_Time and GMT http://en.wikipedia.org/wiki/Greenwich_Mean_Time最后,尽管两者之间的差异基本上是闰秒(发生这种情况)pretty http://alblue.blogspot.com/2008/12/109876543211happy-new-year.html rarely http://alblue.blogspot.com/2005/12/have-one-new-year-get-second-free.html).
然而,这些设计决策确实浪费了任何设计良好的 API 的想法。以下是一些最常见的错误:
- 尽管是在本世纪的最后十年设计的,但自 1900 年以来,它的年份都是两位数。由于这个平庸的决定,Java 世界中实际上有数百万个解决方法在执行 1900+(或 1900-)。
- 月份的索引为零,以适应具有月份数组且不使用十三个元素的数组(其中第一个包含
null
。结果,我们有 0..11(今天是 109 年的第 11 个月)。还有类似的多个 ++ 和 -- 就可以转换为字符串。
- They're mutable https://stackoverflow.com/q/279507/1429387。因此,任何时候您想要返回日期(例如,作为实例结构),您都需要返回该日期的克隆,而不是日期对象本身(因为否则,人们可以改变您的结构)。
- The
Calendar
旨在“解决”此问题的公司实际上犯了同样的错误。它们仍然是可变的。
-
Date
代表一个DateTime
,但为了遵循 SQL 领域的要求,还有另一个子类java.sql.Date
,它代表一天(尽管没有与之关联的时区)。
- 没有
TimeZone
s 与 a 相关联Date
,因此范围(例如“一整天”)通常表示为午夜到午夜(通常在某个任意时区)
最后,值得注意的是,闰秒通常会根据一个小时内通过 ntp 更新的良好系统时钟进行自我校正(请参阅上面的链接)。在引入两个闰秒(至少每六个月,实际上每几年)的情况下,系统仍然正常运行的机会几乎是不可能的,特别是考虑到您必须不时重新部署新版本的代码这一事实。即使使用重新生成类的动态语言或诸如 WAR 引擎之类的东西也会污染类空间并最终耗尽 permgen。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)