Почему новая дата (0L) не возвращает нулевую дату - PullRequest
5 голосов
/ 22 июня 2011
Date date = new Date(0L);

Разве это не должно дать мне нулевую дату? Нравится 00/00/0000? Дает мне Ср 31 декабря 19:00:00 EST 1969

Ответы [ 6 ]

26 голосов
/ 22 июня 2011

В javadocs , этот конструктор в Date использует смещение от базового времени:

Распределяет объект Date и инициализирует его для представления указанное количество миллисекунд с стандартное базовое время, известное как эпоха ", а именно 1 января 1970 г., 00:00:00 GMT.

Предположительно, вы находитесь на EST, отсюда и результат.

Кроме того, я бы не ожидал, что результат, который вы отметили, будет получен в результате любых возможных Date манипуляций, поскольку это даже не действительная дата (месяц и день = 0).

5 голосов
/ 22 июня 2011

Из API Java:

Дата (длинная дата): выделяет объект Date и инициализирует его для представления указанного количества миллисекунд со стандартного базового времени, известного как «эпоха», а именно1 января 1970 года, 00:00:00 по Гринвичу.

См .: http://download.oracle.com/javase/1.4.2/docs/api/java/util/Date.html

1 голос
/ 22 июня 2011

Поскольку этот конструктор создает объект, инициализирует его для представления заданного количества миллисекунд со стандартного базового времени, известного как «эпоха», а именно 1 января 1970 года, 00:00:00 по Гринвичу.

1 голос
/ 22 июня 2011

Время в миллисекундах с начала эпохи.

Эпоха 01.01.1970 по Гринвичу.

0 голосов
/ 13 февраля 2018

tl; др

Первый момент 1970 года в UTC:

Instant.EPOCH.toString()

1970-01-01T00: 00: 00Z

Атот же момент, что и в регионе Нью-Йорка:

Instant.EPOCH.atZone( ZoneId.of( "America/New_York" ) ).toString()

1969-12-31T19: 00-05: 00 [America / New_York]

Подробности

Другие ответы верны: ссылка на эпоху - это первый момент 1970 года в UTC, а ваш часовой пояс на 5 часов отстает UTC.Вот обновленная информация.

java.time

В современном подходе используются java.time классы, которые вытеснили проблемные старые унаследованные классы даты и времени.

Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).

Ссылка на эпоху 1970-01-01T00: 00: 00Z определяется как постоянная, Instant.EPOCH.

Instant.EPOCH.toString()

1970-01-01T00: 00: 00Z

Чтобы увидеть тот же момент в другом часовом поясе, примените ZoneId, чтобы получить ZonedDateTime.Вы можете думать об этом как: «ZonedDateTime = Instant + ZoneId».

Укажите правильное имя часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland.Никогда не используйте 3-4-буквенное сокращение, например EST или IST, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/New_York" ) ;  
ZonedDateTime zdt = Instant.EPOCH.atZone( z ) ;

zdt.toString (): 1969-12-31T19: 00-05: 00 [America / New_York]

Результатом является время-днем на пять часов раньше, в последний день предыдущего года.Этот ZonedDateTime представляет тот же момент, ту же самую одновременную точку на временной шкале, но другое время настенных часов.

Этот же момент в Индии на пять с половиной часов впереди UTC вместо за .

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = Instant.EPOCH.atZone( z ) ;

    System.out.println(zdt );

zdt.toString (): 1970-01-01T05: 30 + 05: 30 [Азия / Калькутта]


О java.time

Среда java.time встроена в Java 8 и более поздние версии.Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Если драйвер JDBC соответствует JDBC 4.2 или более поздней версии, вы можете обменять java.time объектов непосредственно с вашей базой данных.Нет необходимости в строках или java.sql. * Классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , а позже
    • Встроенный-в.
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации связки Android классов java.time.
    • Для более ранних версий Android проект ThreeTenABP адаптируется ThreeTen-Бэкпорт (упоминается выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 22 июня 2011

Даты Java и большинство компьютерных реализаций дат хранятся в миллисекундах секунд, начиная с так называемой эпохи. Это 1 января 1970 года. Дата Java представлена ​​в миллисекундах с начала эпохи. и 0 миллисекунд, так как эпоха является самой эпохой. И именно поэтому вы получаете это значение.

...