1

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

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

页面加载代码如下:

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

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

谢谢!

4

4 回答 4

5

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

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

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

于 2008-11-19T09:28:02.343 回答
3

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

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

于 2008-11-19T09:29:16.740 回答
1

正如一些人所写的那样,代码正在服务器上执行 - 所以应用的时区是服务器本地的时区是有道理的。

除了他将 UTC 发送到浏览器的建议(这在可用时很好,但并不总是一种选择),如果您使用的是 .NET 3.5,您应该查看TimeZoneInfo 。这将让您在 UTC 和任意时区之间进行转换,包括历史变化。(时区不仅仅是“GMT + 5”等。)最大的困难是确定用户实际所在的时区。您通常可以使用 JavaScript 获得与 UTC 的当前偏移量,但这并没有给您始终如一地正确处理所需的所有信息。迟早您可能必须针对他们所在的时区进行每个用户的设置。

于 2008-11-19T10:04:49.740 回答
1

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

如果您在许多不同的时区有许多客户,并且存储的信息曾经被整理或共享 - 事件的顺序将不正确。例如,格林威治标准时间 10:16 早于美国东部时间 10:30。

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

于 2008-11-19T10:19:55.203 回答