2017-06-15 72 views
6

Mam datę zapisaną w DB w formacie ciągu ddMMrrrr i gg: mm oraz Strefę czasową. Chcę utworzyć wyszukiwanie dynamiczne na podstawie tych informacji, ale nie wiem, jak to zrobić.Java 8 - Natychmiastowe tworzenie z LocalDateTime z TimeZone

coś

LocalDateTime dateTime = LocalDateTime.of(2017, Month.JUNE, 1, 13, 39); 
Instant instant = dateTime.toInstant(TimeZone.getTimeZone("ECT")); 
+0

Masz na myśli 'ZonedDateTime.ofInstant (instant, TimeZone.getDefault())'? – soorapadman

+1

@soorapadman To by zwróciło ZonedDateTime. OP chce natychmiastowego. –

+2

** Nigdy nie używaj skrótów o długości do trzech znaków dla stref czasowych. ** Są to * nie * strefy czasowe, nie są ustandaryzowane, a nawet unikalne! Użyj [prawdziwych nazw stref czasowych] (https://en.m.wikipedia.org/wiki/List_of_tz_database_time_zones) w formacie "kontynent/region", takim jak ['Europe/London'] (https: //en.m. wikipedia.org/wiki/Europa/London), ['Europe/Paris'] (https://en.m.wikipedia.org/wiki/Europe/Paris),' Asia/Kalkuta', 'Pacific/Auckland'. Jeśli przez "ECT" rozumiałeś czas Ekwadoru, użyj "ZoneId.of (" America/Guayaquil ")'. Jeśli chodziło Ci o Europę Środkową, użyj odpowiedniej nazwy strefy "Europa/...". –

Odpowiedz

11

można najpierw utworzyć ZonedDateTime z tej strefy czasowej, a następnie zadzwonić toInstant:

LocalDateTime dateTime = LocalDateTime.of(2017, Month.JUNE, 15, 13, 39); 
Instant instant = dateTime.atZone(ZoneId.of("Europe/Paris")).toInstant(); 
System.out.println(instant); // 2017-06-15T11:39:00Z 

ja również włączony do korzystania z nazwy strefy w pełnym wymiarze czasu (za radą Bazylego), ponieważ jest mniej dwuznaczny.

+3

Prawie doskonała Odpowiedź, ale nie powinieneś zachęcać do używania kodów pseudo-strefy czasowej 3-4 liter. Zamiast tego użyj [prawdziwych nazw stref czasowych] (https://en.m.wikipedia.org/wiki/List_of_tz_database_time_zones) w formacie "kontynent/region". Zgaduję, że autor miał na myśli * Ekwador Czas * dla "ECT". 'ZoneId.of (" America/Guayaquil "))' –

+1

@BasilBourque "ECT" to tak naprawdę europejski czas centralny ("Europa/Paryż"), więc widzę, dlaczego użycie pełnej nazwy byłoby lepsze;) –

+2

Mam tylko postrzega "CET" jako czas środkowoeuropejski. Ale o to właśnie chodzi, te 3-4-literowe kody są koszmarem dwuznaczności i powinny być omijane jak zaraza. –

4

Zapomnij o starej klasie TimeZone. Użyj ZoneId, ponieważ jest to właściwie bezpieczne dla wątków i możesz po prostu użyć końcowego statycznego pola do zapisania strefy.

LocalDateTime dateTime = LocalDateTime.of(2017, Month.JUNE, 1, 13, 39); 
ZonedDateTime.of(dateTime, ZoneId.of("ECT")).toInstant(); 
-2

myślę następujący kod powinien działać:

LocalDateTime time = LocalDateTime.of(2017, Month.JUNE, 15, 13, 39); 
    ZonedDateTime.of(time, TimeZone.getTimeZone("ZONE").toZoneId()).toInstant(); 

Po prostu trzeba wymienić „strefa” ze strefy czasowej trzeba.

+4

Nie, strefa czasowa jest klasą starszą, teraz zastąpioną przez ZoneId i ZoneOffset. Unikaj starszych klas daty i godziny. I na pewno nie mieszaj starszych klas z klasami Java. Popraw lub usuń swoją odpowiedź. –