ТЛ; др
DateTime
Знайте свои данные
Люди используют различные оценки во время отслеживания как число с эпохи . Поэтому, когда вы получаете некоторые числа, которые будут интерпретироваться как счет с эпохи, вы должны определить:
- Какая эпоха?
Многие эпохи были использованы в различных системах. Обычно используется время POSIX / Unix , где эпоха является первым моментом 1970 года в UTC. Но вы не должны считать эту эпоху.
- Какая точность?
С какой эпохи мы говорим секунды, миллисекунды , микросекунды или наносекунды ?
- Какой часовой пояс?
Обычно счет с эпохи находится в часовом поясе UTC / GMT, т. Е. Вообще не имеет смещения часового пояса. Но иногда, когда речь идет о неопытных программистах с неопределенностью или датой, может существовать подразумеваемый часовой пояс.
В вашем случае, как отмечали другие, вам кажется, что вам дали секунды со времен Unix. Но вы передаете эти секунды конструктору, который ожидает миллисекунды. Таким образом, решение умножается на 1000.
Уроки выучены:
- Определите, не принимайте значения полученных данных.
- Прочтите документ .
Ваши данные
Ваши данные, кажется, целые секунды. Если мы примем эпоху начала 1970 года, и если мы примем часовой пояс UTC, то long
это первый момент первого дня сентября 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 года. Поэтому настройте часовой пояс по желанию, после строительства.
Используйте правильные названия часовых поясов , сочетание континента и города / региона. Никогда не используйте 3 или 4 буквенных кода, например, EST
они не стандартизированы, а не уникальны.
DateTime dateTimeParis = new DateTime( milliseconds ).withZone( DateTimeZone.forID( "Europe/Paris" ) );
Для демонстрации снова настройте часовой пояс.
DateTime dateTimeUtc = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontreal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );
Сбросьте консоль. Обратите внимание на то, как в Монреале эта дата отличается, поскольку новый день начался в Европе, но еще не в Америке.
System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUTC: " + dateTimeUtc );
System.out.println( "dateTimeMontreal: " + dateTimeMontreal );
При запуске.
dateTimeParis: 2008-09-01T02:00:00.000+02:00
dateTimeUTC: 2008-09-01T00:00:00.000Z
dateTimeMontreal: 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 года в UTC.
Instant instant = Instant.ofEpochSecond( 1_220_227_200L );
Примените смещение-от-UTC, ZoneOffset
чтобы получить OffsetDateTime
.
Еще лучше, если известно, примените часовой пояс, ZoneId
чтобы получить a ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );