Java: Дата из unix timestamp

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

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

Ответ 1

Для 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 по Гринвичу.

Ответ 2

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.

Ответ 3

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

Date date = new Date ();
date.setTime((long)unix_time*1000);

Ответ 4

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

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

Ответ 5

ТЛ; др

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.

Table of date-time types in Java, both modern and legacy

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[Asia/Tehran]

Преобразование из java.time в унаследованные классы

Вы должны придерживаться новых классов java.time. Но вы можете конвертировать в старый, если требуется.

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

Joda времени

ОБНОВЛЕНИЕ: проект 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. Но если вам нужно использовать дату, вы можете конвертировать из 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 (& lt; 26) проект ThreeTenABP адаптирует ThreeTen-Backport (упомянуто выше). Смотрите Как использовать ThreeTenABP....

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

Ответ 6

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

Ответ 7

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

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

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

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

Ответ 8

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