Java: date from unix timestamp

Muszę przekonwertować uniksowy znacznik czasu na obiekt date.
Próbowałem tego:

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

Wartość znacznika czasu to: 1280512800

Data powinna być "2010/07/30 - 22:30:00" (jak dostaję to przez PHP) ale zamiast tego dostaję Thu Jan 15 23:11:56 IRST 1970.

Jak to zrobić?
Author: Eric Leschinski, 2010-07-30

8 answers

Dla 1280512800, pomnóż przez 1000, ponieważ java oczekuje milisekund:

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

Jeśli masz już milisekundy, to po prostu new java.util.Date((long)timeStamp);

Z dokumentacji :

Przydziela obiekt Date i inicjalizuje go do reprezentowania określona liczba milisekund od standardowy czas bazowy znany jako " the epoki", mianowicie 1 stycznia 1970 roku, 00: 00: 00 GMT.

 380
Author: Pablo Santa Cruz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-30 19:30:00

To jest właściwa droga:

Date date = new Date ();
date.setTime((long)unix_time*1000);
 42
Author: Marco Fantasia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-13 15:52:56

Java.czas

Java 8 wprowadziła nowe API do pracy z datami i godzinami: java .pakiet czasowy .

Z Javą.czas, którego możesz użyć:

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

An Instant reprezentuje znacznik czasu w Java 8. Za pomocą metody static Date.from() można przekonwertować instancję Instant na instancję java.util.Date.

 42
Author: micha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-11 20:12:32

Wygląda na to, że Kalendarz to nowa droga:

Calendar mydate = Calendar.getInstance();
mydate.setTimeInMillis(timestamp*1000);
out.println(mydate.get(Calendar.DAY_OF_MONTH)+"."+mydate.get(Calendar.MONTH)+"."+mydate.get(Calendar.YEAR));

Ostatnia linijka to tylko przykład jak z niej korzystać, Ta wydrukuje np. "14.06.2012".

Jeśli korzystałeś z systemu.currentTimeMillis () aby zapisać Znacznik Czasu, nie potrzebujesz części "*1000".

Jeśli masz znacznik czasu w łańcuchu znaków, musisz najpierw przeanalizować go jako long: Long.parseLong (znacznik czasu).

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

 25
Author: Stefan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-12 15:55:35

Tl;dr

Instant.ofEpochSecond( 1_280_512_800L )

2010-07-30T18: 00: 00Z

Java.czas

Nowa java.Framework czasu Wbudowany W Java 8 i Później jest następcą Joda-Time.

Te nowe klasy zawierają poręczną metodę fabryczną do konwersji liczby całych sekund z epoki. Otrzymujesz Instant, moment na osi czasu w UTC z rozdzielczością do nanosekund.

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );

Natychmiast.toString (): 2010-07-30t18: 00: 00Z

Zobacz że kod działa na żywo w IdeOne.com .

Asia/Kabul czy Asia/Tehran strefy czasowe ?

Zgłosiłeś, że czas dnia to 22: 30 zamiast 18: 00 tutaj. Podejrzewam, że Twoje narzędzie PHP domyślnie stosuje domyślną strefę czasową do dostosowania Z UTC. Moja wartość to UTC, oznaczana przez Z (skrót od Zulu, oznacza UTC). Jakakolwiek szansa, że Twój system operacyjny lub PHP jest ustawiony na Asia/Kabul lub Asia/Tehran strefy czasowe? Przypuszczam, że tak, jak zgłaszasz IRST w swojej pracy, która najwyraźniej oznacza czas Iranu. Obecnie w 2017 r.są to jedyne strefy działające z czasem letnim, który jest cztery i pół godziny przed UTC.

Określ właściwą nazwę strefy czasowej w formacie continent/region, np. America/Montreal, Africa/Casablanca, lub Pacific/Auckland. Nigdy nie używaj skrótów 3-4 literowych, takich jak EST lub IST lub IRST, ponieważ są one a nie prawdziwymi strefami czasowymi, nie znormalizowanymi, a nawet unikalnymi(!).

If you want to see your moment przez obiektyw strefy czasowej danego regionu, zastosuj ZoneId, aby uzyskać ZonedDateTime. Wciąż ten sam jednoczesny moment, ale postrzegany jako inny zegar ścienny.

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/Teheran]

Konwersja z Javy.czas na klasy starsze

Powinieneś trzymać się nowej Javy.zajęcia czasowe. Ale możesz przekonwertować na stary, jeśli jest to wymagane.

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

Joda-Czas

UPDATE: The Projekt Joda-Time jest obecnie w trybie konserwacji , a zespół doradza migracji do java.czas klasy.

FYI, konstruktor dla Joda-Time DateTime jest podobny: pomnóż przez tysiąc, aby wytworzyć long (Nie int!).

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

Najlepiej unikać notorycznie kłopotliwej Javy.util.Data i .Zajęcia z kalendarza. Ale jeśli musisz użyć daty, możesz przekonwertować z Joda-Time.

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

O java.czas

The java.czas framework jest wbudowany w Java 8 i nowsze. Klasy te zastępują kłopotliwe stare dziedzictwo klasy date-time, takie jak java.util.Date, Calendar, & SimpleDateFormat.

The Joda-czas projekt, obecnie w trybie konserwacji , radzi migrację do java.czas klasy.

Aby dowiedzieć się więcej, Zobacz Oracle Tutorial. I wyszukaj przepełnienie stosu dla wielu przykładów i wyjaśnień. Specyfikacja to JSR 310 .

Możesz wymienić Javę.obiekty time bezpośrednio z bazą danych. Użyj sterownika JDBCzgodnego z JDBC 4.2 lub nowszego. Nie ma potrzeby stosowania łańcuchów, nie ma potrzeby stosowania klas java.sql.*.

Skąd pobrać Javę.zajęcia czasowe?

  • Java SE 8, Java SE 9, oraz później
    • Wbudowany.
    • część standardowego API Javy z dołączoną implementacją.
    • Java 9 dodaje kilka drobnych funkcji i poprawek.
  • Java SE 6 oraz Java SE 7
    • Większość Javy.funkcja czasu powraca-przeportowana do Javy 6 i 7 w ThreeTen-Backport.
  • Android
    • późniejsze wersje implementacji pakietu Android w Javie.zajęcia czasowe.
    • dla wcześniejszego Androida ( ThreeTenABP projekt adaptuje ThreeTen-Backport (wspomniano powyżej). Zobacz też jak stosować ThreeTenABP....

The ThreeTen-Extra projekt rozszerza Javę.czas z dodatkowymi zajęciami. Ten projekt jest poligonem dla potencjalnych przyszłych dodatków do Javy.czas. Możesz znaleźć tutaj kilka przydatnych klas, takich jak Interval, YearWeek, YearQuarter, i więcej .

 18
Author: Basil Bourque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-02 00:28:58

Konstruktor Date oczekuje wartości znacznika czasu w milisekundach. Pomnóż wartość znacznika czasu przez 1000, a następnie prześlij ją do konstruktora.

 11
Author: f1sh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-30 12:24:58

Jeśli konwertujesz wartość znacznika czasu na innej maszynie, powinieneś również sprawdzić strefę czasową tej maszyny. Na przykład;

Powyższe napisy będą miały różne wartości daty, jeśli uruchomisz je w strefach czasowych EST lub UTC.

Aby ustawić strefę czasową; aka NA UTC, możesz po prostu przepisać;

    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));
 7
Author: tmr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-16 21:47:41
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());
 -2
Author: Masatsugu Hosoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-19 05:21:29