2012-01-18 83 views
14

我使用JSON.stringifyJavaScript和Java日期JSON序列

我對GMT + 4時區(俄羅斯/莫斯科)

例如與日期屬性的JavaScript對象,它被轉換成JSON , 5 Jan 2012轉換爲2012-01-04T20:00:00.000Z

5 Jan 1975轉換爲1975-01-04T20:00:00.000Z

但在1975年它是GMT + 3時區,由於夏令將於2011年在俄羅斯取消因此,當它卡梅斯服務器(JAVA)它反序列爲:

2012-01-04T20:00:00.000Z becames 5 Jan 2012 00:00 - OK

1975-01-04T20:00:00.000Z becames 4 Jan 1975 23:00 - 錯誤!

在JavaScript中將日期對象轉換爲JSON的建議方法是什麼?

+0

這可能是有用的。也許甚至可能有重複:http://stackoverflow.com/questions/4032967/json-date-to-java-date – Johan 2012-01-18 13:46:21

回答

12

我建議使用自紀元時間以來的秒數來傳遞日期/時間,更具體地說,是自Unix紀元(1970年1月1日00:00 GMT)以來的秒數。如果你不熟悉這個,還有一個例子轉換器在這裏:http://www.epochconverter.com/

這有幾個優點:

  • 它是指在同一時刻獨立的時區。這有助於存儲與時區錯誤無關的時間(儘管它們當然必須首先正確輸入)。
  • 它是java.util.Date中唯一沒有被棄用的構造函數(構造函數除外沒有參數),請參閱(getTime())。 (請注意,這使用毫秒。)
  • JavaScript可以很容易地建立日期(例如new Date(1000 * 1326894706))。 (請注意,這使用毫秒。)
  • 如果重要,它總是會比"yyyy-MM-dd HH:mm:ss"中的任何一個更小(在其JSON序列化中的數據大小方面)。
  • 如果您想要顯示時區並將其與此號碼相關聯,您可以隨時在表示中添加一個額外的字段。 { "datetime": 1326894706, "tz": "GMT" }仍然短於{ "datetime": "18 Jan 2012 13:51:46 GMT" }

考慮它很容易從這個得到Date實例在Java和JavaScript,然後你可以使用一個DateFormatter將其轉換爲/從文本中的Java。對於JavaScript,使用庫如Date Format將幫助您在頁面上適當渲染它(例如,使用類似new Date(val * 1000).format("yyyy-mm-dd HH:MM")的東西)。

+0

我做了一些更多的研究,發現時代在Java和JavaScript中被區別對待(http://stackoverflow.com/questions/8913059/javascript-date-and-java-util-date-constructor-argument)。如果我不能依賴getTime()方法,我不知道如何使用紀元時間。 – ike3 2012-01-18 16:19:46

+0

它們的行爲在當時將時區綁定到您的位置時的行爲不同。我認爲你的輸入是第一個(正確的)JS'Date'實例?你如何建立它們?你能舉一個你最初製作'1975年1月5日'的例子嗎? – Bruno 2012-01-18 16:45:31

+0

當日歷中選擇1975年1月5日時,我從jQuery DatePicker $(「date」)。datePicker(「getTime」)獲取日期。然後使用JSON.stringify將其序列化爲JSON,該年使用4小時獨立。但Java知道在2011年之前它是GMT + 3,並以正確的方式將其反序列化,因此我在2011年之前獲得1小時的差異 – ike3 2012-01-19 02:47:12

0

我個人會使用像這樣把它們轉換成字符串在Java中:

String theDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); 

,然後這個字符串序列化。在JavaScript方面,你只是解析它。

+0

我認爲問題是從* JavaScript *到* Java。 – Pointy 2012-01-18 13:58:15

+0

或者相反:如果我正確地閱讀了這個問題,那麼在Javascript中進行字符串化以解析Java,因爲作者希望使用Javascript-> Java。 – Zlatko 2012-01-18 14:00:22

+0

是的,我正在考慮爲Spring MVC + Jackson編寫自定義日期序列化器/反序列化器。 – ike3 2012-01-18 14:08:49

0

JSON沒有Date支持,所有解析器/序列化器都使用toString或類似的東西。您需要序列化/反序列化日期。
由於JavaScript沒有包含像樣的日期格式化程序,最簡單的解決方案是將日期轉換爲長整型。但是,如果你希望能夠讀取是怎麼回事,我建議http://www.datejs.com/和格式化日期爲yyyy-MM-DD HH:MM:SS

13

我寧願堅持到JavaScript的ISO 8601日期格式, 解析時正確它會自動處理時區差異。

在java中可以按如下解析一個JavaScript字符串化JSON日期:

String iso8601Date = "2013-08-13T14:15:00.000Z"; 
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
Date parsedDate = formatter.parse(iso8601Date); 

當把它放回字符串,你就會有這樣的事情

//"2013-08-13T16:15:00.000+02:00" 
String formattedDate = formatter.format(parsedDate); 

爲了解析JSON我使用FlexJson,您可以像這樣配置。

//Serializing to JSON 
DateTransformer dateTransformer = new DateTransformer("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
new JSONSerializer().transform(dateTransformer, Date.class).serialize(object); 
//deserialize From JSON (replace object by java class) 
JSONDeserializer<..Object..>().use(Date.class, dateTransformer).deserialize(json); 
+0

+1。謝謝你的「yyyy-MM-dd'T'HH:mm:ss.SSSXXX」:) – TheKojuEffect 2014-07-15 06:35:06

1

如果使用Spring Framework可以使用@JsonSerialize(using = CustomLocalDateSerializer.class)@JsonDeserialize(using = ISO8601LocalDateDeserializer.class)註解。它會正確解析你的javascript Date

實施例:

public class product { 

    @NotNull 
    private Long id; 

    @NotNull 
    private String name; 

    @JsonSerialize(using = CustomLocalDateSerializer.class) 
    @JsonDeserialize(using = ISO8601LocalDateDeserializer.class) 
    private LocalDate date; 

    // getter and setter... 
}