Отримання "unixtime" в Java


258

Date.getTime () повертає мілісекунди з 1 січня 1970 р. Unixtime - це секунди з 1 січня 1970 року. Я зазвичай не кодую в Java, але я працюю над деякими виправленнями помилок. У мене є:

Date now = new Date();      
Long longTime = new Long(now.getTime()/1000);
return longTime.intValue();

Чи є кращий спосіб дістатись одночасно у Java?


27
Оскільки ви кинули його на int, ви ввели проблему 2038 року (еквівалент Y2K для Unix). Ось тоді епоха Unix досягає 2 мільярдів і перекидається на мінус. Виправлення полягає в переході до 64-розрядного Unix. Еквівалент Java - це залишити його як довге.
Джон М

1
Так, я це знаю. Код, з яким він поєднується, очікує 32-бітовий int одноразово.
Гері Річардсон,

157
2038 рік найближчим часом.
Pacerier

Чи є власне ім’я або стандарт для currentTimeMillis? Я схильний називати це у своїй документації як мілісекундну версію часу UNIX.
Том

1
Якщо ви хочете, щоб ваше програмне забезпечення пережило переповнення, використовуйте long, ні int. Дійсно немає причин використовувати intдля позначки часу, якщо ви не використовуєте іншу деталізацію, як-от 1 секунда = 4 секунди і т.д.
bryc

Відповіді:


475

Уникайте створення об'єкта Date w / System.currentTimeMillis () . Поділ на 1000 приведе вас до епохи Unix.

Як згадується в коментарі, типово хочеш, щоб типова змінна unixTime не була корінним об'єктом long (нижній регістр-l long), а не коробчастий об'єкт long (capital-L Long).

long unixTime = System.currentTimeMillis() / 1000L;

3
Також розгляньте можливість використання примітивного long замість автобоксингу на Long, якщо ви не хочете обробляти число як Об'єкт (як, наприклад, помістити його у Колекцію), знову
уникайте

9
32-розрядний int Java відповідає 32-бітним платформам (і проблема 2038 року). 64-бітні платформи використовують більший тип даних time_t. Java ухилилася від цієї кулі, використовуючи довге повернення для System.currentTimeMillis (). Якщо ви перетворюєте на int, ви знову представляєте проблему 2038 року. Дивіться en.wikipedia.org/wiki/Year_2038_problem#Solutions
Джон М

1
Я думаю, що ви помиляєтесь в одному пункті: Існує різниця між нижчим регістром "L" та великим регістром, коли ви використовуєте їх у числових літералах, як це. docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1
матова форзація

5
Обговорення капіталізації (уточнено вище) стосувалося типу даних. Примітивний екземпляр класу "довгий" проти "java.lang.Long". Ви говорите про суфікс на великій літералі, яка, я погоджуюсь, може бути великою чи малою літерою. Хоча нижній регістр "l" схожий на бік, як цифра "1", тому набагато зручніше використовувати капітал "L".
Джон М

1
Клацніть посилання на документацію. Повернення визначається як кількість мілісекунд з 1.01.1970 року в часовому поясі UTC. Вам потрібні часові пояси? Подивіться на java.util.Calendar.
Джон М

273

Java 8 додала новий API для роботи з датами та часом. З Java 8 ви можете користуватися

import java.time.Instant
...
long unixTimestamp = Instant.now().getEpochSecond();

Instant.now()повертає Миттєвий, який представляє поточний системний час. З getEpochSecond()вами ви отримуєте епохи секунд (unix час) від Instant.


4
У чому різниця між Instant.now().getEpochSecond(), new Date().getTime()іSystem.currentTimeMillis()
SohamC

2
Одна відмінність полягає в тому, що перший знаходиться в секундах, а останні два - в мілісекундах. Можуть бути, а можуть і не бути інші.
super_aardvark

3
import java.time.Instantякщо ви знаходитесь у Scala
akauppi

4
Перегляньте цей сайт, щоб отримати детальний опис ... Сподобалось .. currentTimeMillis
Subroto

1
Зауважте, що ви не можете використовувати цей метод зі старими рівнями API для Android.
Алі Надалізаде
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.