我经常看到有人对Java中的Date
和其他与日期时间相关的类提出负面反馈。作为一名.NET开发人员,如果没有使用过它们,我不能完全理解它们的问题所在。
有人可以给我指点一下吗?
Date
类。也许是任何语言中最不应该这样做的最好例子之一。我应该从哪里开始?null
的13元素数组。因此,我们有0..11(今天是109年的第11个月)。有类似数量的++和-- 的操作来将其转换为字符串。Calendar
旨在“修复”这个问题,实际上犯了相同的错误。它们仍然可变。Date
表示DateTime
,但为了推迟到SQL领域中的那些人,还有另一个子类java.sql.Date
,表示单个日期(但没有与之关联的时区)。Date
没有与之关联的TimeZone
,因此范围(例如“整天”)通常表示为从午夜到午夜(通常在某个任意时区)。JSR 310,它在Java 8中用java.time替换了旧的日期时间类,其在original JSR中的自我证明如下:
2.5 提议的规范将解决Java社区的哪些需求?getMonth()
从0开始计数,getYear()
是以1900年为基础(即2009年用109来表示)。Date
类缺少你期望从中获得的许多功能。我理解你的痛苦...作为一名曾经的.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的DateUtils(org.apache.commons.lang.time.DateUtils
)提供了一些方便的方法,我最近发现自己只使用它们。
正如Brabster所说,Joda Time也是一个不错的外部库,但是Apache似乎比其他任何东西都更“常见”...