为什么LocalTime显示服务器时间而不是浏览器时间?

时间:2008-11-19 09:11:42

标签: c# datetime localtime

我可能做错了什么 - 但不知道为什么。 我的数据库中有一个DateTime字段,保持UTC时间

我的服务器位于美国,浏览器位于欧洲。

PageLoad代码如下:

DateTime t = DateTime.SpecifyKind((DateTime)rdr["startTime"], DateTimeKind.Utc);
label1.Text = t.ToLocalTime().ToString();

我得到的时间是美国当地时间,而不是欧洲。我该怎么做才能显示浏览器的本地时间?

谢谢!

4 个答案:

答案 0 :(得分:5)

一种技术是在客户端浏览器上使用javascript检测客户端时区偏移量(以分钟为单位):

alert((new Date()).getTimezoneOffset();

然后可以将其发送回服务器并存储在会话或cookie中,并用于抵消显示给它们的UTC日期。或者,另一种技术是让用户配置文件指定他们的时区。

答案 1 :(得分:3)

toLocalTime在您的服务器上执行,而不是在浏览器上执行。 如果你想在服务器端转换日期,你必须得到用户所在的时区(欧洲至少有3个时区,如果计算夏令时,则为6个。)

一种方法是将UTC时间发送到客户端,然后使用一些javascript将其转换为用户本地时间(javascript中的Date对象知道用户系统的设置)

答案 2 :(得分:1)

作为some wrote,代码正在服务器上执行 - 因此,应用的时区是服务器本地的时区是有道理的。

除了他建议将UTC发送到浏览器(当它可用时很好,但并不总是一个选项),如果你使用的是.NET 3.5,你应该查看TimeZoneInfo。这将允许您在UTC和任意时区之间进行转换,包括历史更改。 (时区不仅仅是“GMT + 5”等等。)最大的困难在于确定用户实际所处的时区。通常可以通过JavaScript获取UTC的当前偏移量,但这并不能给你带来所有您需要的信息,以确保一致。迟早你可能需要为每个用户设置他们所在的时区。

答案 3 :(得分:1)

我认为根据客户端浏览器中的时间在数据库中存储时间值是不明智的。

如果您在许多不同时区拥有许多客户,并且存储的信息经过整理或共享 - 事件的顺序将不正确。格林尼治标准时间10:16在美国东部时间晚上10:30之前。

出于这个原因,最好使用服务器时间(或者更好,如其他人所说的那样 - 尝试并使用UTC)。