Вопрос по offset, date, java.util.date, java – Почему java.util.Date представляет Год как «1900 год»?

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.1getYear() метод и тому подобное устарели в пользу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.

Я проверил следующие вопросы:

Почему Java Date.getYear () возвращает 111 вместо 2011?

Почему API даты Java (java.util.Date, .Calendar) такой беспорядок?

Мой вопрос:

Что возможно могли бы иметь первоначальные создатели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?
До 2000 года расчет с 1900 года был удобен для отображения двухзначных лет. Использование двухзначных лет также очень положительно сказалось на рынке ИТ-вакансий в 1999 году. Erich Kitzmueller
java.util.Date была неудачной работой. (Именно поэтому в Java сейчас так много разных схем дат.) В частности, 1900 год традиционно был началом времени для компьютерных дат, поскольку до 2000 года год можно было представить в виде двухзначной цифры на перфокарте (и ничего важного не произошло до 1900 г.) Hot Licks
Расчет с 1900 года - это длинный стандарт Си из области Unix. И поскольку размеры слова были как 16 битов, они взяли раунд, но все еще исторически недавний гнев. Конечно, благодаря Joda, теперь в java 8, все исправлено в новых классах java.time, месяцы с 1 по 12 и так далее. Joop Eggen

Ваш Ответ

2   ответа
3

java.util.Date вообще не дата. Это (цитируяhttp://docs.oracle.com/javase/6/docs/api/java/util/Date.html) конкретный момент времени с точностью до миллисекунды.

Он не имеет отношения к какой-либо конкретной дате, часу и т. Д. Вы можете извлечь из него день, год и т. Д., Используя заданный календарь и часовой пояс. Разные календари, часовые пояса будут давать разные даты.

Если вы когда-либо заинтересованы в сохранении даты (день, месяц, год), не используйте java.util.Date

Вместо

org.joda.time.DateTime fromhttp://www.joda.org/joda-time/если вы на java8, используйте пакет java.timehttp://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html
Я думаю, что это не ответ на вопрос 1900 года. Meno Hochschild
10

В основном, оригинальные java.util.Date дизайнеры скопировали много с C. То, что вы видите, является результатом этого - см.tm структура, Так что вы, вероятно, должны спросить, почему он был разработан для использования в 1900 году. Я подозреваю, что основной ответ - «потому что мы не очень хорошо разбирались в разработке API, когдаtm был разработан. "Я бы сказал, что мыеще не очень хорош в дизайне API, когда дело касается дат и времени, потому что есть очень много разных вариантов использования.

Это только API, а не формат хранения внутриjava.util.Date, Не менее раздражает, заметьте.

Похожие вопросы