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

问题描述 投票:0回答:3

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);
    ....
  • 为什么1900
java date offset java.util.date
3个回答
14
投票

基本上,最初的 java.util.Date 设计者从 C 中复制了很多内容。您所看到的就是结果 - 请参阅

tm
结构。所以你可能应该问为什么要设计为使用 1900 年。我怀疑根本的答案是“因为当设计
tm
时,我们不太擅长 API 设计。”我认为,在涉及日期和时间时,我们仍然不太擅长 API 设计,因为有很多不同的用例。

这只是API,而不是内部的存储格式

java.util.Date
。请注意,同样烦人。


2
投票

java.util.Date 根本不是日期。它是(引用http://docs.oracle.com/javase/6/docs/api/java/util/Date.html特定的即时时间,具有毫秒精度

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

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

相反


0
投票

避免遗留日期时间类

遗留的日期时间类,如

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() ;
© www.soinside.com 2019 - 2024. All rights reserved.