Javascript 和 Java Date JSON 序列化

2022-09-03 05:08:38

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

我使用的是 GMT+4 时区(俄罗斯/莫斯科)

例如,转换为5 Jan 20122012-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变成23:00 - 错了!4 Jan 1975

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


答案 1

我更喜欢坚持使用javascript的ISO 8601日期格式,当正确解析它时,它将自动处理时区差异。

在java中,您可以解析JavaScript Stringized 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);

答案 2

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

这有几个优点:

  • 它指的是独立于时区的同一时刻。这有助于独立于时区错误存储时间(当然,首先必须正确输入它们)。
  • 它是java.util.Date中唯一未弃用的构造函数(没有参数的构造函数除外),请参阅( )。(请注意,这使用毫秒。getTime()
  • JavaScript可以很容易地从它构建日期(例如)。(请注意,这使用毫秒。new Date(1000 * 1326894706)
  • 如果它很重要,它总是会比任何."yyyy-MM-dd HH:mm:ss"
  • 如果要渲染时区并与此数字相关联,则始终可以向制图表达添加一个额外的字段。 仍比 短 。{ "datetime": 1326894706, "tz": "GMT" }{ "datetime": "18 Jan 2012 13:51:46 GMT" }

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