tl; dr
LocalDate.now().format(
DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM )
.withLocale( new Locale( "no" , "NO" ) )
)
Kłopotliwego klasy java.util.Date
i SimpleDateFormat
są teraz Legacy, wyparta przez klasy java.time.
LocalDate
LocalDate
Klasa reprezentuje wartość data-tylko bez time-of-day i bez strefy czasowej.
Strefa czasowa ma kluczowe znaczenie przy ustalaniu daty. W dowolnym momencie data różni się na całym świecie według strefy. Na przykład kilka minut po północy Paryżu Francja jest nowym dniem, podczas gdy w Montrealu Quebec wciąż trwa „wczoraj” .
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DateTimeFormatter
Służy DateTimeFormatter
do generowania ciągów reprezentujących tylko część daty lub część czasu.
DateTimeFormatter
Klasa może automatycznie zlokalizować .
Aby zlokalizować, określ:
FormatStyle
aby określić, jak długi lub jak skrócony powinien być ciąg.
Locale
określenie (a) języka ludzkiego do przetłumaczenia nazwy dnia, nazwy miesiąca itp. oraz (b) norm kulturowych decydujących o kwestiach skrótów, wielkich liter, interpunkcji i tym podobnych.
Przykład:
Locale l = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( l );
String output = ld.format( f );
Idąc w drugą stronę, możesz przeanalizować zlokalizowany ciąg.
LocalDate ld = LocalDate.parse( input , f );
Zwróć uwagę, że ustawienia regionalne i strefa czasowa są całkowicie ortogonalne. Możesz mieć moment z Montrealu przedstawiony w języku japońskim lub moment z Auckland w Nowej Zelandii przedstawiony w języku hindi.
Inny przykład: Zmień 6 junio 2012
(hiszpański) na 2012-06-06
(standardowy format ISO 8601 ). Klasy java.time używają domyślnie formatów ISO 8601 do analizowania / generowania ciągów.
String input = "6 junio 2012";
Locale l = new Locale ( "es" , "ES" );
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "d MMMM uuuu" , l );
LocalDate ld = LocalDate.parse ( input , f );
String output = ld.toString();
Przeglądaj formaty
Oto przykładowy kod do przeglądania wyników w wielu formatach w wielu lokalizacjach, automatycznie zlokalizowany.
An EnumSet
to implementacja Set
wysoce zoptymalizowana zarówno pod kątem niskiego zużycia pamięci, jak i dużej szybkości wykonywania podczas zbierania Enum
obiektów. Więc EnumSet.allOf( FormatStyle.class )
daje nam kolekcję wszystkich czterech FormatStyle
obiektów enum do zapętlenia. Aby uzyskać więcej informacji, zobacz samouczek Oracle dotyczący typów wyliczeń .
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 );
List < Locale > locales = new ArrayList <>( 3 );
locales.add( Locale.CANADA_FRENCH );
locales.add( new Locale( "no" , "NO" ) );
locales.add( Locale.US );
for ( Locale locale : locales )
{
System.out.println( "------| LOCALE: " + locale + " — " + locale.getDisplayName() + " |----------------------------------" + System.lineSeparator() );
for ( FormatStyle style : EnumSet.allOf( FormatStyle.class ) )
{
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( style ).withLocale( locale );
String output = ld.format( f );
System.out.println( output );
}
System.out.println( "" );
}
System.out.println( "« fin »" + System.lineSeparator() );
Wynik.
------| LOCALE: fr_CA — French (Canada) |----------------------------------
mardi 23 janvier 2018
23 janvier 2018
23 janv. 2018
18-01-23
------| LOCALE: no_NO — Norwegian (Norway) |----------------------------------
tirsdag 23. januar 2018
23. januar 2018
23. jan. 2018
23.01.2018
------| LOCALE: en_US — English (United States) |----------------------------------
Tuesday, January 23, 2018
January 23, 2018
Jan 23, 2018
1/23/18
« fin »
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
.
Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .
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 .
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.
Skąd wziąć klasy java.time?
- Java SE 8 , Java SE 9 i nowsze
- Wbudowany.
- Część standardowego interfejsu API języka Java z dołączoną implementacją.
- Java 9 dodaje kilka drobnych funkcji i poprawek.
- Java SE 6 i Java SE 7
- Wiele funkcji java.time jest przenoszonych z powrotem do Javy 6 i 7 w ThreeTen-Backport .
- Android
- Późniejsze wersje pakietów systemu Android implementacji klas java.time.
- Na wcześniejszym Androidzie ThreeTenABP projekt dostosowuje ThreeTen-backportu (wymienione powyżej). Zobacz Jak używać ThreeTenABP… .
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak Interval
, YearWeek
, YearQuarter
, i więcej .
java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz starsze , zastąpione przez klasy java.time wbudowane w Java 8 i Java 9. Zobacz samouczek Oracle .