tl; dr
LocalDateTime.parse( // Parse string as value without time zone.
"2017-01-23 12:34 PM" ,
DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm a")
).atZone(ZoneId.of("America/Montreal")) // Assign time zone.
.toString() // Generate string: 2017-01-23T17:34:00Z
.replace("T" , " ") // Substitute SPACE for 'T' in middle.
.replace("Z" , " Z") // Insert SPACE before 'Z'.
Tránh thừa lớp ngày thời gian
Các câu trả lời khác sử dụng các lớp rắc rối cũ ngày-thời gian (Date
, Calendar
, vv), bây giờ di sản, thay thế bởi sự các lớp java.time.
LocalDateTime
Tôi có một chuỗi trong mô hình hh yyyy-MM-dd: mm a
một chuỗi đầu vào như vậy thiếu bất kỳ dấu hiệu của bù đắp-từ-UTC hoặc múi giờ. Vì vậy, chúng tôi phân tích cú pháp là LocalDateTime
.
Xác định mẫu định dạng để khớp với thông tin nhập của bạn với đối tượng DateTimeFormatter
.
String input = "2017-01-23 12:34 PM" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm a");
LocalDateTime ldt = LocalDateTime.parse(input , f);
ldt.toString(): 2017-01-23T12: 34
Lưu ý rằng một LocalDateTime
là không một thời điểm cụ thể, chỉ có một ý tưởng mơ hồ về một loạt các khoảnh khắc tốt . Ví dụ, một vài phút sau nửa đêm ở Paris Pháp vẫn là "ngày hôm qua" ở Montréal Canada. Vì vậy, không có bối cảnh của một múi giờ như Europe/Paris
hoặc America/Montreal
, chỉ cần nói "một vài phút sau nửa đêm" không có ý nghĩa.
ZoneId
và tôi có thể nhận được các đối tượng múi giờ riêng biệt, trong đó các chuỗi trên đại diện cho ngày tháng.
Múi giờ được thể hiện bằng lớp ZoneId
.
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");
ZonedDateTime
Áp dụng ZoneId
để có được một ZonedDateTime
mà thực sự là một điểm trên dòng thời gian, một thời điểm cụ thể trong lịch sử.
ZonedDateTime zdt = ldt.atZone(z);
zdt.toString(): 2017-01-23T12: 34-05: 00 [America/Montreal]
Instant
Tôi muốn chuyển đổi này để định dạng dưới đây. yyyy-MM-dd HH: mm: ss Z
Đầu tiên, hãy biết rằng một ký tự chữ Z
là viết tắt của Zulu
và phương tiện UTC. Nói cách khác, một số offset-from-UTC trong số 0 giờ, +00:00
.
Lớp Instant
đại diện cho một thời điểm trên dòng thời gian ở UTC với độ phân giải nanoseconds (tối đa chín (9) chữ số thập phân).
Bạn có thể trích xuất đối tượng Instant
từ một số ZonedDateTime
.
Instant instant = zdt.toInstant(); // Extracting the same moment but in UTC.
Để tạo một chuỗi trong định dạng chuẩn ISO 8601, chẳng hạn như 2017-01-22T18:21:13.354Z
, gọi toString
. Định dạng chuẩn không có dấu cách, sử dụng số T
để tách ngày tháng theo năm từ phút thứ hai và thêm Z
theo phương thức kinh điển để bù trừ số không.
String output = instant.toString();
instant.toString(): 2017-01-23T17: 34: 00Z
tôi khuyên bạn sử dụng định dạng tiêu chuẩn bất cứ khi nào có thể. Nếu bạn nhấn mạnh vào việc sử dụng dấu cách như trong định dạng mong muốn đã nêu của bạn, hãy xác định mẫu định dạng của riêng bạn trong đối tượng DateTimeFormatter
hoặc chỉ thực hiện thao tác chuỗi trên đầu ra của Instant::toString
.
String output = instant.toString()
.replace("T" , " ") // Substitute SPACE for T.
.replace("Z" , " Z"); // Insert SPACE before Z.
đầu ra: 2017/01/23 17:34:00 Z
Hãy thử code live at IdeOne.com này.
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?
- 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.
http://joda-time.sourceforge.net/ làm cho tất cả các thao tác ngày trong java dễ dàng hơn nhiều nhiều – NimChimpsky
@Emil tôi đã biết tính năng này sau khi bạn nói :), Cảm ơn. – John
FYI, dự án [Joda-Time] (http://www.joda.org/joda-time/) hiện đang ở [chế độ bảo trì] (https://en.wikipedia.org/wiki/Maintenance_mode), với nhóm cố vấn di chuyển đến các lớp [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). –