Java: дата из метки времени Unix - PullRequest
222 голосов
/ 30 июля 2010

Мне нужно преобразовать метку времени 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.

Как это сделать?

Ответы [ 8 ]

401 голосов
/ 30 июля 2010

Для 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.

49 голосов
/ 11 июля 2014

java.time

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

С java.time вы можете использовать:

Date date = Date.from( Instant.ofEpochSecond( timeStamp ) );

Instant представляет метку времени в Java 8. С помощью статического метода Date.from() вы можете преобразовать Instant в java.util.Date экземпляр.

43 голосов
/ 13 сентября 2011

Это правильный путь:

Date date = new Date ();
date.setTime((long)unix_time*1000);
25 голосов
/ 26 июня 2012

Похоже, что календарь - это новый путь:

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

21 голосов
/ 12 июля 2014

ТЛ; др

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 .

Asia/Kabul или Asia/Tehran часовые пояса?

Вы сообщили о получении значения времени дня 22:30 вместо 18:00, показанного здесь. Я подозреваю, что ваша утилита PHP неявно применяет часовой пояс по умолчанию для настройки из UTC. Мое значение здесь - UTC, обозначенное Z (сокращение от Zulu, означает UTC). Есть ли вероятность, что на вашей машине ОС или PHP установлены часовые пояса Asia/Kabul или Asia/Tehran? Полагаю, что так как вы сообщаете в своем выводе IRST, что, очевидно, означает иранское время. В настоящее время в 2017 году это единственные зоны , работающие с летним временем, которое на четыре с половиной часа опережает UTC.

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

Если вы хотите, чтобы видел ваш момент через объектив часового пояса определенного региона, примените 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 .

К вашему сведению, конструктор для Joda-Time DateTime аналогичен: умножьте на тысячу, чтобы получить long (не int!).

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

Лучше всего избегать печально известных классов java.util.Date и .Calendar. Но если вам нужно использовать Date, вы можете конвертировать из Joda-Time.

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

О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

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

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация 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

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

11 голосов
/ 30 июля 2010

Конструктор Date ожидает, что значение timeStamp будет в миллисекундах.Умножьте значение вашей временной метки на 1000, затем передайте значение конструктору.

7 голосов
/ 17 сентября 2013

Если вы конвертируете метку времени на другом компьютере, вам также следует проверить часовой пояс этого компьютера.Например;

Приведенные выше описания приведут к различным значениям даты, если вы будете работать с часовыми поясами EST или UTC.

Чтобы установить часовой пояс;или UTC, вы можете просто переписать;

    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));
0 голосов
/ 19 марта 2015
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...