Java: Дата из метки времени unix

мне нужно преобразовать временную метку unix в объект даты.
Я попробовал:

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

значение timestamp: 1280512800

дата должна быть "2010/07/30 - 22:30:00" (как я получаю его PHP), но вместо этого я получаю Thu Jan 15 23:11:56 IRST 1970.

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

8 ответов


на 1280512800, умножьте на 1000, так как java ожидает миллисекунды:

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

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

С документация:

выделяет объект Date и инициализирует ее представлять заданное количество миллисекунд с момента стандартное базовое время, известное как " the эпоха", а именно 1 января 1970 года, 00: 00: 00 GMT.


это правильно:

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

java.время

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

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

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

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


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

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".

Если вы использовали систему.currentTimeMillis () для сохранения метки времени вам не нужна часть "*1000".

Если у вас есть метка времени в строке, вам нужно сначала разобрать ее как длинную: Длинный.parseLong(типа timestamp).

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


tl; dr

Instant.ofEpochSecond( 1_280_512_800L )

2010-07-30T18:00:00Z

java.время

новая java.временные рамки, встроенные в Java 8 и более поздние версии, являются преемниками Joda-Time.

эти новые классы включают в себя удобный заводской метод для преобразования количества целых секунд от эпохи. Вы получаете Instant, момент на временной шкале в UTC с разрешением до наносекунд.

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );

мгновенный.toString (): 2010-07-30T18:00: 00Z

видно, что запустить код видео на IdeOne.com.

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 букв as 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.время для устаревших классов

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

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

Joda Времени

обновление:Joda Времени сейчас режим обслуживания, с командой, консультирующей миграцию в java.время классы.

FYI, конструктор для Joda Времени DateTime аналогично: умножьте на тысячу, чтобы получить long (а не int!).

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

лучше избегать заведомо хлопотной java.утиль.Сроки и. Календарные занятия. Но если вы должны использовать дату, вы можете конвертировать из Joda-Time.

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

о java.время

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

на Joda Времени, теперь режим обслуживания, советует миграцию в java.время классы.

чтобы узнать больше, см. В Oracle Учебник. Поиск переполнения стека много примеров и объяснений. Спецификация JSR 310.

вы можете обменять java.время объекты непосредственно с вашей базой данных. Используйте драйвер JDBC соответствуют JDBC 4.2 или позже. Нет необходимости в строках, нет необходимости в java.sql.* классы.

где получить java.время занятий?

  • Java SE 8, Java SE 9, и позже
    • встроенный.
    • часть стандартного API Java со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • большая часть java.функциональность времени обратно портирована на Java 6 & 7 в ThreeTen-Backport.
  • Android
    • более поздние версии Android bundle реализации java.классы время.
    • для более раннего Android (ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше). См.как использовать ThreeTenABP....

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


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


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

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

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

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

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