ТЛ; др
java.time.Instant // Represent a moment as seen in UTC. Internally, a count of nanoseconds since 1970-01-01T00:00Z.
.ofEpochSecond( 1_220_227_200L ) // Pass a count of whole seconds since the same epoch reference of 1970-01-01T00:00Z.
Знай свои данные
Люди используют различную точность при отслеживании времени как числа с эпохи . Поэтому, когда вы получаете некоторые числа, которые можно интерпретировать как количество с эпохи, вы должны определить:
- Какая эпоха?
Даты многих эпох использовались в различных системах. Обычно используется время POSIX / Unix , где эпоха - это первый момент 1970 года по UTC. Но не стоит предполагать эту эпоху.
- Какая точность?
Мы говорим о секундах, миллисекундах , микросекундах или наносекундах с эпохи?
- Какой часовой пояс?
Обычно отсчет времени находится в часовом поясе UTC / GMT, то есть вообще не имеет смещения часового пояса. Но иногда при привлечении неопытных программистов или программистов, не знающих дату и время, может быть подразумеваемый часовой пояс.
В вашем случае, как отмечали другие, вам, кажется, дали секунды с эпохи Unix. Но вы передаете эти секунды конструктору, который ожидает миллисекунды. Итак, решение - умножить на 1000.
Уроки выучены:
- Определите, а не предполагайте значение полученных данных.
- Прочтите документ .
Ваши данные
Ваши данные кажутся целыми секундами. Если мы примем эпоху начала 1970-х, и если мы примем часовой пояс UTC, то 1,220,227,200
это первый момент первого дня сентября 2008 года.
Joda времени
Классы java.util.Date и .Calendar, связанные с Java, как известно, вызывают проблемы. Избежать их. Вместо этого используйте либо библиотеку Joda-Time, либо новый пакет java.time, входящий в состав Java 8 (и вдохновленный Joda-Time).
Обратите внимание, что в отличие от juDate, a DateTime
в Joda-Time действительно знает свой собственный часовой пояс . Итак, в примере кода Joda-Time 2.4, показанном ниже, обратите внимание, что сначала мы анализируем миллисекунды, используя стандартное значение UTC. Затем, во-вторых, мы назначаем часовой пояс Парижа для корректировки. Тот же момент на временной шкале Вселенной, но другое время на настенных часах . Для демонстрации мы снова настраиваемся на UTC. Почти всегда лучше явно указать желаемый / ожидаемый часовой пояс, чем полагаться на неявное значение по умолчанию (часто это причина проблем при работе с датой и временем).
Нам нужны миллисекунды для создания DateTime. Итак, введите секунды и умножьте на тысячу. Обратите внимание, что результат должен быть 64-битным, long
как если бы мы переполнили 32-битный int
.
long input = 1_220_227_200L; // Note the "L" appended to long integer literals.
long milliseconds = ( input * 1_000L ); // Use a "long", not the usual "int". Note the appended "L".
Подайте это количество миллисекунд в конструктор. Этот конкретный конструктор предполагает, что счетчик относится к эпохе Unix 1970 года. Поэтому настройте часовой пояс по желанию после построения.
Используйте правильные названия часовых поясов , сочетание континента и города / региона. Никогда не используйте трех- или четырехбуквенные коды, EST
поскольку они не являются ни стандартизированными, ни уникальными.
DateTime dateTimeParis = new DateTime( milliseconds ).withZone( DateTimeZone.forID( "Europe/Paris" ) );
Для демонстрации снова настройте часовой пояс.
DateTime dateTimeUtc = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );
Выгрузить в консоль. Обратите внимание, как отличается дата в Монреале, поскольку новый день начался в Европе, но еще не в Америке.
System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUTC: " + dateTimeUtc );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );
При запуске.
dateTimeParis: 2008-09-01T02:00:00.000+02:00
dateTimeUTC: 2008-09-01T00:00:00.000Z
dateTimeMontréal: 2008-08-31T20:00:00.000-04:00
java.time
Создатели Joda-Time попросили нас перейти на его замену, фреймворк java.time, как только это будет удобно. Хотя Joda-Time продолжает активно поддерживаться, вся дальнейшая разработка будет осуществляться на классах java.time и их расширениях в проекте ThreeTen-Extra.
Фреймворк времени Java определяется JSR 310 и встроен в Java 8 и новее. Классы java.time были перенесены на Java 6 и 7 в проекте ThreeTen-Backport и на Android в проекте ThreeTenABP .
An Instant
- это момент на временной шкале в формате UTC с разрешением наносекунды. Его эпоха - это первый момент 1970 года по всемирному координированному времени.
Instant instant = Instant.ofEpochSecond( 1_220_227_200L );
Примените смещение от UTC, ZoneOffset
чтобы получить файл OffsetDateTime
.
Еще лучше, если известно, примените часовой пояс, ZoneId
чтобы получить ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );