我一直有这个疑问,并且总是遇到问题。问题是,例如,我有一个表单,要求用户输入日期,然后通过 ajax 将其发布到服务器,并接收日期类型的日期字段。有时,我所做的就是在不同的参数中发送不同的值,如下所示:
{
day: 18,
month: 05,
year: 2014,
hour: 10,
min: 30
}
然后在服务器中,根据收到的值创建日期类型。 但是,当然,我认为这不是一个好的做法,我开始制作这样的字符串:
{
date: "2014-09-16T12:00:00Z"
}
但这当然没有考虑用户的位置,以保持相应的 GMT+-..
我也想过发布毫秒,但这里又出现了 GMT 的问题..
我正在使用 spring,仅供记录。
那么,应该怎么做呢?执行此操作的最佳做法是什么?
最佳答案
以 UTC 时间思考和存储
通常最好在 UTC 中存储和使用日期时间值。仅在用户期望时转换为本地日期时间以供演示。如果了解数据输入用户的 time zone 很重要或offset ,除了 UTC 值之外,还单独记录该值。
询问时区
至于确定客户端计算机上用户的时区或偏移量,您可以在 Web 浏览器中通过 JavaScript 询问,如 other answer 中的建议。 。但最终,如果时区或偏移量确实很重要,您应该询问用户。出示一份 list 供他们选择。使用proper time zone names ,绝不是 3 或 4 个字母的代码。这些代码既不是标准化的也不是唯一的。
您不能信任用户计算机上的时钟。当您出于任何重要目的需要了解当前时间时,请使用服务器的时间,因为您可以控制该计算机。并确保服务器计算机已连接到一个或多个 time servers .
序列化为 ISO 8601
将日期时间值序列化为字符串时,使用 ISO 8601格式绝对是要走的路。
Java 8 中的新 java.time 包通过附加时区名称来扩展 ISO 8601 格式。有趣的想法,但不是标准的据我所知。
不跟踪纪元的计数
按照 epoch 以来的计数跟踪日期时间对人类来说毫无意义,这使得调试和验证变得棘手且容易出错。日期时间库在内部跟踪纪元的计数。但我们拥有这些库是有原因的,为了让编程工作更容易、更正确。一些极客类型的人可能会建议这种方法。但他们常常天真地意识到约会工作是多么棘手和棘手。
此外,不同的环境和库使用不同的刻度:整秒、milliseconds , microseconds ,和nanoseconds 。关于two dozen epochs已被用于各种计算机系统中。
避免使用 j.u.Date 和 .Calendar
切勿使用与 Java 捆绑在一起的 java.util.Date 和 .Calendar 类。众所周知,它们很麻烦,应该避免。而是使用 Joda-Time或新的java.time package添加到 Java 8 以取代那些旧的类。
本地日期和本地时间
好的库,例如 Joda-Time当您想要仅显示日期或仅显示时间而无需时区偏移时,可以提供类(class)。
但不要认为忽略时区会让您的生活更轻松。仅当您的意思是“公司政策是我们位于底特律、马赛和赫尔辛基的工厂将在中午 12:30 停止吃午餐”时才使用这些内容。工厂不会同时停止,而是在各自特定的 12:30 停止。
如果您的意思是公司总裁将在底特律时间上午 10 点进行网络直播,请将该值存储为调整为 UTC 的值。然后在向用户展示后,再次调整到他们自己的底特律、马赛或赫尔辛基时间。
关于java - 日期应该如何发布到java?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25627192/