tl; dr
LocalDate.of( 2014 , 2 , 11 )
Jeśli nalegasz na używanie okropnej starej java.util.Date
klasy, przekonwertuj ją z nowoczesnych klas java.time .
java.util.Date
.from(
LocalDate
.of( 2014 , 2 , 11 )
.atStartOfDay(
ZoneId.of( "Africa/Tunis" )
)
.toInstant()
)
Detale
Jeśli chcesz „łatwego”, powinieneś używać nowego pakietu java.time w Javie 8 zamiast notorycznie kłopotliwych klas java.util.Date i .Calendar dołączonych do Javy.
java.time
Java.time ramy wbudowany w Java 8 i później wypiera kłopotliwe starych klas java.util.Date/.Calendar.
Tylko data
LocalDate
Klasa jest oferowana przez java.time reprezentować wartości daty-tylko bez time-of-day lub strefy czasowej. Do ustalenia daty potrzebna jest strefa czasowa, ponieważ nowy dzień zaczyna się wcześniej w Paryżu niż na przykład w Montrealu. ZoneId
Klasa jest dla stref czasowych.
ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
LocalDate today = LocalDate.now( zoneId );
Zrzuć na konsolę:
System.out.println ( "today: " + today + " in zone: " + zoneId );
dzisiaj: 26.11.2015 w strefie: Azja / Singapur
Lub użyj metody fabrycznej, aby określić rok, miesiąc, dzień.
LocalDate localDate = LocalDate.of( 2014 , Month.FEBRUARY , 11 );
localDate: 2014-02-11
Lub podaj miesiąc numer 1-12 zamiast DayOfWeek
obiektu wyliczenia.
LocalDate localDate = LocalDate.of( 2014 , 2 , 11 );
Strefa czasowa
A LocalDate
nie ma prawdziwego znaczenia, dopóki nie dostosujesz go do strefy czasowej. W java.time do wygenerowania ZonedDateTime
obiektu stosujemy strefę czasową . Oznacza to również porę dnia, ale o której godzinie? Zwykle warto iść na pierwszą chwilę dnia. Możesz pomyśleć, że oznacza to godzinę 00:00:00.000
, ale nie zawsze jest to prawdą z powodu czasu letniego (DST) i być może innych anomalii. Zamiast zakładać ten czas, prosimy java.time o określenie pierwszej chwili dnia przez telefon atStartOfDay
.
Określ prawidłową nazwę strefy czasowej w formacie continent/region
, takie jak America/Montreal
, Africa/Casablanca
lub Pacific/Auckland
. Nigdy nie używaj 3-4-literowego skrótu, takiego jak EST
lub, IST
ponieważ nie są to prawdziwe strefy czasowe, nie są standaryzowane, a nawet nie są unikalne (!).
ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
ZonedDateTime zdt = localDate.atStartOfDay( zoneId );
zdt: 2014-02-11T00: 00 + 08: 00 [Azja / Singapur]
UTC
Do pracy na zapleczu (logika biznesowa, baza danych, przechowywanie i wymiana danych) zwykle używamy strefy czasowej UTC . W java.time Instant
klasa reprezentuje moment na osi czasu w UTC. Obiekt Instant można wyodrębnić z ZonedDateTime przez wywołanie toInstant
.
Instant instant = zdt.toInstant();
natychmiastowy: 2014-02-10T16: 00: 00Z
Konwertować
Należy java.util.Date
całkowicie unikać używania klasy. Ale jeśli musisz współdziałać ze starym kodem, który nie został jeszcze zaktualizowany dla java.time , możesz konwertować tam iz powrotem. Spójrz na nowe metody konwersji dodane do starych klas.
java.util.Date d = java.util.from( instant ) ;
…i…
Instant instant = d.toInstant() ;
Informacje o java.time
Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak java.util.Date
, Calendar
, i SimpleDateFormat
.
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .
Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie ma potrzeby stosowania ciągów ani java.sql.*
klas. Hibernate 5 i JPA 2.2 obsługują java.time .
Skąd wziąć klasy java.time?
AKTUALIZACJA: Biblioteka Joda-Time jest teraz w trybie konserwacji i zaleca migrację do klas java.time . Zostawiam tę sekcję na miejscu dla historii.
Joda-Time
Po pierwsze, Joda-Time używa rozsądnej numeracji, więc luty 2
nie 1
. Inna sprawa, Joda-Time DateTime naprawdę zna swoją przypisaną strefę czasową w przeciwieństwie do java.util.Date, który wydaje się mieć strefę czasową, ale jej nie ma.
I nie zapomnij o strefie czasowej. W przeciwnym razie otrzymasz domyślną maszynę JVM.
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Singapore" );
DateTime dateTimeSingapore = new DateTime( 2014, 2, 11, 0, 0, timeZone );
DateTime dateTimeUtc = dateTimeSingapore.withZone( DateTimeZone.UTC );
java.util.Locale locale = new java.util.Locale( "ms", "SG" );
String output = DateTimeFormat.forStyle( "FF" ).withLocale( locale ).print( dateTimeSingapore );
Zrzuć na konsolę…
System.out.println( "dateTimeSingapore: " + dateTimeSingapore );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "output: " + output );
Po uruchomieniu…
dateTimeSingapore: 2014-02-11T00:00:00.000+08:00
dateTimeUtc: 2014-02-10T16:00:00.000Z
output: Selasa, 2014 Februari 11 00:00:00 SGT
Konwersja
Jeśli musisz przekonwertować na java.util.Date do użytku z innymi klasami…
java.util.Date date = dateTimeSingapore.toDate();