在
java.util.Date
:
* In all methods of class <code>Date</code> that accept or return
* year, month, date, hours, minutes, and seconds values, the
* following representations are used:
* <ul>
* <li>A year <i>y</i> is represented by the integer
* <i>y</i><code>-1900</code>.
当然,在 Java 1.1 中,
getYear()
方法等已被弃用,取而代之的是 java.util.Calendar
,它仍然有这个奇怪的弃用注释:
int getYear()
Deprecated. As of JDK version 1.1, replaced by Calendar.get(Calendar.YEAR) - 1900.
setYear(int year)
Deprecated. As of JDK version 1.1, replaced by Calendar.set(Calendar.YEAR, year + 1900).
当然,Month 是基于
0
的,但我们都知道(尽管你认为他们已经从 Calendar
中删除了这个问题 - 但他们没有):
* <li>A month is represented by an integer from 0 to 11; 0 is January,
* 1 is February, and so forth; thus 11 is December.
我确实检查了以下问题:
为什么Java的Date.getYear()返回111而不是2011?
为什么 Java 日期 API(java.util.Date、.Calendar)这么混乱?
我的问题是:
java.util.Date
的原创者希望通过从“年”的数据中减去1900来存储它,能得到什么?特别是如果它基本上存储为 long。因此:
private transient long fastTime;
@Deprecated
public int getYear() {
return normalize().getYear() - 1900;
}
@Deprecated
public void setYear(int year) {
getCalendarDate().setNormalizedYear(year + 1900);
}
private final BaseCalendar.Date getCalendarDate() {
if (cdate == null) {
BaseCalendar cal = getCalendarSystem(fastTime);
....
java.util.Date 根本不是日期。它是(引用http://docs.oracle.com/javase/6/docs/api/java/util/Date.html)特定的即时时间,具有毫秒精度。
与任何特定日期、时间等无关。 您可以使用给定的日历和时区从中提取日、年等。不同的日历、时区会给出不同的日期。
如果您对存储日期(日、月、年)感兴趣,请不要使用 java.util.Date
相反
遗留的日期时间类,如
Date
、Calendar
、SimpleDateFormat
等在很多方面都存在严重缺陷。您已经找到了其中一些方法。
幸运的是,“为什么”现在已经没有意义了。这些类完全被 Java 8 及更高版本中内置的现代 java.time 类所取代,如 JSR 310 中所定义。
LocalDate
java.time.LocalDate
。
java.time类使用sane编号。所以年份编号就是年份编号。对于 2025 年,请使用 2025。忘记遗留类中的“1900”混乱。
LocalDate ld = LocalDate.of( 2025 , Month.JANUARY , 23 ) ; // Year number is the year number.
或使用月份数字。再次强调,合理的编号:1 月至 12 月为 1-12,与旧课程不同。
LocalDate ld = LocalDate.of( 2025 , 1 , 23 ) ; // 1-12 for January-December.
查询年份数字。
int year = ld.getYear() ;