日期应该如何发布到java

How should dates be posted to java?

本文关键字:java 何发布 日期      更新时间:2023-09-26

我一直有这种怀疑,而且一直有问题。问题是,例如,我有一个请求用户输入日期的表单,它通过ajax发布到服务器,并接收日期字段作为日期类型。有时,我所做的是在不同的参数中发送不同的值,比如:

{
    day: 18,
    month: 05,
    year: 2014,
    hour: 10,
    min: 30
}

然后在服务器中,根据接收到的值设置Date类型。但后来,当然,我认为这不是一个好的做法,我开始制作这样的字符串:

{
     date: "2014-09-16T12:00:00Z"
}

但是这当然不考虑用户的位置以便保持相应的GMT+-。。

我也想过发布毫秒,但这里再次出现了GMT的问题。

我用弹簧,只是为了记录。

那么,应该怎么做呢?这样做的最佳做法是什么?

在UTC中思考和存储

通常最好以UTC格式存储和处理日期-时间值。转换为本地日期时间,仅在用户期望时进行演示。如果知道数据输入用户的时区或偏移量很重要,除了UTC值外,还应单独记录。

询问时区

至于在客户端机器上确定用户的时区或偏移量,在网络浏览器中,您可以按照另一个答案中的建议通过JavaScript进行询问。但最终,如果时区或偏移量真的很重要,您应该询问用户。出示一份清单供他们选择。使用正确的时区名称,不要使用3或4个字母的代码。这些代码既不是标准化的,也不是唯一的。

您不能信任用户计算机上的时钟。当您出于任何重要目的需要了解当前时间时,请使用服务器的时间,因为您可以控制该机器。并确保服务器计算机连接到一个或多个时间服务器。

按ISO 8601序列化

当将日期时间值序列化为字符串时,使用ISO8601格式绝对是一种方法。

java 8中的新java.time包通过附加时区名称来扩展ISO 8601格式。有趣的想法,但不是标准的afaik。

不跟踪Epoch的计数

从epoch开始按计数跟踪日期时间对人类来说毫无意义,这使得调试和验证变得棘手且容易出错。日期-时间库内部跟踪epoch中的计数。但我们拥有这些库是有原因的,目的是让编程工作更容易、更正确。一些极客类型的人可能会提出这种方法。但他们往往对约会时间的工作有多棘手和棘手感到天真。

此外,不同的环境和库使用不同的规模:整秒、毫秒、微秒和纳秒。大约有二十多个时代已经被用于各种计算机系统中。

避免使用j.u.Date&日历

永远不要使用与java捆绑在一起的java.util.Date和.Calendar类。它们是出了名的麻烦,应该避免。相反,使用JodaTime或添加到Java8中的新java.Time包来取代那些旧类。

本地日期&LocalTime

像Joda Time这样的好库提供了一些课程,当你只想要一个日期或一天中的时间,而不需要时区偏移。

但不要认为忽略时区会让你的生活更轻松。只有当你的意思是"公司政策是我们在底特律、马赛和赫尔辛基的工厂将在下午12:30停下来吃午饭"时,才使用这些词。工厂并不是同时停止,而是在12:30这一特定时刻停止。

如果您的意思是公司总裁将在底特律时间上午10点进行网络直播,请将该值存储为UTC调整后的值。然后,在向用户演示时,再次调整到他们自己的底特律、马赛或赫尔辛基时间。

在JavaScript中使用getTimezoneOffset()获取偏移量,然后应用该偏移量使本地GMT 中的所有时间

JavaScript getTimezoneOffset()方法