在客户端检测时区[重复]

Posted

技术标签:

【中文标题】在客户端检测时区[重复]【英文标题】:Detect timezone on client side [duplicate] 【发布时间】:2020-01-24 13:09:33 【问题描述】:

我有 html 页面,客户可以以MM/dd/yyyy HH:mm 格式输入日期和时间。我遇到的问题是,根据客户端时区,服务器端的时间不同(也可能是日期)。

我们正在使用 Java,我们正在使用如下代码解析日期:

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm");
Date date = sdf.parse(dateStr);

如何检测用户的时区并将日期时间转换为服务器端时区?

【问题讨论】:

【参考方案1】:

您可以做的最好的事情是在客户端解析它并将自 EPOCH 以来的毫秒数发送到服务器:

var millis = new Date(dateStr).getTime();

当您在服务器端获得millis时,您可以像这样创建一个Date对象:

Date date = new Date(millis);

这将为您提供正确的日期和时间。

我的建议:自 EPOCH 以来始终使用 millis 以避免时区问题。仅在需要向用户显示时才转换为字符串。

【讨论】:

对不起,但这并不能回答所提出的问题。此外,这种时间戳是基于 UTC 的。有时这是需要的,但有时不是。例如,如果用户和服务器的时区设置不同,那么假设 UTC 可能会导致与用户输入的时间不同。 我认为它确实回答了这个问题。当您转换为自 EPOCH 以来的毫秒数时,您正在消除时区。所以无论客户端和服务器端使用什么时区,它总是会被正确解析。 问题是具体来说,如何确定用户的时区。不是如何消除它。在服务器端知道用户的时区有很多原因。在此处介绍的情况下,"...customers can enter the date and time in format MM/dd/yyyy HH:mm...",客户可能会在他们自己的时区提供输入。然后,自纪元以来的毫秒数基于该时区与 UTC 的关系。如果服务器端代码使用不同的时区,那么它将产生与用户最初提供的不同的值。 正如我在回答中提到的,您应该在客户端解析日期。因此,您将为用户获得正确的时间。然后,您将自 EPOCH 以来的毫秒数传递到服务器端。无论服务器端的时区是什么,当你解析它时,它都是正确的。如果你格式化,那么你最终会根据你用来格式化它的时区得到不同的时间,但是客户端和服务器端的日期时间是相同的。

以上是关于在客户端检测时区[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何检测客户端的时区?

检测客户端域名[重复]

获取用户时区相关日期[重复]

如何检测chrome浏览器[重复]

检测第三方cookie是不是被禁用的JavaScript解决方案[重复]

C TCP无法检测到断开的连接[重复]