tl; dr
YearWeek.of(LocalDate.parse("2017-01-23"))
.getWeek() // and .getYear()
ISO 8601 tuần chuẩn
Nếu bạn muốn chuẩn ISO 8601 week, chứ không phải là một định nghĩa cục bộ của một tuần, sử dụng lớp YearWeek
tìm thấy trong các dự án ThreeTen-Extra có thêm chức năng đến các lớp java.time được tích hợp vào Java 8 trở lên.
ISO-8601 xác định tuần như thường bắt đầu từ thứ Hai. Tuần đầu tiên là tuần có Thứ Năm đầu tiên của năm dương lịch. Như vậy, tuần dựa trên năm được sử dụng trong lớp này không phù hợp với năm dương lịch.
Đầu tiên, nhận ngày hôm nay. Lớp LocalDate
đại diện cho giá trị chỉ ngày mà không có thời gian trong ngày và không có múi giờ.
Múi giờ rất quan trọng trong việc xác định ngày. Đối với bất kỳ thời điểm cụ thể nào, ngày thay đổi trên toàn cầu theo múi giờ. Ví dụ: một vài phút sau nửa đêm ở Paris France là một ngày mới trong khi vẫn “ngày hôm qua” trong Montréal Québec.
Chỉ định proper time zone name ở định dạng 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("America/Montreal");
LocalDate today = LocalDate.now(z);
Hoặc để người dùng chỉ định ngày bằng cách nhập chuỗi. Đầu vào chuỗi phân tích cú pháp của một ngày được bao gồm trong nhiều các câu hỏi và câu trả lời khác. Đơn giản nhất là để người dùng sử dụng định dạng chuẩn ISO 8601, YYYY-MM-DD chẳng hạn như 2017-01-23
.
LocalDate ld = LocalDate.parse("2017-01-23") ;
Đối với các định dạng khác, hãy chỉ định DateTimeFormatter
để phân tích cú pháp. Tìm kiếm Stack Overflow cho nhiều ví dụ về việc sử dụng lớp đó.
DateTimeFormatter f = DateTimeFormatter.ofPattern("d/M/uuuu" , Locale.US) ;
LocalDate ld = LocalDate.parse("1/23/2017" , f) ;
Lấy YearWeek
.
YearWeek yw = YearWeek.of(ld) ;
Để tạo chuỗi, hãy xem xét sử dụng standard ISO 8601 format for year-week, yyyy-Www chẳng hạn như 2017-W45
. Hoặc bạn có thể trích xuất từng số.
YearWeek::getWeek
- Lấy trường hàng tuần theo năm.
YearWeek::getYear
- Nhận trường dựa trên tuần.
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.
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.
Bạn cần phải phân tích các đầu vào với một định dạng cụ thể. Điều này có thể giúp: http://stackoverflow.com/questions/3386520/parse-date-from-string-in-this-format-dd-mm-yyyy-to-dd-mm-yyyy –
FYI, ngày cũ phiền hà các lớp thời gian như ['java.util.Date'] (https://docs.oracle.com/javase/8/docs/api/java/util/Date.html), [' java.util.Calendar' ] (https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html) và 'java.text.SimpleTextFormat' hiện là [legacy] (https: //en.wikipedia) .org/wiki/Legacy_system), được thay thế bởi các lớp [java.time] (https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). Xem [Hướng dẫn của Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –