tl; dr
LocalDate.now().format(
DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM )
.withLocale( new Locale( "no" , "NO" ) )
)
Các lớp rắc rối của java.util.Date
và SimpleDateFormat
bây giờ là kế thừa, được thay thế bởi các lớp java.time.
LocalDate
Các LocalDate
lớp đại diện cho một giá trị ngày tháng chỉ mà không cần thời gian của ngày và không có múi giờ.
Múi giờ rất quan trọng trong việc xác định ngày. Đối với bất kỳ thời điểm nhất định nào, ngày thay đổi trên toàn cầu theo khu vực. Ví dụ: một vài phút sau nửa đêm ở Paris Pháp là một ngày mới trong khi vẫn là “ngày hôm qua” ở Montréal Québec .
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DateTimeFormatter
Sử dụng DateTimeFormatter
để tạo chuỗi chỉ đại diện cho phần ngày hoặc phần thời gian.
Các DateTimeFormatter
lớp có thể tự động khoanh vùng .
Để bản địa hóa, hãy chỉ định:
FormatStyle
để xác định độ dài hoặc viết tắt của chuỗi.
Locale
để xác định (a) ngôn ngữ của con người để dịch tên ngày, tên tháng, v.v., và (b) các chuẩn mực văn hóa quyết định các vấn đề về viết tắt, viết hoa, dấu câu, v.v.
Thí dụ:
Locale l = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( l );
String output = ld.format( f );
Đi theo hướng khác, bạn có thể phân tích cú pháp một chuỗi được bản địa hóa.
LocalDate ld = LocalDate.parse( input , f );
Lưu ý rằng ngôn ngữ và múi giờ là những vấn đề hoàn toàn trực giao. Bạn có thể có một khoảnh khắc Montréal được trình bày bằng tiếng Nhật hoặc một khoảnh khắc ở Auckland New Zealand được trình bày bằng tiếng Hindi.
Một ví dụ khác: Thay đổi 6 junio 2012
(tiếng Tây Ban Nha) thành 2012-06-06
( định dạng ISO 8601 tiêu chuẩn ). Các lớp java.time sử dụng các định dạng ISO 8601 theo mặc định để phân tích cú pháp / tạo chuỗi.
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();
Peruse các định dạng
Dưới đây là một số mã ví dụ để duyệt qua các kết quả của nhiều định dạng ở nhiều ngôn ngữ, được bản địa hóa tự động.
An EnumSet
là một triển khai Set
, được tối ưu hóa cao để sử dụng bộ nhớ thấp và tốc độ thực thi nhanh khi thu thập Enum
các đối tượng. Vì vậy, EnumSet.allOf( FormatStyle.class )
cung cấp cho chúng ta một tập hợp tất cả bốn FormatStyle
đối tượng enum để lặp. Để biết thêm thông tin, hãy xem Hướng dẫn của Oracle về các loại enum .
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() );
Đầu ra.
------| 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 »
Giới thiệu về java.time
Khung java.time được tích hợp sẵn trong Java 8 trở lên. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date
, Calendar
, & SimpleDateFormat
.
Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp.
Để tìm hiểu thêm, hãy xem Hướng dẫn Oracle . Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310 .
Bạn có thể trao đổi các đối tượng java.time trực tiếp với cơ sở dữ liệu của mình. Sử dụng trình điều khiển JDBC tương thích với JDBC 4.2 trở lên. Không cần chuỗi, không cần java.sql.*
lớp.
Lấy các lớp java.time ở đâu?
- Java SE 8 , Java SE 9 và mới hơn
- Được xây dựng trong.
- Một phần của API Java tiêu chuẩn với một triển khai đóng gói.
- Java 9 bổ sung một số tính năng nhỏ và các bản sửa lỗi.
- Java SE 6 và Java SE 7
- Phần lớn chức năng của java.time được chuyển ngược sang Java 6 & 7 trong ThreeTen-Backport .
- Android
- Các phiên bản triển khai gói Android mới hơn của các lớp java.time.
- Đối với Android trước đó, ThreeTenABP dự án thích nghi ThreeTen-backport (nêu trên). Xem Cách sử dụng ThreeTenABP… .
Các ThreeTen-Extra dự án mở rộng java.time với các lớp bổ sung. Dự án này là cơ sở chứng minh cho những bổ sung có thể có trong tương lai cho java.time. Bạn có thể tìm thấy một số các lớp học hữu ích ở đây chẳng hạn như Interval
, YearWeek
, YearQuarter
, và nhiều hơn nữa .
java.util.Date
,java.util.Calendar
vàjava.text.SimpleDateFormat
bây giờ là kế thừa , được thay thế bởi các lớp java.time được tích hợp trong Java 8 & Java 9. Xem Hướng dẫn của Oracle .