Javascript 在客户端检测时区

Javascript 在客户端检测时区,javascript,java,timezone,Javascript,Java,Timezone,我有HTML页面,客户可以以MM/dd/yyyy HH:MM格式输入日期和时间。我遇到的问题是,根据客户端时区的不同,服务器端的时间不同(也可能是日期) 我们正在使用Java,我们正在用如下代码解析日期: SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm"); Date date = sdf.parse(dateStr); Date date = new Date(millis); 如何检测用户的时区并将日期时间转换为

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

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

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

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

您可以做的最好的事情是在客户端对其进行解析,并向服务器发送自EPOCH以来的毫秒数:

var millis = new Date(dateStr).getTime();
当您在服务器端获得毫秒数时,您只需创建一个
Date
对象,如下所示:

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm");
Date date = sdf.parse(dateStr);
Date date = new Date(millis);
这将为您提供正确的日期和时间


我的建议是:从大纪元开始就使用毫秒来避免时区问题。仅当您需要向用户显示字符串时才将其转换为字符串。

您可以做的最好的事情是在客户端对其进行解析,并向服务器发送自EPOCH以来的毫秒数:

var millis = new Date(dateStr).getTime();
当您在服务器端获得毫秒数时,您只需创建一个
Date
对象,如下所示:

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm");
Date date = sdf.parse(dateStr);
Date date = new Date(millis);
这将为您提供正确的日期和时间


我的建议是:从大纪元开始就使用毫秒来避免时区问题。仅当需要向用户显示字符串时才转换为字符串。

抱歉,这并不能回答问题。此外,此类时间戳基于UTC。有时这是需要的,但有时不是。例如,如果用户和服务器有不同的时区设置,那么假设UTC可能会导致与用户输入的时间不同。我认为它确实回答了这个问题。当您从历元转换为毫秒时,您正在消除时区。因此,无论客户端和服务器端使用的是什么时区,它都将被正确解析。而不是如何消除它。在服务器端了解用户的时区有很多原因。在这里介绍的案例中,
“…客户可以以MM/dd/yyyy HH:MM格式输入日期和时间…”
,客户可能在自己的时区提供输入。从历元开始的毫秒数基于时区与UTC的关系。如果服务器端代码使用不同的时区,那么它将生成与用户最初提供的值不同的值。因此,您将为用户获得正确的时间。然后,将从历元开始的毫秒传递给服务器端。无论服务器端的时区是什么,当您解析它时,它都是正确的。如果您格式化,那么您将根据用于格式化的时区使用不同的时间,但客户端和服务器端的日期时间是相同的。很抱歉,这并不能回答问题。此外,此类时间戳基于UTC。有时这是需要的,但有时不是。例如,如果用户和服务器有不同的时区设置,那么假设UTC可能会导致与用户输入的时间不同。我认为它确实回答了这个问题。当您从历元转换为毫秒时,您正在消除时区。因此,无论客户端和服务器端使用的是什么时区,它都将被正确解析。而不是如何消除它。在服务器端了解用户的时区有很多原因。在这里介绍的案例中,
“…客户可以以MM/dd/yyyy HH:MM格式输入日期和时间…”
,客户可能在自己的时区提供输入。从历元开始的毫秒数基于时区与UTC的关系。如果服务器端代码使用不同的时区,那么它将生成与用户最初提供的值不同的值。因此,您将为用户获得正确的时间。然后,将从历元开始的毫秒传递给服务器端。无论服务器端的时区是什么,当您解析它时,它都是正确的。如果您格式化,那么您将根据用于格式化的时区使用不同的时间,但客户端和服务器端的日期时间是相同的。