tl; dr
LocalDate.of( 1985 , 1 , 1 )
…hoặc là…
LocalDate.of( 1985 , Month.JANUARY , 1 )
Chi tiết
Các java.util.Date
, java.util.Calendar
và java.text.SimpleDateFormat
các lớp đã được vội vàng quá nhanh khi Java lần đầu tiên ra mắt và phát triển. Các lớp học không được thiết kế hoặc thực hiện tốt. Những cải tiến đã được thử, do đó, sự phản đối mà bạn đã tìm thấy. Thật không may, những nỗ lực cải thiện phần lớn đã thất bại. Bạn nên tránh các lớp này hoàn toàn. Chúng được thay thế trong Java 8 bởi các lớp mới.
Các vấn đề trong mã của bạn
Một java.util.Date có cả ngày và phần thời gian. Bạn đã bỏ qua phần thời gian trong mã của bạn. Vì vậy, lớp Date sẽ bắt đầu ngày như được xác định bởi múi giờ mặc định của JVM của bạn và áp dụng thời gian đó cho đối tượng Date. Vì vậy, kết quả mã của bạn sẽ thay đổi tùy thuộc vào máy nào chạy hoặc múi giờ nào được đặt. Có lẽ không phải là những gì bạn muốn.
Nếu bạn chỉ muốn ngày, không có phần thời gian, chẳng hạn như ngày sinh, bạn có thể không muốn sử dụng một Date
đối tượng. Bạn có thể muốn lưu trữ chỉ một chuỗi ngày, ở định dạng ISO 8601 làYYYY-MM-DD
. Hoặc sử dụng một LocalDate
đối tượng từ Joda-Time (xem bên dưới).
Joda-Thời gian
Điều đầu tiên cần học trong Java: Tránh các lớp java.util.Date & java.util.CalWiki nổi tiếng rắc rối đi kèm với Java.
Như được ghi chú chính xác trong câu trả lời của user3277382 , hãy sử dụng Joda-Time hoặc mới gói java.time. * Mới trong Java 8.
Mã ví dụ trong Joda-Time 2.3
DateTimeZone timeZoneNorway = DateTimeZone.forID( "Europe/Oslo" );
DateTime birthDateTime_InNorway = new DateTime( 1985, 1, 1, 3, 2, 1, timeZoneNorway );
DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" );
DateTime birthDateTime_InNewYork = birthDateTime_InNorway.toDateTime( timeZoneNewYork );
DateTime birthDateTime_UtcGmt = birthDateTime_InNorway.toDateTime( DateTimeZone.UTC );
LocalDate birthDate = new LocalDate( 1985, 1, 1 );
Kết xuất giao diện điều khiển
System.out.println( "birthDateTime_InNorway: " + birthDateTime_InNorway );
System.out.println( "birthDateTime_InNewYork: " + birthDateTime_InNewYork );
System.out.println( "birthDateTime_UtcGmt: " + birthDateTime_UtcGmt );
System.out.println( "birthDate: " + birthDate );
Khi chạy đào
birthDateTime_InNorway: 1985-01-01T03:02:01.000+01:00
birthDateTime_InNewYork: 1984-12-31T21:02:01.000-05:00
birthDateTime_UtcGmt: 1985-01-01T02:02:01.000Z
birthDate: 1985-01-01
java.time
Trong trường hợp này, mã cho java.time gần giống với mã của Joda-Time .
Chúng ta có một múi giờ ( ZoneId
) và xây dựng một đối tượng thời gian được gán cho múi giờ đó ( ZonedDateTime
). Sau đó, sử dụng mẫu Đối tượng không thay đổi , chúng tôi tạo thời gian ngày mới dựa trên cùng một đối tượng cũ (tính số nano giây kể từ epoch ) nhưng được gán múi giờ khác. Cuối cùng, chúng tôi nhận được một LocalDate
cái không có múi giờ cũng như múi giờ mặc dù chú ý múi giờ được áp dụng khi xác định ngày đó ( ví dụ một ngày mới bắt đầu sớm hơn ở Oslo so với ở New York ).
ZoneId zoneId_Norway = ZoneId.of( "Europe/Oslo" );
ZonedDateTime zdt_Norway = ZonedDateTime.of( 1985 , 1 , 1 , 3 , 2 , 1 , 0 , zoneId_Norway );
ZoneId zoneId_NewYork = ZonedId.of( "America/New_York" );
ZonedDateTime zdt_NewYork = zdt_Norway.withZoneSameInstant( zoneId_NewYork );
ZonedDateTime zdt_Utc = zdt_Norway.withZoneSameInstant( ZoneOffset.UTC ); // Or, next line is similar.
Instant instant = zdt_Norway.toInstant(); // Instant is always in UTC.
LocalDate localDate_Norway = zdt_Norway.toLocalDate();
Giới thiệu về java.time
Các java.time khung được xây dựng vào Java 8 và sau đó. 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 di cư đến java.time lớp.
Để tìm hiểu thêm, 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 bạn. 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ầnjava.sql.*
lớp.
Nơi để có được các lớp java.time?
Các ThreeTen-Extra dự án mở rộng java.time với các lớp bổ sung. Dự án này là một nền tảng chứng minh cho các bổ sung có thể 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 .