[英]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
。
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標准定義了清晰易讀的易於解析的格式,用於日期時間值的文本表示。 這些格式非常適合數據交換。
在UTC中,這意味着上面示例中看到的格式。 T
將日期部分與時間部分分開。 最后的Z
是Zulu
縮寫,意思是UTC。
該問題提到區域設置好像與時區相關。 Locale
與時區無關 。 Locale
指定(a)用於翻譯日期名稱,月份名稱等的人類語言,以及(b)決定縮寫,大小寫,標點符號等問題的文化規范。
時區是區域與UTC偏移的更改歷史記錄,跟蹤導致這些更改的異常,例如夏令時(DST) 。
搜索Stack Overflow以了解更多信息。 這已經被覆蓋了數百次。 搜索ZoneId
, ZoneOffset
, ZonedDateTime
, Instant
, OffsetDateTime
和DateTimeFormatter
。 閱讀java.time類的Oracle Tutorial 。
ZonedDateTime zdt = instant.atZone( ZoneId.of( "Pacific/Auckland" ) ) ;
java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊遺留日期時間類,如java.util.Date
, Calendar
和SimpleDateFormat
。
現在處於維護模式的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的試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多 。
使用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.