tl; dr
ZonedDateTime.parse(
"Friday, September 26, 2008 8:30 PM Eastern Daylight Time" ,
DateTimeFormatter.ofPattern("EEEE, MMMM d, uuuu h:m a zzzz")
).getZone()
java.time
Cách hiện đại với các lớp java.time. Câu hỏi và các câu trả lời khác sử dụng các lớp thời gian cũ di sản phiền hà hoặc dự án Joda-Time, cả hai đều được thay thế bởi các lớp java.time.
Xác định đối tượng DateTimeFormatter
với mẫu định dạng để khớp với dữ liệu của bạn.
DateTimeFormatter f = DateTimeFormatter.ofPattern("EEEE, MMMM d, uuuu h:m a zzzz");
chỉ định ngôn ngữ của con người tên và ngày tháng, cũng như định mức văn hóa cho các vấn đề định dạng khác.
f = f.withLocale(Locale.US);
Cuối cùng, thực hiện phân tích cú pháp để nhận đối tượng ZonedDateTime
.
String input = "Friday, September 26, 2008 8:30 PM Eastern Daylight Time" ;
ZonedDateTime zdt = ZonedDateTime.parse(input , f);
zdt.toString(): 2008-09-26T20: 30-04: 00 [America/New_York]
Bạn có thể yêu cầu các múi giờ từ ZonedDateTime
, biểu diễn dưới dạng một đối tượng ZoneId
. Sau đó, bạn có thể thẩm vấn ZoneId
nếu bạn cần thêm thông tin về múi giờ.
ZoneId z = zdt.getZone();
See for yourself in IdeOne.com.
ISO 8601
Tránh trao đổi dữ liệu ngày-thời gian trong loại dạng khủng khiếp. Không giả sử tiếng Anh, không truy cập đầu ra của bạn với những thứ như tên trong ngày và không bao giờ sử dụng các múi giờ giả như Eastern Daylight Time
.
Đối với múi giờ: 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 không phải là múi giờ thực, không được chuẩn hóa và không phải là duy nhất (!).
Để tuần tự hóa các giá trị ngày giờ thành văn bản, chỉ sử dụng các định dạng ISO 8601. Các lớp java.time sử dụng các định dạng này theo mặc định khi phân tích cú pháp/tạo chuỗi để biểu diễn giá trị của chúng.
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 sang 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?
- Java SE 8 và SE 9 và sau
- Built-in.
- Một phần của API Java chuẩn với gói được triển khai.
- Java 9 thêm một số tính năng và bản sửa lỗi nhỏ.
- Java SE 6 và SE 7
- Hầu hết các chức năng java.time được back-chuyển đến Java 6 & 7 trong ThreeTen-Backport.
- Android
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ó giải pháp cho vấn đề này không? – Chin2
Về đoạn cuối, các lớp 'Ngày' &' Lịch' là một mớ hỗn độn đẫm máu: kém thiết kế, khó hiểu và phiền hà. Tránh chúng. Sử dụng các lớp [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) để thay thế. –