tl; dr
LocalDateTime.parse(
"2016-01-23 12:34".replace( " " , "T" )
)
.atZone( ZoneId.of( "Asia/Karachi" ) )
.plusMinutes( 10 )
java.time
Sử dụng các lớp java.time tuyệt vời cho công việc ngày giờ. Các lớp này thay thế các lớp ngày-giờ cũ rắc rối như java.util.Date
và java.util.Calendar
.
ISO 8601
Các lớp java.time sử dụng các định dạng ISO 8601 tiêu chuẩn theo mặc định để phân tích cú pháp / tạo các chuỗi giá trị ngày-giờ. Để làm cho chuỗi đầu vào của bạn tuân thủ, hãy thay thế dấu cách ở giữa bằng một T
.
String input = "2016-01-23 12:34" ;
String inputModified = input.replace( " " , "T" );
LocalDateTime
Phân tích cú pháp chuỗi đầu vào của bạn dưới dạng chuỗi ký tự vì LocalDateTime
nó thiếu bất kỳ thông tin nào về múi giờ hoặc offset-from-UTC.
LocalDateTime ldt = LocalDateTime.parse( inputModified );
Thêm mười phút.
LocalDateTime ldtLater = ldt.plusMinutes( 10 );
ldt.toString (): 2016-01-23T12: 34
ldtLater.toString (): 2016-01-23T12: 44
Xem mã trực tiếp trong IdeOne.com .
Không LocalDateTime
có múi giờ, vì vậy nó không đại diện cho một điểm trên dòng thời gian. Áp dụng múi giờ để dịch sang một thời điểm thực tế. Chỉ định một tên múi giờ thích hợp trong các định dạng của continent/region
, chẳng hạn như America/Montreal
, Africa/Casablanca
hoặc Pacific/Auckland
, hoặc Asia/Karachi
. Không bao giờ sử dụng từ viết tắt 3-4 chữ cái như EST
hoặc IST
hoặc PKT
vì chúng không phải là múi giờ thực, không được tiêu chuẩn hóa và thậm chí không phải là duy nhất (!).
ZonedDateTime
Nếu bạn biết múi giờ dự định cho giá trị này, hãy áp dụng a ZoneId
để nhận được a ZonedDateTime
.
ZoneId z = ZoneId.of( "Asia/Karachi" );
ZonedDateTime zdt = ldt.atZone( z );
zdt.toString (): 2016-01-23T12: 44 + 05: 00 [Châu Á / Karachi]
Dị thường
Hãy nghĩ xem nên thêm mười phút đó trước hay sau khi thêm múi giờ. Bạn có thể nhận được một kết quả rất khác do các điểm bất thường như Giờ tiết kiệm ánh sáng ban ngày (DST) làm thay đổi thời gian trên đồng hồ treo tường .
Việc bạn nên thêm 10 phút trước hay sau khi thêm vùng phụ thuộc vào ý nghĩa của kịch bản và quy tắc kinh doanh của bạn.
Mẹo: Khi bạn dự định một thời điểm cụ thể trên dòng thời gian, hãy luôn giữ thông tin múi giờ . Đừng làm mất thông tin đó, như đã làm với dữ liệu đầu vào của bạn. Giá trị 12:34
có nghĩa là buổi trưa ở Pakistan hoặc buổi trưa ở Pháp hoặc buổi trưa ở Québec? Nếu bạn muốn nói buổi trưa ở Pakistan, hãy nói như vậy bằng cách bao gồm ít nhất là offset-from-UTC ( +05:00
), và tốt hơn nữa là tên của múi giờ ( Asia/Karachi
).
Instant
Nếu bạn muốn có khoảnh khắc giống như được nhìn qua lăng kính của UTC , hãy trích xuất một Instant
. Các Instant
lớp đại diện cho một thời điểm trên Timeline trong UTC với độ phân giải nano giây (lên đến chín (9) chữ số của một phân số thập phân).
Instant instant = zdt.toInstant();
Đổi
Tránh các lớp ngày-giờ cũ rắc rối bất cứ khi nào có thể. Nhưng nếu phải, bạn có thể chuyển đổi. Gọi các phương thức mới được thêm vào các lớp cũ.
java.util.Date utilDate = java.util.Date.from( instant );
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 java.time.
Để 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 .
Lấy các lớp java.time ở đâu?
- Java SE 8 và SE 9 trở lên
- Được xây dựng trong.
- Một phần của API Java tiêu chuẩn với triển khai theo 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à 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 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 .