【问题标题】: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);

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

【问题讨论】:

    标签: javascript java timezone


    【解决方案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 以来的毫秒数传递到服务器端。无论服务器端的时区是什么,当你解析它时,它都是正确的。如果你格式化,那么你最终会根据你用来格式化它的时区得到不同的时间,但是客户端和服务器端的日期时间是相同的。
    猜你喜欢
    • 2016-08-10
    • 2012-11-22
    • 2011-03-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多