Избегайте устаревших классов даты и времени
Вы используете ужасные классы даты и времени, которые были вытеснены несколько лет назад современными java.time классами, определенными в JSR 310.
Date::toString
ложь
почему результат на 2 часа позже
Это на самом деле не два часа позади.
Проблема в том, что, хотя java.util.Date
представляет момент в UTC, его метод toString
динамически применяет текущий часовой пояс JVM по умолчанию при генерации текста, представляющего значение объекта даты и времени. Несмотря на благие намерения, эта анти-функция сбивает с толку и создает иллюзию объекта Date
, имеющего этот часовой пояс.
Другими словами, Date::toString
ложь. Одно из многих плохих дизайнерских решений, найденных в этих классах наследства. И одна из многих причин никогда не использовать эти устаревшие классы.
java.time
Instant
Проанализируйте ваш счет в миллисекундах с начала отсчета эпохи первого момента 1970 года в UTC как Instant
.
Instant instant = Instant.ofEpochMilli( 1556532279322 );
Ваш другой ввод, стандартная строка ISO 8601, также может быть проанализирован как мгновенный.
Instant instant = Instant.parse( "2019-04-29T10:04:39.322Z" ) ;
ZonedDateTime
Чтобы увидеть тот же момент через часы настенного времени, используемые людьми определенного региона (часового пояса), примените ZoneId
, чтобы получить ZonedDateTime
объект.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ) ;
Оба объекта instant
и zdt
представляют один и тот же момент времени. Два способа чтения одного и того же момента, когда два человека, разговаривающих по телефону в Исландии и Квебеке, каждый видел разное время на часах на стене при одновременном взгляде.