簡體   English   中英

如何在Json中發送java.util.Date?

[英]How to send java.util.Date in Json?

我需要在json中發送數據。 重要的是我希望保留語言環境,以便接收者在當地時間獲取日期。 我怎樣才能做到這一點?

我不能簡單地使用Date.toString()因為如果他們的語言環境不同(不同的日期和月份名稱等等),我將無法在接收端解析它。

這個問題有方法解決嗎?

自1970年以來的很長一段時間都很好,但不是人類可讀的,因此是用於測試/開發的PITA。

因此,使用ISO 8601標准日期時間 "yyyy-MM-dd'T'HH:mm:ss" (其中'T'只是文字T (這里常常看到一個空格;以及小數秒.SSS )。

也是可能的,但希望不需要(=在本地化時間內合並)。

在java 8之前使用SimpleDateFormat

TL;博士

Instant.now()
       .toString()

2017-01-23T12:34:56.123456789Z

世界標准時間

通常最好以UTC(GMT)交換日期時間值的數據。 讓接收器調整到所需的時區。

Instant

Instant類表示UTC時間軸上的一個時刻,分辨率為納秒。

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

2017-01-23T12:34:56.123456789Z

您可以輕松地解析該字符串。

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

ISO 8601

ISO 8601標准定義了清晰易讀的易於解析的格式,用於日期時間值的文本表示。 這些格式非常適合數據交換。

在UTC中,這意味着上面示例中看到的格式。 T將日期部分與時間部分分開。 最后的ZZulu縮寫,意思是UTC。

語言環境

該問題提到區域設置好像與時區相關。 Locale與時區無關 Locale指定(a)用於翻譯日期名稱,月份名稱等的人類語言,以及(b)決定縮寫,大小寫,標點符號等問題的文化規范。

時區是區域與UTC偏移的更改歷史記錄,跟蹤導致這些更改的異常,例如夏令時(DST)

搜索Stack Overflow以了解更多信息。 這已經被覆蓋了數百次。 搜索ZoneIdZoneOffsetZonedDateTimeInstantOffsetDateTimeDateTimeFormatter 閱讀java.time類的Oracle Tutorial

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

關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊遺留日期時間類,如java.util.DateCalendarSimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參閱Oracle教程 並搜索Stack Overflow以獲取許多示例和解釋。 規范是JSR 310

您可以直接與數據庫交換java.time對象。 使用符合JDBC 4.2或更高版本的JDBC驅動程序 不需要字符串,不需要java.sql.*類。

從哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

使用java.util.Date的getTime方法作為時間戳。 一旦將其轉換回日期,每個接收器都可以使用它的本地時區顯示它。

記住日期

表示特定的時刻,精度為毫秒。

toString方法只是以特定方式格式化它:

dow mon dd hh:mm:ss zzz yyyy

選擇發送時間戳表示您也使用較少的帶寬。

正確的方法是以ISO 8601格式編寫日期:即2015-08-03T4:50:49+00:00

不僅包括時區,而且JSON接收端的任何標准解碼器都能夠毫無問題地解碼它。

對於發送部分,如果您自己編寫字符串,請將其格式化:

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

但是,如果您使用任何JSON序列化程序從Java對象(例如Jackson)進行轉換,那么只需將對象屬性設為java.util.Date ,並且序列化程序應該知道該做什么,給定正確的設置。 這個答案傑克遜,或者這一次的球衣。 他們都使用Joda Time。

我認為有這樣簡單的方法,

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

有很多方法可以做到這一點。 一種轉換日期的方法,以毫秒為單位,不依賴於語言環境並進一步使用。 另一種以utc格式更改日期並進一步使用它的方法。如果服務器的時區設置為UTC,則java.util.Date將完美運行,因為默認情況下使用新日期(“某個日期”)時會占用系統時區。示例:

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

如果系統時區為UTC,myDate將為“Tue Jun 06 05:30:00 UTC 2017”。

請嘗試以下格式:2017-03-20T00:00:00.000 + 0100

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM