为什么java.util.Date将Year表示为" year-1900"?

时间:2014-10-08 11:20:04

标签: java date offset java.util.date

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).

当然,月份是基于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.

我确实检查了以下问题:

Why does Java's Date.getYear() return 111 instead of 2011?

Why is the Java date API (java.util.Date, .Calendar) such a mess?

我的问题是:

  • java.util.Date的原始创作者希望通过从中减去1900来存储“年份”的数据,从而获得什么?特别是如果它基本上存储为长。

因此:

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);
    ....
  • 为什么 1900

2 个答案:

答案 0 :(得分:10)

基本上原始的java.util.Date设计师从C中复制了很多东西。你看到的是结果 - 见tm struct。所以你应该问为什么那个设计用于1900年。我怀疑基本答案是#34;因为我们在设计tm时并不擅长API设计。&#34 ;我认为,当涉及到日期和时间时,我们仍然

这只是API,而不是java.util.Date中的存储格式。请注意,同样烦人。

答案 1 :(得分:3)

java.util.Date根本没有日期。它是(引用http://docs.oracle.com/javase/6/docs/api/java/util/Date.html特定时刻,精确到毫秒级

与任何特定日期,小时等无关。 您可以使用给定的日历和时区从中提取日,年等。不同的日历,时区会给出不同的日期。

如果您对存储日期(日,月,年)感兴趣,请不要使用java.util.Date

相反