ТЛ: др
Instant.EPOCH
.toString()
1970-01-01T00: 00: 00Z
Date::toString
ложь
Вы узнали одну из многих причин, по которой следует избегать использования классов java.util.Date/Calendar: экземпляр Date
не имеет информации о часовом поясе, однако метод toString
использует ваш часовой пояс по умолчанию при рендеринге Строка для отображения. Это сбивает с толку, поскольку подразумевает, что у даты есть часовой пояс, а на самом деле это не так.
Избегать Date
/ Calendar
Вместо даты / календаря вы должны использовать Joda-Time или новые классы Java 8, java.time. * Из JSR 310.
java.time
Используйте класс Instant
в качестве эквивалента Date
, момент времени на шкале UTC.
Instant.now()
Для справочной даты эпохи используйте константу.
Instant.EPOCH.toString()
1970-01-01T00: 00: 00Z
Если под «игнорировать все время» вы имеете в виду, что вам действительно нужно значение только для даты без времени суток, используйте класс LocalDate
.
LocalDate.ofEpochDay( 0L )
1970-01-01
Пример Joda-Time
Обновление: проект Joda-Time в настоящее время находится в режиме обслуживания, и команда советует перейти на классы java.time.
В Joda-Time экземпляр DateTime действительно знает свой собственный часовой пояс. При желании вы можете использовать форматтер для создания строковых выводов в других часовых поясах.
Вот ваш код, нацеленный на Unix time Epoch , но с использованием Joda-Time 2.3.
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;
DateTimeZone timeZone_Paris = DateTimeZone.forID( "Europe/Paris" );
DateTime epochParis = new DateTime( 0L, timeZone_Paris );
DateTime epochUtc = new DateTime( 0L, DateTimeZone.UTC );
Дамп на консоль ...
System.out.println( "epochParis: " + epochParis );
System.out.println( "epochUtc: " + epochUtc );
При запуске ...
epochParis: 1970-01-01T01:00:00.000+01:00
epochUtc: 1970-01-01T00:00:00.000Z
Преобразовать в UTC / GMT
Итак, как я могу принудительно использовать GMT и игнорировать все местное время?
Чтобы использовать UTC / GMT (без смещения часового пояса), либо:
- Преобразование DateTime в другой экземпляр с другим часовым поясом.
(Joda-Time делает вещи неизменными для безопасности потоков, поэтому мы не выполняем преобразование, мы создаем новые экземпляры на основе старых.)
- Использование средства форматирования для создания строк, отображаемых для указанного часового пояса.
// To use UTC/GMT instead of local time zone, create new instance of DateTime.
DateTime nowInParis = new DateTime( timeZone_Paris );
DateTime nowInUtcGmt = nowInParis.toDateTime( DateTimeZone.UTC );
Дамп на консоль ...
System.out.println( "nowInParis: " + nowInParis );
System.out.println( "nowInUtcGmt: " + nowInUtcGmt );
При запуске…
nowInParis: 2013-12-22T08:40:01.443+01:00
nowInUtcGmt: 2013-12-22T07:40:01.443Z