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?
Проект 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());