Java: Дата от unix timestamp

Трябва да конвертирам unix timestamp в дата обект.
Опитах това:

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

1280512800 : 1280512800

Датата трябва да бъде "2010/07/30 - 22:30:00" (тъй като аз го получавам в PHP), но вместо това го получавам Thu Jan 15 23:11:56 IRST 1970 .

Как да направите това?

188
30 июля '10 в 15:22 2010-07-30 15:22 RYN е настроен за 30 юли '10 в 15:22 2010-07-30 15:22
@ 8 отговора

За 1280512800 умножете по 1000, тъй като java очаква милисекунди:

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

Ако вече имате милисекунди, тогава просто new java.util.Date((long)timeStamp);

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

Избира обект за дата и инициализира го, за да представлява определен брой милисекунди със стандартно базово време, известно като "епохи", а именно 1 януари 1970, 00:00:00 GMT.

355
30 июля '10 в 15:24 2010-07-30 15:24 отговорът е даден от Пабло Санта Крус на 30 юли '10 в 15:24 2010-07-30 15:24

Това е правилният начин:

border=0
 Date date = new Date (); date.setTime((long)unix_time*1000); 
42
13 сент. Отговорът е даден от Марко Фантазия 13 сеп. 2011-09-13 18:52 '11 в 18:52 2011-09-13 18:52

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 .

32
11 июля '14 в 20:49 2014-07-11 20:49 отговорът е даден от micha 11 юли, '14 в 20:49 2014-07-11 20:49

Изглежда, че Календарът е нов начин:

 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 (timestamp).

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

24
26 июня '12 в 13:15 2012-06-26 13:15 отговорът е даден от Стефан на 26 юни 2012 г. в 13:15 ч. 2012-06-26 13:15

TL; DR

 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/Tehran зони в 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 време

АКТУАЛИЗАЦИЯ: Проектът Joda-Time вече е в режим на поддръжка и екипът съветва да преминете към java.time класове.

FYI, конструкторът на 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.com

Структурата на java.time е вградена в Java 8 и по-късно. Тези класове изтласкват неприятните стари часови класове като java.util.Date , Calendar и SimpleDateFormat .

Проектът Joda-Time , сега режимът на поддръжка , препоръчваме да отидете на класовете java.time .

За да научите повече, вижте Ръководство за Oracle . И търсете medican.info за много примери и обяснения. Спецификация JSR 310 .

Къде да вземем java.time класове?

Проектът ThreeTen-Extra разширява java.time с допълнителни класове. Този проект е доказателство за възможни бъдещи допълнения към java.time. Тук можете да намерите полезни класове като Interval , YearWeek , YearQuarter и др .

16
11 июля '14 в 23:00 2014-07-11 23:00 отговорът е даден от Basil Bourque 11 юли '14 в 23:00 часа 2014-07-11 23:00

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

11
30 июля '10 в 15:24 2010-07-30 15:24 отговорът е даден f1sh 30 юли '10 в 15:24 2010-07-30 15:24

Ако конвертирате стойността на времевата маркировка в друга машина, трябва също да проверите часовата зона на този компютър. Например:

В описанията по-горе ще се показват различни стойности на датата, ако изпълнявате EST или UTC часови зони.

За да зададете часовата зона; както и UTC, можете просто да пренапишете:

  TimeZone.setDefault(TimeZone.getTimeZone("UTC")); java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000)); 
7
17 сент. отговорът е даден tmr 17 sep . 2013-09-17 00:47 '13 в 0:47 2013-09-17 00:47
 Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset()); 
-2
19 марта '15 в 8:21 2015-03-19 08:21 Отговор, даден от Masatsugu Hosoi на 19 март 2009 г. в 08:21 часа 2015-03-19 08:21

Други въпроси относно или Ask a Question