Java: Дата від часової позначки Unix


237

Мені потрібно конвертувати часову позначку unix в об’єкт дати.
Я спробував це:

java.util.Date time = new java.util.Date(timeStamp);

Значення часової позначки: 1280512800

Дата повинна бути "2010/07/30 - 22:30:00" (як я це отримую за PHP), але натомість я отримую Thu Jan 15 23:11:56 IRST 1970.

Як це робити?


3
Якщо ви використовуєте Java 8 або новішу версію: подивіться цю відповідь: stackoverflow.com/a/24703644/1115554
micha

1
FYI, тривожні старі класи дату, такі як java.util.Dateтепер застарілі , замінені класами java.time . Дивіться Підручник від Oracle .
Василь Бурк

Відповіді:


429

Бо 1280512800помножте на 1000, оскільки java очікує мілісекунди:

java.util.Date time=new java.util.Date((long)timeStamp*1000);

Якщо у вас вже були мілісекунди, то просто new java.util.Date((long)timeStamp);

З документації :

Виділяє об'єкт Date і ініціалізує його для відображення зазначеної кількості мілісекунд з моменту стандартного базового часу, відомого як "епоха", а саме 1 січня 1970 р., 00:00:00 GMT.


40
У ролях (long)дуже важливо: без нього ціле число переповнюється.
mneri

2
@TomasK java.util.Date- це повністю кваліфікована назва класу. Dateце, мабуть, саме те, що ви імпортуєте java.utilпакет у свій клас.
Пабло Санта-Крус

5
Актер до довгого не потрібен. time = new java.util.Date (timeStamp * 1000L) працює так само добре (оскільки 1000L - це довго, часова
марка буде перенесена

2
Я особисто зробив би це:Date time = new Date(TimeUnit.MILLISECONDS.convert(unixTimestamp, TimeUnit.SECONDS));
Райан Амарал

3
FYI, тривожні старі класи дату, такі як java.util.Dateтепер застарілі , замінені класами java.time . Дивіться Підручник від Oracle .
Василь Бурк

59

java.time

Java 8 представила новий API для роботи з датами та часом: пакет java.time .

Завдяки java.time ви можете проаналізувати підрахунок цілих секунд з моменту епохи першого моменту 1970 року в UTC, 1970-01-01T00: 00Z. Результат - ан Instant.

Instant instant = Instant.ofEpochSecond( timeStamp );

Якщо вам потрібна java.util.Dateвзаємодія зі старим кодом, ще не оновленим для java.time , конвертуйте. Виклик нових методів перетворення, доданих до старих класів.

Date date = Date.from( instant );

3
Хоча ця відповідь технічно правильна, зауважте, що класи java.time витісняють тривожні старі класи, такі як java.util.Date. Старі класи є спадщиною і їх слід уникати. Хоча ви дійсно можете конвертувати в / із застарілих і java.time класів, краще дотримуватися java.time, коли це можливо.
Василь Бурк


27

Здається, що Календар - це новий шлях:

Calendar mydate = Calendar.getInstance();
mydate.setTimeInMillis(timestamp*1000);
out.println(mydate.get(Calendar.DAY_OF_MONTH)+"."+mydate.get(Calendar.MONTH)+"."+mydate.get(Calendar.YEAR));

Останній рядок - це лише приклад того, як його використовувати, цей друкував б, наприклад, "14.06.2012".

Якщо ви використовували System.currentTimeMillis () для збереження мітки, вам не потрібна частина "* 1000".

Якщо у вас є мітка часу в рядку, вам потрібно спершу її розібрати як довгу: Long.parseLong (часова мітка).

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html


8
Попередження: якщо timestampце ціле число, вам потрібно передати його (long)першим, інакше ви отримаєте неправильні дати. mydate.setTimeInMillis((long) timestamp*1000);
svenkapudija

Я полагодив посилання.
Рікбіт

FYI, тривожні старі класи дату, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер застарілі , витіснені класами java.time, вбудованими в Java 8 та новіших версій. Дивіться Підручник від Oracle .
Василь Бурк

26

тл; д-р

Instant.ofEpochSecond( 1_280_512_800L )

2010-07-30T18: 00: 00Z

java.time

Новий фреймворк java.time, вбудований у Java 8 та пізніших версій, є наступником Joda-Time.

Ці нові класи включають зручний фабричний метод для перетворення лічильників цілих секунд з епохи. Ви отримуєте Instantмомент на часовій шкалі в UTC з роздільною здатністю до наносекунд.

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );

instant.toString (): 2010-07-30T18: 00: 00Z

Дивіться, що цей код працює на сайті IdeOne.com .

Таблиця типів дат і часу на Java, як сучасна, так і застаріла

Asia/Kabulчи Asia/Tehranчасові пояси?

Ви повідомили, що отримуєте значення часу 22:30 замість 18:00, що тут бачили. Я підозрюю, що ваша утиліта PHP неявно застосовує часовий пояс за замовчуванням для настройки з UTC. Моє значення тут - UTC, що позначається Z(скорочено Zulu, означає UTC). Будь шанс вашої машини OS або PHP встановлена в Asia/Kabulабо Asia/Tehranчасових поясах? Я гадаю, що так, як ви повідомляєте IRSTу своїх результатах, це, мабуть, означає час Ірану. Наразі в 2017 році це єдині зони, що працюють з літнім часом, що на чотири з половиною години випередив UTC.

Вкажіть правильний час ім'я зони в форматі continent/region, наприклад America/Montreal, Africa/Casablancaабо Pacific/Auckland. Ніколи не використовуйте 3-4 лист абревіатури , такі як ESTабо ISTчи IRSTяк вони НЕ справжні часові пояси, не стандартизований, і навіть не єдиний (!).

Якщо ви хочете побачити свій момент через об'єктив часового поясу певного регіону, застосуйте знак a, ZoneIdщоб отримати ZonedDateTime. Все одно той самий момент, але сприймається як інший час настінного годинника .

ZoneId z = ZoneId.of( "Asia/Tehran" ) ;
ZonedDateTime zdt = instant.atZone( z );  // Same moment, same point on timeline, but seen as different wall-clock time.

2010-07-30T22: 30 + 04: 30 [Азія / Тегеран]

Перетворення з java.time на застарілі класи

Ви повинні дотримуватися нових класів java.time. Але ви можете перетворити на старі, якщо потрібно.

java.util.Date date = java.util.Date.from( instant );

Joda-Time

ОНОВЛЕННЯ: Проект Joda-Time зараз перебуває в режимі обслуговування , команда радить переходити до класів java.time .

FYI, конструктор Joda-Time DateTime схожий: Помножте на тисячу, щоб отримати long(не an int!).

DateTime dateTime = new DateTime( ( 1_280_512_800L * 1000_L ), DateTimeZone.forID( "Europe/Paris" ) );

Краще уникати сумно сумних класів java.util.Date та .Calendar. Але якщо вам потрібно використовувати дату, ви можете конвертувати з Joda-Time.

java.util.Date date = dateTime.toDate();

Про java.time

Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date, Calendar, і SimpleDateFormat.

Проект Joda-Time , який зараз знаходиться в режимі обслуговування , радить перейти до класів java.time .

Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .

Ви можете обмінюватися об'єктами java.time безпосередньо зі своєю базою даних. Використовуйте драйвер JDBC, сумісний з JDBC 4.2 або пізнішої версії. Немає потреби в струнах, немає потреби в java.sql.*заняттях.

Де отримати класи java.time?

  • Java SE 8 , Java SE 9 та новіших версій
    • Вбудований.
    • Частина стандартного Java API з пакетною реалізацією.
    • Java 9 додає деякі незначні функції та виправлення.
  • Java SE 6 та Java SE 7
    • Значна частина функцій java.time підтримується на Java 6 і 7 у ThreeTen-Backport .
  • Android
    • Пізніші версії реалізації пакетів Android для класів java.time.
    • Для більш ранньої Android (<26), то ThreeTenABP проект адаптує ThreeTen-Backport (згаданий вище). Див. Як користуватися ThreeTenABP… .

Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є передумовою для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval, YearWeek, YearQuarter, і більш .


11

Конструктор Date очікує, що значення timeStamp буде в мілісекундах. Помножте значення часової позначки на 1000, а потім перейдіть до конструктора.


7

Якщо ви перетворюєте значення часової позначки на іншій машині, ви також повинні перевірити часовий пояс цієї машини. Наприклад;

Вищеописані пояснення призведуть до різних значень дати, якщо ви працюєте з часовими поясами EST або UTC.

Щоб встановити часовий пояс; також до UTC, ви можете просто переписати;

    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));

6
Я б не рекомендував цього, оскільки це встановлює часовий пояс для всього jvm, а не лише процес розбору!

1

Для котлін

fun unixToDate(timeStamp: Long) : String? {
    val time = java.util.Date(timeStamp as Long * 1000)
    val sdf = SimpleDateFormat("yyyy-MM-dd")
    return sdf.format(time)

}

0

Іноді потрібно працювати з коригуваннями.

Не використовуйте ролях довго! Використовуйте нанорегулювання.

Наприклад, використовуючи API Oanda Java для торгівлі, ви можете отримати timetime у форматі UNIX.

Наприклад: 1592523410.590566943

    System.out.println("instant with nano = " + Instant.ofEpochSecond(1592523410, 590566943));
    System.out.println("instant = " + Instant.ofEpochSecond(1592523410));

Ви отримуєте:

instant with nano = 2020-06-18T23:36:50.590566943Z
instant = 2020-06-18T23:36:50Z

Також використовуйте:

 Date date = Date.from( Instant.ofEpochSecond(1592523410, 590566943) );

-4
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());

3
Без ще трохи тексту незрозуміло, чому ця відповідь є кращою порівняно з багатьма іншими в цьому питанні. Ви можете, будь ласка, уточнити?
Дункан Джонс

Це змінить дату, а не перетворить її!
зворотний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.