тл; д-р
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-Time
Класи java.util.Date та .Calendar у комплекті з Java, як відомо, не викликають труднощів. Уникайте їх. Використовуйте замість цього або бібліотеку Joda -Time, або новий пакет java.time, що вкладається в Java 8 (і натхненний Joda-Time).
Зауважте, що на відміну від juDate, 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 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.
Ява-часові рамки визначені JSR 310 та вбудовані в Java 8 та новіші версії. Класи java.time були перенесені назад на Java 6 та 7 у проекті ThreeTen-Backport та на Android у проекті ThreeTenABP .
Instant
Це момент на шкалі часу в UTC з дозволом наносекунд. Його епоха - це перший момент 1970 року в UTC.
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 );