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