2015-06-23 16 views
6

Tôi có một dấu thời gian trong json là từ một máy chủ Linux. Tôi muốn chuyển đổi nó thành một định dạng ngày tháng đơn giản bằng cách sử dụng Java.Làm thế nào để chuyển đổi một dấu thời gian trong JSON thành ngày và giờ bình thường trong java?

tôi cần ngày và thời gian theo định dạng sau: hh dd-mm-yyyy: mm: ss

đây là dữ liệu JSON của tôi:

[ 
    { 
    "batch_date": 1419038000 
    }, 
    { 
    "batch_date": 1419037000 
    } 
] 
+0

Bạn phân tích cú pháp Json như thế nào? Hãy xem gson hoặc jackson – beresfordt

+1

@pavankumarparasa Vui lòng tránh đăng thông tin và dữ liệu không liên quan. Giảm thiểu kịch bản của bạn ở mức tối thiểu cần thiết để chứng minh vấn đề của bạn. Xem [Cách tạo một ví dụ tối thiểu, đầy đủ và có thể xác minh được] (http://stackoverflow.com/help/mcve). –

Trả lời

7

Ngày batch

"batch_date": 1419038000, 

trông giống giây từ epoch,

vậy

new Date (batch_date * 1000); 

sau đó sử dụng SimpleDateFormat nên làm các trick

SimpleDateFormat sfd = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); 

- Mã -

long batch_date = 1419038000; 
    Date dt = new Date (batch_date * 1000); 

    SimpleDateFormat sfd = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); 
    System.out.println(sfd.format(dt)); 

- đầu ra -

20-12-2014 10:13:20 
+0

Bạn có nghĩa là 'HH', không phải' hh'. –

+0

cố định cảm ơn bạn –

+0

@ScaryWombat chúng ta có thể đọc dấu thời gian không? mà không sử dụng các DateFormats này. Ý tôi là chỉ bằng cách nhìn vào nó, chúng ta có thể nói năm nào hoặc tháng hay ngày nào nó giống nhau. – Prabs

-3

khi chúng ta muốn đọc/phân tích một chuỗi giá trị như ngày, chúng ta nên biết định dạng ngày của chuỗi đầu vào đó, nếu không chúng ta sẽ nhận được sai da giá trị te.

batch_date: 1419038000 định dạng ngày của giá trị này là gì?

Nếu chúng tôi muốn nhận giá trị ngày theo định dạng bắt buộc như trong trường hợp 'dd-mm-yyyy hh: mm: ss' của bạn. có hai cách có thể.

1) yêu cầu giá trị batch_date phải ở định dạng bắt buộc của bạn. hoặc

2) nếu giá trị batch_date là định dạng khác, chúng ta phải biết định dạng ban đầu và xây dựng đối tượng Ngày với định dạng ban đầu bằng phương pháp phân tích cú pháp SimpleDateFormat và sau đó chuyển đổi thành định dạng bắt buộc bằng phương pháp định dạng SimpleDateFormat khác.

3

Không có loại dữ liệu như vậy

Không có điều nào như "dấu thời gian JSON". JSON có very few defined data types. Không có loại ngày tháng trong số đó.

Với trạng thái correct Answer do Trạng thái Wombat đáng sợ, số của bạn rõ ràng là tổng số giây từ kỷ nguyên Unix năm 1970. Lớp java.util.Date theo dõi thời gian bằng mili giây kể từ Unix epoch, thay vì toàn bộ giây. Vì vậy, bạn cần nhân với 1.000. Bạn cũng cần xử lý long số nguyên (64 bit) thay vì int (32 bit). Thêm một chữ hoa L vào các chữ số, và khai báo bất kỳ biến nào là long.

Lớp java.util.Date/.Calendar nổi tiếng là rắc rối. Chúng được thay thế bởi java.time package được tích hợp vào Java 8 trở lên và/hoặc thư viện Joda-Time của bên thứ ba.

Các thư viện xử lý JSON khác nhau hỗ trợ các trình biến đổi để tạo các đối tượng java.time hoặc Joda-Time. Hoặc bạn có thể thực hiện chuyển đổi trong mã của mình, được hiển thị bên dưới.

Lưu ý rằng cả java.time và Joda-Time đều hỗ trợ gán múi giờ. Mã dưới đây chỉ định UTC cho mục đích trình diễn, nhưng bạn có thể chỉ định vùng mong muốn/mong đợi của mình.

Joda thời gian

Dưới đây là một số mã trong Joda-Time 2.8.1 cho thấy việc sử dụng các số đầu vào của bạn là một trong hai giây hoặc mili giây.

long secondsSinceEpoch = 1419038000L; 
DateTime dateTimeSeconds = new DateTime(secondsSinceEpoch , DateTimeZone.UTC); 
DateTime dateTimeMillis = new DateTime(secondsSinceEpoch * 1000L , DateTimeZone.UTC); // Note the crucial "L" appended to the numeric literal. 

Dump to console.

System.out.println("dateTimeSeconds: " + dateTimeSeconds); 
System.out.println("dateTimeMillis: " + dateTimeMillis); 

Khi chạy.

dateTimeSeconds: 1970-01-17T10:10:38.000Z 
dateTimeMillis: 2014-12-20T01:13:20.000Z 

java.time

đang Tương tự như trên, nhưng sử dụng java.time Java 8.

Instant instant = Instant.ofEpochSecond(1419038000L); 
ZonedDateTime zdtUtc = ZonedDateTime.ofInstant(instant , ZoneOffset.UTC); 
ZonedDateTime zdtMontréal = zdtUtc.withZoneSameInstant(ZoneId.of("America/Montreal")); 

Dump để an ủi.

System.out.println("zdtUtc: " + zdtUtc); 
System.out.println("zdtMontréal: " + zdtMontréal); 

Khi chạy.

zdtUtc: 2014-12-20T01:13:20Z 
zdtMontréal: 2014-12-19T20:13:20-05:00[America/Montreal] 
+0

Ý tôi là ... Tôi có một dấu thời gian trong json –

+0

Thông tin tốt cho nhận xét về Time Zone! Tôi đã tự hỏi tại sao tôi có được ** 01 **: 13: 20.000Z và không ** 10 **: 13:20 (như Scary Wombat) cho phần thời gian! – Didier68

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