【问题标题】:Timezones and JSON reading with jersey带球衣的时区和 JSON 读取
【发布时间】:2014-03-24 10:54:08
【问题描述】:

在我的页面上,用户输入生日。该模型将日期保存为 javascript 日期。在请求中,日期被转换为 UTC,并带有 给定日期的时区偏移量。在服务器端球衣读取该日期并添加当前时区偏移量

所以在写这篇文章时会发生什么(服务器在 CET 中):

用户输入:

01/03/1967

客户转移:

JSON.stringify(new Date(1967,2,1))
"1967-02-28T23:00:00.000Z"

服务器增加一小时,并正确获取01/03/1967

但是如果用户进入

01/04/1967

客户转移:

JSON.stringify(new Date(1967,3,1))
"1967-03-31T22:00:00.000Z"

服务器增加一小时,并错误地获取31/03/1967。夏令时涉及夏令时,服务器可能会增加两个小时,并且日期再次正确。

我现在只传输日期字符串(不是日期对象,所以只是用户输入的内容)。

其他人有这个问题吗?如何解决这种差异?

我没有从 JSON.stringify 中得到任何确定性行为,为什么它有时使用 2 小时的偏移量,为什么有时只使用 1 小时。

例如查看以下日期:

JSON.stringify(new Date(1981,5,1))
""1981-05-31T22:00:00.000Z""
JSON.stringify(new Date(1980,5,1))
""1980-05-31T23:00:00.000Z""

【问题讨论】:

    标签: java javascript json date jersey


    【解决方案1】:

    您选择了错误的模型来处理您的输入。基本上你从一个普通的日期开始(没有时间和时区)。所以你应该保持这个结构。这意味着将输入转换为 JavaScript 日期(包括时间和时区)并不是很好,因为这会引入您观察到的问题。

    不幸的是,内置版本的 JavaScript 不提供纯日期作为数据类型。 但你至少可以将用户输入转换成ISO-8601格式的String,即:yyyy-MM-dd

    然后你通过 JSON 发送这个字符串,在服务器端你可以将它解析为你想要的任何类型(这里我再次建议使用纯日期作为模型,如 Java 8 中的 java.time.LocalDateorg.joda.time.LocalDate 或类似的) .但即使您选择java.util.GregorianCalendar,您的时区问题也应该消失,因为日期不会更改,只会补充(不必要的)服务器时间和时区信息。

    注意:如果 Jersey 仍然需要由 JSON 生成的完整日期-时区输入,那么您可以尝试手动将合适的时间部分(例如午夜)和合适的时区部分添加到用作 JSON 的字符串中-输入。

    【讨论】:

    • 这正是我现在正在做的事情,正如我所写的:“我现在只传输日期字符串(不是日期对象,所以只是用户输入的内容)。”但感谢您的澄清。
    • @Waxolunist 嗯,没看过这句话。好吧,我认为这是最好的方法,让你摆脱所有这些奇怪的时区问题。引入使用时区的中间 JavaScript 对象对您不利。基于这种类型的任何棘手的解决方法都不能真正解决这种方法会伪造真实输入的问题(一个简单的日期)。
    猜你喜欢
    • 2021-03-18
    • 2016-05-05
    • 2014-12-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    相关资源
    最近更新 更多