Javascript和Java Date JSON序列化

ike*_*ke3 15 javascript java spring date spring-mvc

我有一个带有Date属性的javascript对象,它正在使用转换为JSONJSON.stringify

我在GMT + 4时区(俄罗斯/莫斯科)

例如, 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因为5 Jan 2012 00:00- 好的

1975-01-04T20:00:00.000Z因为4 Jan 197523:00 - 错!

在Javascript中将Date对象转换为JSON的推荐方法是什么?

Nil*_*ils 14

我更喜欢坚持使用javascripts ISO 8601日期格式,正确解析它会自动处理时区差异.

在java中,您可以解析javascript Stringified 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);
Run Code Online (Sandbox Code Playgroud)

当把它变回字符串时,你会有类似的东西

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

为了解析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);
Run Code Online (Sandbox Code Playgroud)


Bru*_*uno 13

我建议使用自纪元符号以来的秒数来传递日期/时间,更具体地说是自Unix纪元(1970年1月1日00:00 GMT)以来的秒数.如果你不熟悉这个,那里有一个示例转换器:http://www.epochconverter.com/

这有一些优点:

  • 它指的是与时区无关的同一时刻.这有助于独立于时区错误存储时间(当然,首先必须正确输入它们).
  • 它是唯一一个不推荐使用的构造函数(除了没有params的构造函数)java.util.Date,参见(getTime()也).(请注意,这使用毫秒.)
  • JavaScript可以很容易地从中构建日期(例如new Date(1000 * 1326894706)).(请注意,这使用毫秒.)
  • 如果重要的话,它总是会比任何一个小(在JSON序列化中的数据大小方面)"yyyy-MM-dd HH:mm:ss".
  • 如果您希望渲染时区并将其与此数字相关联,则可以始终向表示添加额外字段.{ "datetime": 1326894706, "tz": "GMT" }还是比{ "datetime": "18 Jan 2012 13:51:46 GMT" }.

考虑到Date在Java和JavaScript中很容易从中获取实例,然后可以使用a DateFormatter将其转换为Java中的文本.对于JavaScript,使用诸如日期格式之类的库将帮助您在页面上适当地呈现它(例如,使用类似的东西new Date(val * 1000).format("yyyy-mm-dd HH:MM")).