在客户端检测时区[重复]
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 以来的毫秒数传递到服务器端。无论服务器端的时区是什么,当你解析它时,它都是正确的。如果你格式化,那么你最终会根据你用来格式化它的时区得到不同的时间,但是客户端和服务器端的日期时间是相同的。以上是关于在客户端检测时区[重复]的主要内容,如果未能解决你的问题,请参考以下文章