2014-11-21 17 views
6

Tôi có một chuỗi ngàyChuyển đổi ngày ISO8601 để unix timestamp trong java

String s = "2014-09-01T19:22:43.000Z"; 
    Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").parse(s); 

Nhưng tôi nhận được một ngoại lệ:

Exception in thread "main" java.text.ParseException: Unparseable date: "2014-09-01T19:22:43.000Z" 

Làm thế nào để chuyển đổi chuỗi trên để unix timestamp? Cảm ơn

+0

FYI, các lớp ngày giờ phiền hà cũ như ['java.util.Date'] (https://docs.oracle.com/javase/9/docs/api/java/util/Date.html) , ['java.util.Calendar'] (https://docs.oracle.com/javase/9/docs/api/java/util/Calendar.html) và' java.text.SimpleDateFormat' hiện là [legacy] (https://en.wikipedia.org/wiki/Legacy_system), được thay thế bởi [java.time] (https://docs.oracle.com/javase/9/docs/api/ Các lớp java/time/package-summary.html) được xây dựng trong Java 8 & Java 9. Xem [Hướng dẫn của Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

Trả lời

6

X được sử dụng cho ISO 8601 time zone trong SimpleDateFormat, không Z

định dạng đúng là "yyyy-MM-dd'T'HH:mm:ss.SSSX"

+1

Làm xước điều đó. 'X' phân tích' Z' thành Zulu. –

6

tl; dr

Làm thế nào để chuyển đổi chuỗi trên để unix timestamp?

Instant.parse("2014-09-01T19:22:43.000Z") 
     .getEpochSecond() 

java.time

Lớp java.time.Instant có thể phân tích chuỗi đầu vào của bạn với định dạng chuẩn của nó theo tiêu chuẩn ISO 8601. Không cần chỉ định mẫu định dạng.

Instant instant = Instant.parse("2014-09-01T19:22:43.000Z"); 

Để có được một số mili giây kể từ khi kỷ nguyên của Năm 1970:

long millisecondsSinceUnixEpoch = instant.toEpochMilli() ; 

Đối với toàn bộ giây kể từ kỷ nguyên của 1970-01-01T00: 00: 00Z:

long secondsSinceUnixEpoch = instant.getEpochSecond() ; 

Be nhận biết mất dữ liệu có thể khi chuyển sang mili giây hoặc toàn bộ giây. Các lớp java.time có độ phân giải nano giây, vì vậy bất kỳ micro giây hoặc nano giây nào hiện diện trong giá trị sẽ bị cắt ngắn.

Joda thời gian

Cập nhật Dự án Joda-Thời gian bây giờ là trong chế độ bảo trì. Nhóm này khuyên bạn nên di trú sang các lớp java.time.

Thư viện Joda-Time giúp công việc này dễ dàng hơn. Chuỗi tuân thủ ISO 8601 của bạn có thể được cấp trực tiếp cho nhà xây dựng Joda-Time. Việc xây dựng trong phân tích cú pháp dự đoán theo tiêu chuẩn ISO 8601.

DateTime dateTime = new DateTime("2014-09-01T19:22:43.000Z") ; 

Unix Timestamp

Ý anh là gì bởi một dấu thời gian Unix? Một số người có nghĩa là tổng số giây kể từ giây phút đầu tiên của năm 1970 UTC (Unix epoch) trong khi bỏ qua giây nhảy vọt (xem Unix Time). Một số người có nghĩa là một số mili giây hoặc độ phân giải khác.

Lưu ý việc sử dụng long nguyên thủy hơn là phổ biến hơn int.

Trong mili giây, hãy gọi getMillis().

long millisecondsSinceUnixEpoch = dateTime.getMillis(); 

Trong toàn bộ giây, chia cho 1.000. Xem xét nếu bạn muốn làm tròn hoặc cắt ngắn các số thập phân.


Thông thường tôi khuyên bạn nên chuyển đối tượng DateTimeZone cùng với chuỗi của bạn tới hàm tạo DateTime. Nhưng không cần thiết nếu tất cả các bạn muốn là một số kể từ thời đại.


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, Java 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 6Java 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
    • phiên bản sau của triển khai bó Android của các lớp java.time.
    • Đối với Android trước đó, dự án ThreeTenABP thích hợp ThreeTen-Backport (đã đề cập ở trên). Xem How to use ThreeTenABP….

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, YearQuartermore.

Các vấn đề liên quan