tl; dr
OffsetDateTime.now(ZoneOffset.ofHours(10) ).withHour(23)
Tránh thừa lớp ngày thời gian
Di sản các lớp học ngày thời gian bao gồm GregorianCalendar
là một khó hiểu. rắc rối, thiết kế kém lộn xộn. Tránh chúng. Bây giờ được thay thế bởi các lớp học java.time. Cụ thể, GregorianCalendar
được thay thế bằng ZonedDateTime
.
offset-từ-UTC
Bạn dường như muốn có một khoảnh khắc với một offset-from-UTC của mười giờ trước UTC. Xác định bù đắp mong muốn của bạn.
ZoneOffset offset = ZoneOffset.ofHours(10) ;
offset.toString(): 10: 00
Lấy thời điểm hiện tại như một OffsetDateTime
với điều đó bù đắp.
OffsetDateTime odt = OffsetDateTime.now(offset) ;
odt.toString(): 2018-02-15T16: 44: 44,216642 + 10: 00
Bạn muốn ghi đè giờ là 23
.
OffsetDateTime odt23 = odt.withHour(23) ;
odt23.toString(): 2018-02-15T23: 44: 44.216.642 + 10: 00
Múi giờ
Tôi đang cố gắng để thiết lập lĩnh vực HOUR_OF_DAY và thay đổi múi giờ của đối tượng ngày GregorianCalendar.
Không, bạn đang thay đổi offset-from-UTC, không phải là time zone.
Luôn sử dụng múi giờ tốt hơn là chỉ bù trừ, nếu bạn biết chắc chắn khu vực dự định. Múi giờ là lịch sử của những thay đổi trong quá khứ, hiện tại và tương lai đối với chênh lệch được sử dụng bởi những người ở một khu vực nhất định. Với múi giờ, bạn luôn có thể xác định độ lệch, nhưng không phải ngược lại.
Chỉ định proper time zone name trong định dạng của continent/region
, chẳng hạn như America/Montreal
, Africa/Casablanca
, hoặc Pacific/Auckland
. Không bao giờ sử dụng từ viết tắt 3-4 ký tự như EST
hoặc IST
vì chúng là không múi giờ thực, không được chuẩn hóa và thậm chí không độc đáo (!).
ZoneId z = ZoneId.of("Australia/Brisbane") ;
Ghi lại khoảnh khắc hiện tại trong đồng hồ treo tường nhìn thấy bởi những người trong khu vực đó.
ZonedDateTime zdt = ZonedDateTime.now(z) ;
Ghi đè giờ trong ngày.
ZonedDateTime zdt23 = zdt.withHour(23) ;
Về java.time
Khung java.time được xây dựng vào Java 8 và sau đó. Các lớp này thay thế các lớp học ngày giờ legacy phiền hà cũ như java.util.Date
, Calendar
, & SimpleDateFormat
.
Dự án Joda-Time, hiện đang ở maintenance mode, khuyên di chuyển đến các lớp java.time.
Để tìm hiểu thêm, hãy xem Oracle Tutorial. 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.
Sử dụng JDBC driver tương thích với JDBC 4.2 hoặc cao hơn, bạn có thể trao đổi java.time đối tượng trực tiếp với cơ sở dữ liệu của bạn. Không cần chuỗi và các lớp java.sql. *.
Nơi lấy các lớp java.time?
Dự án mở rộng ThreeTen-Extra 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 những bổ sung có thể có trong tương lai vào java.time. Bạn có thể tìm thấy một số lớp học hữu ích tại đây như Interval
, YearWeek
, YearQuarter
và more.