2015-08-03 15 views
6

Tôi cần gửi dữ liệu theo số json. Điều quan trọng là tôi muốn địa phương được bảo tồn để người nhận nhận được ngày trong giờ địa phương của mình. Làm thế nào tôi có thể làm điều đó?Làm thế nào để gửi java.util.Date trong Json?

Tôi không thể đơn giản sử dụng Date.toString() vì sau đó tôi sẽ không thể phân tích cú pháp lại ngày kết thúc nhận nếu ngôn ngữ của họ khác (tên ngày và tháng khác nhau, v.v.).

Có giải pháp cho điều này không?

Trả lời

1

Sử dụng phương thức getTime của java.util.Date cho dấu thời gian. Một khi bạn chuyển đổi nó trở lại một ngày, mỗi người nhận có thể hiển thị nó bằng cách sử dụng múi giờ địa phương của nó.

Hãy nhớ rằng ngày

đại diện cho một khoảnh khắc đặc biệt trong thời gian, với độ chính xác phần nghìn giây.

Các phương thức toString chỉ định dạng nó trong một specific way:

dow mon dd hh:mm:ss zzz yyyy 

Chosing để gửi timestamp có nghĩa là bạn cũng sử dụng ít băng thông.

+0

điều gì xảy ra khi Ngày được tạo trong một múi giờ và được chuyển đến và được tiêu thụ trong múi giờ khác? – aviad

+0

Ngày tạo trong múi giờ được chuyển đổi thành số mili giây kể từ ngày 1 tháng 1 năm 1970, 00:00:00 GMT (thông qua getTime) và sau đó số này được chuyển đổi thành ngày bất kỳ múi giờ nào. –

+0

Đó có thể là những gì tôi đang tìm kiếm. Số lượng mili giây là bao nhiêu? – Greyshack

6

Một thời gian dài từ năm 1970 là tốt, nhưng không phải là con người có thể đọc được, và do đó PITA để thử nghiệm/phát triển.

Do đó sử dụng ISO 8601 thời gian tiêu chuẩn ngày"yyyy-MM-dd'T'HH:mm:ss" (nơi 'T' chỉ là một chữ T (người ta thường thấy một không gian ở đây;. Và giây phân đoạn .SSS)

Time khu có thể quá, nhưng hy vọng không cần thiết (= được kết hợp theo thời gian địa phương hóa)

Trước java 8 sử dụng SimpleDateFormat.

2

Cách thích hợp để thực hiện việc này là ghi ngày của bạn theo định dạng ISO 8601: tức là 2015-08-03T4:50:49+00:00

Không chỉ bao gồm múi giờ mà còn bất kỳ bộ giải mã chuẩn nào trên đầu nhận JSON của bạn sẽ có thể giải mã mà không có các vấn đề.

Đối với phần gửi, nếu bạn đang viết chuỗi chính mình, cũng chỉ định dạng nó:

ZonedDateTime.now(ZoneId.systemDefault()) 
      .format(DateTimeFormatter.ISO_DATE_TIME) 

Nhưng nếu bạn đang sử dụng bất kỳ serializers JSON để chuyển đổi từ các đối tượng Java của bạn (như Jackson chẳng hạn), sau đó chỉ cần làm cho đối tượng thuộc tính một java.util.Date và serializer nên biết phải làm gì, được thiết lập đúng. Xem this answer cho Jackson hoặc this one cho Jersey. Cả hai đều sử dụng Joda Time.

0

Tôi nghĩ rằng đó là cách đơn giản để làm được điều này,

DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
yourJsonObject.accumulate("yourDateVarible",dateFormat.format(new Date())); 
2

tl; dr

Instant.now() 
     .toString() 

2017-01-23T12: 34: 56.123456789Z

UTC

Gene tập hợp tốt nhất để trao đổi dữ liệu cho các giá trị ngày giờ trong UTC (GMT). Hãy để người nhận điều chỉnh theo múi giờ mong muốn.

Instant

Lớp Instant đại diện cho một thời điểm trên Timeline trong UTC với độ phân giải nano giây.

Instant instant = Instant.now() ; 
String output = instant.toString() ; // Generate a String in standard ISO 8601 format. 

2017-01-23T12: 34: 56.123456789Z

Bạn có thể dễ dàng phân tích chuỗi đó.

Instant instant = Instant.parse("2017-01-23T12:34:56.123456789Z") ; 

ISO

Tiêu chuẩn 8601 ISO 8601 định nghĩa rõ ràng dễ đọc dễ phân tích cú pháp định dạng cho cơ quan đại diện văn bản của các giá trị ngày thời gian. Các định dạng này lý tưởng cho trao đổi dữ liệu.

Trong giây lát ở UTC, điều đó có nghĩa là định dạng được xem trong ví dụ ở trên. T tách phần ngày khỏi phần thời gian trong ngày. Các Z cuối cùng là viết tắt của Zulu và có nghĩa là UTC.

Locale

Câu hỏi đề cập đến ngôn ngữ như thể liên quan đến múi giờ. A Localekhông có gì để làm với múi giờ. A Locale chỉ định (a) ngôn ngữ của con người để dịch tên của ngày, tên tháng, và, và (b) các tiêu chuẩn văn hóa quyết định các vấn đề viết tắt, viết hoa, dấu chấm câu, và như vậy.

Múi giờ là lịch sử thay đổi đối với offset-from-UTC của một vùng, theo dõi bất thường gây ra những thay đổi đó như Daylight Saving Time (DST).

Tìm kiếm ngăn xếp tràn để tìm hiểu thêm. Điều này đã được bao phủ hàng trăm lần rồi. Tìm kiếm các lớp học như ZoneId, ZoneOffset, ZonedDateTime, Instant, OffsetDateTimeDateTimeFormatter. Đọc số Oracle Tutorial trên các lớp java.time.

ZonedDateTime zdt = instant.atZone(ZoneId.of("Pacific/Auckland")) ; 
-1

Hãy thử định dạng này: 2017-03-20T00: 00: 00,000 + 0100

+1

Khác với các câu trả lời khác như thế nào? –

0

Có rất nhiều cách để làm điều đó. Một cách để chuyển đổi ngày theo mili giây không phụ thuộc vào ngôn ngữ và sử dụng nó thêm. Một cách khác để thay đổi ngày theo định dạng utc và sử dụng nó thêm. Nếu múi giờ của máy chủ được đặt thành UTC java.util.Date sẽ hoạt động hoàn hảo vì phải mất múi giờ của hệ thống theo mặc định trong khi sử dụng Ngày mới ("một số ngày"). :

long lastAccessedDate = 110002028250; 
    String myDate = new java.util.Date(lastAccessedDate()).toString(); 

myDate sẽ là "Tue Jun 06 05:30:00 UTC 2017", nếu múi giờ của hệ thống là UTC.

+0

Tôi không đồng ý với tất cả các điểm của bạn. Số mili giây không rõ ràng đối với cả [ngày tham chiếu epoch] (https://en.wikipedia.org/wiki/Epoch_ (reference_date) #Notable_epoch_dates_in_computing) và độ chi tiết (ngày, toàn bộ giây, mili giây, micro giây, nanô) . Không có thứ như 'utc format'. Múi giờ mặc định của hệ điều hành máy chủ hoặc JVM nằm ngoài sự kiểm soát của lập trình viên và do đó không đáng tin cậy; tốt hơn để xác định rõ ràng múi giờ mong muốn/mong muốn của bạn. Lớp 'Date' rắc rối sử dụng một định dạng khủng khiếp, và bây giờ là di sản, được thay thế bởi' java.time.Instant'. –

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