2014-10-23 12 views
6

Tôi khá ngạc nhiên khi tôi chưa tìm thấy một cách thực sự dễ dàng xem xét mức độ thường xuyên ISO8601 được sử dụng trong JSON.Làm thế nào để chuyển đổi định dạng ISO8601 thành mili giây?

Về cơ bản, tôi lấy một chuỗi trông giống như sau: 2014-10-23T00:35:14.800Z và chuyển đổi thành dạng như 50 minutes ago.

Trước tiên, tôi phải thay đổi 2014-10-23T00:35:14.800Z thành 2014-10-23'T'00:35:14.800Z, sau đó tôi cần chuyển đổi nó thành mili giây, sau đó rất dễ dàng.

mã hiện tại của tôi:

private void setTimestamp(String timeCreated) { 
    int indexOfT = timeCreated.indexOf('T'); 

    String properFormat = new StringBuilder(timeCreated).insert(indexOfT + 1, "'") 
                 .insert(indexOfT, "'") 
                 .toString(); 

    timeStamp = (String) DateUtils.getRelativeTimeSpanString(Long.parseLong(properFormat), 
            System.currentTimeMillis(), 
            DateUtils.SECONDS_IN_MILLIS); 
} 

Thủ phạm chính là Long.parseLong(properFormat). Tôi cần chuyển đổi properFormat thành mili giây.

+0

Xem [Thời gian Joda] (http://joda-time.sourceforge.net/cal_iso.html). –

+1

Nếu bạn sử dụng Java 8, bạn có thể tìm thấy [thảo luận này] (http://programmers.stackexchange.com/questions/225343/why-are-the-java-8-java-time-classes-missing-a-getmillis -method) thú vị. –

+0

Vui lòng cho tôi biết lý do bạn đã bỏ phiếu này xuống. – David

Trả lời

6

tl; dr

Instant.parse("2014-10-23T00:35:14.800Z") 
     .toEpochMilli() 

One-Liner Trong java.time

Khung java.time được xây dựng vào Java 8 và sau đó. Các lớp mới này thay thế các lớp ngày tháng cũ đi kèm với các phiên bản Java sớm nhất như java.util.Date/.Calendar. Xem Tutorial. Các lớp java.time cũng thay thế thư viện thành công rất cao Joda-Time, được xây dựng bởi một số người giống nhau kể cả được dẫn dắt bởi cùng một Stephen Colbourne.

An Instant là thời điểm trên dòng thời gian ở UTC với độ phân giải nanoseconds. Bạn có thể ask it for a count of milliseconds từ số epoch (khoảnh khắc đầu tiên của năm 1970 ở số UTC). Nhưng hãy nhớ rằng Instant có thể có dữ liệu bổ sung, nano giây trở nên mịn hơn mili giây. Vì vậy, bạn có thể bị mất dữ liệu trong phần nhỏ đó của một phần nhỏ của giây.

Lớp java.time sử dụng định dạng chuẩn ISO 8601 khi phân tích cú pháp/tạo chuỗi. Không cần chỉ định mẫu định dạng. Lớp Instant có thể directly parse một chuỗi.

Instant.parse("2014-10-23T00:35:14.800Z") 

Bạn có thể chuyển đổi đó để một số mili giây kể từ khi kỷ nguyên của giây phút đầu tiên của năm 1970 tại UTC bằng cách gọi toEpochMilli

Hãy nhận biết của mất mát dữ liệu có thể là lớp Instant thể giữ nano giây. Vì vậy, việc giải nén mili giây sẽ cắt ngắn bất kỳ micro giây hoặc nano giây nào trong bất kỳ giây phân số nào. Chuỗi ví dụ của bạn chỉ có ba chữ số trong phân số thứ hai, vì vậy đó chỉ là mili giây. Nhưng sáu hoặc chín chữ số thập phân sẽ bị cắt bớt thành ba khi được chuyển đổi thành số mili giây.

long millisFromEpoch = Instant.parse("2014-10-23T00:35:14.800Z").toEpochMilli(); 

Để có thời gian trôi qua về số giờ-phút-giây, hãy sử dụng lớp Duration. Hãy cho phương thức between của mình một đôi thời gian.

Duration duration = Duration.between(Instant.parse("2014-10-23T00:35:14.800Z") , Instant.now()); 

One-Liner Trong Joda thời gian

UPDATE: Dự án Joda thời gian là trong chế độ bảo trì, với đội ngũ tư vấn chuyển đổi sang các lớp java.time.

Với thư viện Joda-Time 2.5:

long millisSinceEpoch = new DateTime("2014-10-23T00:35:14.800Z").getMillis(); 

Joda thời gian phân tích và tạo ra chuỗi ISO 8601 theo mặc định. Joda-Time hoạt động trong Android. Các lớp java.util.Date/.Calendar nổi tiếng phiền hà, khó hiểu và thiếu sót. Tránh chúng.

+0

Tôi nghĩ rằng tôi chắc chắn sẽ sử dụng điều này. Có vẻ như một thợ may được làm cho những ngày của tôi. – David

+0

Down-cử tri: Xin vui lòng để lại một lời chỉ trích cùng với phiếu bầu của bạn, đặc biệt là trên một câu trả lời được chấp nhận. –

2

Vì vậy, hóa ra câu trả lời đơn giản hơn tôi tưởng tượng.

private void setTimestamp(String timeCreated) { 
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
    try { 
     Date timeCreatedDate = dateFormat.parse(timeCreated); 
     timeStamp = (String) DateUtils.getRelativeTimeSpanString(timeCreatedDate.getTime(), 
            System.currentTimeMillis(), 
            DateUtils.SECONDS_IN_MILLIS); 
    } catch (ParseException e) {} 
} 

Điều đó sẽ hiệu quả.

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