tl; д-р
LocalDate.now().format(
DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM )
.withLocale( new Locale( "no" , "NO" ) )
)
Неспокійний класи java.util.Dateі SimpleDateFormatтепер спадщина, витіснили класи java.time.
LocalDate
LocalDateКлас являє собою дату тільки значення без часу доби і без часового поясу.
Часовий пояс має вирішальне значення для визначення дати. У будь-який даний момент дата змінюється по всьому світу в залежності від зони. Наприклад, кілька хвилин після опівночі у Парижі, Франція - це новий день, ще вчора у Росії Монреалі в Квебеку .
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DateTimeFormatter
Використовуйте DateTimeFormatterдля генерації рядків, що представляють лише дату або частину часу.
DateTimeFormatterКлас може автоматично локалізувати .
Для локалізації вкажіть:
FormatStyle щоб визначити, якою довжиною або скороченням має бути рядок.
Locale визначити (а) людську мову для перекладу назви дня, назви місяця тощо, та (б) культурні норми, що вирішують питання абревіатури, написання великих літер, пунктуації тощо.
Приклад:
Locale l = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( l );
String output = ld.format( f );
В іншому напрямку ви можете проаналізувати локалізований рядок.
LocalDate ld = LocalDate.parse( input , f );
Зверніть увагу, що локаль та часовий пояс є повністю ортогональними проблемами. Ви можете подарувати момент Монреаля японською мовою або момент Окленда Нової Зеландії мовою хінді.
Інший приклад: змініть 6 junio 2012(іспанську) на 2012-06-06(стандартний формат ISO 8601 ). Класи java.time використовують типово формати ISO 8601 для синтаксичного аналізу / генерації рядків.
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();
Перегляньте формати
Ось приклад коду для перегляду результатів декількох форматів у декількох локалях, які автоматично локалізуються.
Це EnumSetреалізація Set, високо оптимізована як для низького використання пам'яті, так і для швидкої швидкості виконання при збиранні Enumоб'єктів. Отже, EnumSet.allOf( FormatStyle.class )ми отримуємо колекцію всіх чотирьох перерахованих FormatStyleоб’єктів для циклу. Для отримання додаткової інформації див. Підручник Oracle щодо типів перечислення .
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() );
Вихідні дані.
------| 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 »
Про java.time
Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date, Calendar, і SimpleDateFormat.
Проект Joda-Time , який зараз перебуває в режимі обслуговування , радить перейти на класи java.time .
Щоб дізнатись більше, див. Підручник Oracle . І шукайте в Stack Overflow багато прикладів та пояснень. Специфікація - JSR 310 .
Ви можете обмінювати об'єкти java.time безпосередньо з базою даних. Використовуйте драйвер JDBC, сумісний з JDBC 4.2 або новішою. Не потрібні рядки, не потрібні java.sql.*класи.
Де отримати класи java.time?
Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є полігоном для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval, YearWeek, YearQuarter, і більш .
java.util.Date,java.util.Calendarіjava.text.SimpleDateFormatтепер є застарілими , витіснені класами java.time, вбудованими в Java 8 і Java 9. Див. Підручник Oracle .