tl; dr
myZonedDateTime.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR)
... và ...
myZonedDateTime.get(IsoFields.WEEK_BASED_YEAR)
Tránh thừa lớp ngày thời gian
Khi correct Answer by haraldK giải thích, các Calendar
định nghĩa của tuần thay đổi theo ngôn ngữ. Trong khi có ý tốt, điều này là khó hiểu.
Bạn nên tránh Calendar
và các lớp liên quan như Date
. Chúng hiện được thay thế bởi các lớp học java.time.
ISO 8601 tuần
Đối với ISO 8601 week, rõ ràng đó có nghĩa là:
- Ngày đầu tiên là Thứ Hai, chạy đến Chủ nhật.
- Số tuần một trong một năm dựa trên tuần chứa Thứ Năm đầu tiên của năm dương lịch.
- Một tuần dựa trên tuần có 52 hoặc 53 tuần.
- Số ngày đầu tiên/cuối cùng của năm dương lịch có thể xuất hiện trong năm trước đó/tuần tiếp theo.
java.time
Các java.time lớp bao gồm hỗ trợ hạn chế cho ISO 8601 standard weeks. Gọi phương thức get
trên các lớp khác nhau như LocalDate
và ZonedDateTime
. Vượt qua các triển khai TemporalField
được tìm thấy dưới dạng các hằng số trong lớp IsoFields
.
int week = myZonedDateTime.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR) ;
int weekBasedYear = myZonedDateTime.get(IsoFields.WEEK_BASED_YEAR) ;
ThreeTen-Extra
Thậm chí tốt hơn, thêm thư viện ThreeTen-Extra để dự án của bạn để sử dụng YearWeek
lớp.
org.threeten.extra.YearWeek yw = YearWeek.from(myZonedDateTime) ;
Cẩn thận với các thiết lập phần mềm lịch
Không bao giờ giả định nghĩa của một số tuần. Đảm bảo nguồn của một số như vậy có cùng định nghĩa về tuần với bạn, chẳng hạn như định nghĩa ISO 8601.
Ví dụ: Calendar app supplied by Apple với macOS mặc định theo định nghĩa lịch "Gregorian" trong tuần. Đối với những gì có nghĩa là, tôi không biết là tôi không thể tìm thấy bất kỳ tài liệu về ý định/định nghĩa của họ. Đối với các tuần ISO 8601, bạn phải change a setting away from default.
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.
Đó là ngôn ngữ cụ thể. Đặt 'Locale' thành' Locale.UK' mặc định, cho đúng tuần, 2. – haraldK
Nhưng điều đó sẽ thay đổi những thứ khác bên cạnh số tuần! –
Có, hãy xem câu trả lời của tôi bên dưới để có cách tiếp cận tốt hơn. :-) – haraldK