获取客户端和服务器之间的时区差异

Posted

技术标签:

【中文标题】获取客户端和服务器之间的时区差异【英文标题】:Get timezone difference between client and server 【发布时间】:2011-04-06 23:49:53 【问题描述】:

如果我的用户在加利福尼亚,并且他们的计算机设置为 PST,那么那里是下午 1:00。如果我的服务器设置为 EST,则当前服务器时间为下午 4:00。

我需要一种方法来,无论是在 javascript 还是 C# 中。在我的示例中,我会得到 3(或 -3,没关系)。

有人知道怎么做吗?

编辑:RedFilter 的可能解决方案

全部在 javascript 中完成:

serverDate = new Date('<%= DateTime.Now.ToString() %>');
clientDate = new Date();
diffMin = (serverDate.getTime()-clientDate.getTime())*1000*60;  //get difference in minutes

认为这会奏效吗?还是两者会同时返回?

【问题讨论】:

如果服务器设置为 EST,则有问题。它应该以 UTC 运行。这将消除许多与时区相关的麻烦。 @Frederik 我看不出这会如何真正改变事情。如果应用程序需要知道客户端的时间偏移量,则无论服务器时区设置如何,它都需要知道。 我的服务器实际上是在 UTC 中运行的,我只是以 EST 为例来避免所有“有将日期转换为 UTC 的函数”的答案,这对我遇到的问题没有帮助有。 我主张将数据(在数据结构或数据库中)存储为 UTC 时间,但将整个服务器设置为 UTC 有点多。 另外,请记住 1) 有半小时 UTC 偏移量的时区 2) 两个时区之间的时差全年变化。 【参考方案1】:

你可以:

1 - 将服务器日期作为 Javascript 日期变量返回给客户端。 2 - 创建一个新的 javascript 日期客户端 (var currentTime = new Date();) 并减去上述日期 3 - 将结果发送回服务器(如有必要;您可能只需要知道客户端的差异)。

更新

这是一个例子:

serverDate = new Date('<%= DateTime.Now.ToString() %>'); 
clientDate = new Date(); 
diffMin = (serverDate.getTime()-clientDate.getTime())/(1000*60);
alert("serverDate: " + serverDate + "\r\n" + "clientDate: " + clientDate + "\r\n" +
  "diffMin: " + diffMin);

如果服务器和客户端在同一台机器上,您将看到diffMin 接近于零。由于服务器端脚本生成日期和浏览器解析和执行 javascript 之间的时间,日期之间存在细微差异。

//这对我很有用 - DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss")

【讨论】:

我编辑了我的原件,如果您认为这样可行,请告诉我。【参考方案2】:

您需要知道位置或机器的时区吗?

如果您需要知道该位置的时区,那么最好的办法是订阅 Geo-IP 服务,检查 IP,然后检查该位置的时区(有公开可用的数据库)。由于无法保证 IP 地理信息,因此无法保证(这绝对不仅仅是理论上缺乏保证,错误信息比比皆是)。

通常,您真正想要的是客户端计算机的时区设置。对于大多数服务,如果我正在旅行并且有一个网站认为我与我工作的时间不同(如果我没有离开很长时间,我会坚持我的家乡时区),我会觉得很烦人。

这很容易在客户端完成。 new Date().getTimezoneOffset() 返回 UTC 和本地时间之间的分钟数。例如。目前我在爱尔兰夏令时间(格林威治标准时间 + 1 小时夏令时),它返回 -60。

您可以轻松地将其放入图像或 XHR 请求使用的 URI 中,或将其放入 cookie 值中。

【讨论】:

【参考方案3】:

这个问题一直困扰着我:我遇到了类似的问题,但我是在服务器端执行它并运行 node.js AWS Lambda。我不能接受我需要将时间从客户端传递到服务器(或者反之亦然,应该是你的情况)。我知道时区,javascript知道转换它们的规则,为什么我需要来回传递它?我所做的只是计算两个时区之间的差异,无论日期是什么。下面,它被设置为在美国的 UTC 和时区之间进行转换,这些时区从不存在部分小时数,所以我将它设置为整数小时,但如果你曾经工作过,你需要重新工作与印度等不稳定的时区。您需要四舍五入,因为还有额外的毫秒剩余时间(我怀疑这与铯的衰减率有关,而不是四舍五入错误——不确定不关心)。

请注意,这是在服务器端运行(但反过来显然也可以)并且我的服务器运行 UTC。另请注意,当您初始化第一个日期变量时,您需要将日期设置为您想要偏移的日期,因为它们可以每天更改。

var UTCTime = new Date();
var pacificTime = new Date(UTCTime.toLocaleString("en-US",timeZone: "America/Los_Angeles"));
var offset = Math.round((UTCTime-pacificTime)/1000/60/60,0);
console.log(offset); // returns 7 (during daylight saving time)

希望这对某人有所帮助...

【讨论】:

【参考方案4】:

检查时区差异的一种好方法是了解所用时间的时区(位置)。 如果您可以在客户端和服务器端获得它,您可以检查 TimeZoneInfo 类(我认为需要 3.5) TimeZoneInfo from Koders.

将具有关联区域的客户端和服务器时间转换为 UTC (ConvertTimeZoneToUtc) 并比较两者。

【讨论】:

这就是问题所在,我不知道客户端将从哪个时区导航,它可能来自任何地方。如果我能以某种方式获得该信息,那将很有帮助,但我不知道如何。 那我想知道你是如何从客户端获取时间的。因为我有一个类似的问题,我通过使用所有联系人的位置来解决它。我使用与时区相关联的城市位置。

以上是关于获取客户端和服务器之间的时区差异的主要内容,如果未能解决你的问题,请参考以下文章

环境之间的时区差异

纽约和伦敦之间的时区

如何处理服务器和客户端之间的时区?

处理客户端和服务器之间的时区,仅限日期DateTime

客户端服务器数据库之间的时区转换

由于 IP 和 SP 之间的时区差异导致的 Spring Saml 安全身份验证问题