tl; dr
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString() // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.
2008-01-01T00: 00 + 01: 00 [Châu Âu / Paris]
Để tạo một Chuỗi ở định dạng mong muốn của bạn, hãy chuyển một DateTimeFormatter
.
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format( // Generate a String representing the object’s value.
DateTimeFormatter.ISO_LOCAL_DATE_TIME // Built-in predefined formatter close to what you want.
)
.replace( "T" , " " ) // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.
2008-01-01 00:00:00
Chi tiết
Các câu trả lời khác đúng, nhưng sử dụng các lớp ngày-giờ cũ hiện đã bị khuôn khổ java.time sửa chữa.
java.time
Khuôn khổ java.time được tích hợp trong Java 8 trở lên. Phần lớn chức năng của java.time được chuyển ngược sang Java 6 & 7 ( ThreeTen-Backport ) và được điều chỉnh thêm cho Android ( ThreeTenABP ).
Trước tiên, hãy thay đổi chuỗi đầu vào để tuân thủ phiên bản chuẩn của định dạng ISO 8601. Các định dạng tiêu chuẩn ISO 8601 được sử dụng theo mặc định trong các lớp java.time để phân tích cú pháp / tạo chuỗi đại diện cho các giá trị ngày-giờ. Chúng ta cần thay thế SPACE đó ở giữa bằng a T
.
String input = "2008-01-01 13:15:00".replace( " " , "T" ); // → 2008-01-01T13:15:00
Bây giờ chúng ta có thể phân tích cú pháp nó thành a LocalDateTime
, trong đó "Local" có nghĩa là không có địa phương cụ thể. Đầu vào thiếu bất kỳ thông tin lệch-từ-UTC hoặc múi giờ nào.
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString ()… 2008-01-01T13: 15: 00
Nếu bạn không quan tâm đến thời gian trong ngày hoặc múi giờ, thì hãy chuyển đổi thành a LocalDate
.
LocalDate ld = ldt.toLocalDate();
ld.toString ()… 2008-01-01
Khoảnh khắc đầu tiên trong ngày
Thay vào đó, nếu bạn muốn đặt thời gian trong ngày thành thời điểm đầu tiên trong ngày, hãy sử dụng một ZonedDateTime
lớp, sau đó chuyển đổi thành một LocalDate
đối tượng để gọi atStartOfDay
phương thức của nó . Hãy lưu ý rằng khoảnh khắc đầu tiên có thể không phải là thời điểm 00:00:00
do Giờ tiết kiệm ánh sáng ban ngày hoặc có thể là do những bất thường khác.
Múi giờ rất quan trọng bởi vì trong bất kỳ thời điểm nào, ngày khác nhau trên thế giới theo múi. Ví dụ, một vài khoảnh khắc sau nửa đêm ở Paris là một ngày mới đối với người Paris nhưng vẫn là “ngày hôm qua” ở Montréal đối với người Canada.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );
zdtStartOfDay.toString ()… 2008-01-01T00: 00: 00-05: 00 [Mỹ / Montreal]
UTC
Để xem khoảnh khắc đó qua thấu kính của múi giờ UTC , hãy trích xuất một Instant
đối tượng. Cả hai ZonedDateTime
và Instant
sẽ đại diện cho cùng một thời điểm trên dòng thời gian nhưng xuất hiện dưới dạng hai thời điểm đồng hồ treo tường khác nhau .
An Instant
là lớp khối xây dựng cơ bản trong java.time, luôn ở UTC theo định nghĩa. Sử dụng lớp này thường xuyên, vì bạn thường phải thực hiện logic nghiệp vụ, lưu trữ dữ liệu và trao đổi dữ liệu trong UTC.
Instant instant = zdtStartOfDay.toInstant();
Instant.toString ()… 2008-01-01T05: 00: 00Z
Chúng tôi thấy 5 giờ sáng chứ không phải nửa đêm. Ở định dạng tiêu chuẩn, Z
ở cuối là viết tắt của Zulu
và có nghĩa là "UTC".
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 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 để có 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 đó (<26), cá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 .