5

我有时间以 utc 格式保存在 sql 数据库中。我在 gridview 上显示这些时间,但它们仍然是 UTC 格式。我想将它们转换为本地时间的客户端浏览器。问题是,虽然我可以获得仅适用于当前日期/时间的时区偏移量。如果未来的某些日期最终发生在夏令时期间,则该偏移量可能会发生变化。我对 Web 编程比较陌生,但似乎我需要做的是运行一些 Javascript,因为每个条目都绑定到 gridview,它以某种方式获取 C# datetimeoffset 对象并将其转换为本地时间。或者那是不可能的?

4

3 回答 3

8

TimeZoneInfo如果您有对象,这可以在服务器端完成。您可以使用静态ConvertTimeFromUtc()方法。

在 C# 中:

DateTime localTime = TimeZoneInfo.ConvertTimeFromUtc(myDbDateTime, myTimeZoneInfo);

如果您在服务器端没有时区,事情就会变得棘手,因为 javascript 不提供客户端的时区(除非它们在美国,即使在某些浏览器上也是如此)。在这种情况下,最好强制用户选择他们当前的时区并将其存储在他们的帐户中。如果这是向匿名用户显示的,您可能应该默认以 UTC 显示,并提供一个选项来为选定的时区刷新它。

更新

尝试自动确定用户的时区时会出现几个问题。

  1. 用户代理不向服务器提供时区。
  2. Javascript 不提供对时区的访问(有时在某些浏览器中除外)。

javascript 函数getTimezoneOffset()最初可能听起来不错,但由于有多个时区具有相同的偏移量,因此这不是唯一值。许多这些非独特区域之间的区别在于它们对夏令时的实施。

示例:印第安纳州不考虑夏令时。因此,在半年中,它们的偏移量与东部时间一致,而另一半的偏移量与中部时间相同。

但是,如果您的用户群主要位于美国并使用 IE、Chrome、Safari 或 Firefox,那么您可以使用对象toString()上的方法Date来获取时区。这些浏览器以不同的方式将时区附加到日期字符串。在美国以外的地区,并非所有浏览器都包含时区(尽管有些浏览器可能仍会显示)。

打开http://jsbin.com/onulo3观察:
IE8: Sun Feb 14 22:12:22 EST 2010
Chrome: Sun Feb 14 2010 22:12:22 GMT-0500(东部标准时间)
Safari: Sun Feb 14 2010 22:12:22 GMT-0500(东部标准时间)
Firefox: 2010 年 2 月 14 日星期日 22:12:22 GMT-0500(东部标准时间)

通过一些解析,您现在可以确定所有美国用户的时区。对于其他所有人,您可以以 UTC 显示时间(并附上相关通知)。

于 2010-02-15T02:23:10.040 回答
1

我在“印第安纳夏令时”上找到了以下内容: http ://www.timetemperature.com/tzus/indiana_time_zone.shtml

截至目前,2010 年 1 月 18 日,Microsoft 系统库调用 TimeZoneInfo.ConvertTimeFromUtc 似乎反映了这种行为,正在检查..

于 2011-01-10T18:12:58.703 回答
-2

这里有两种转换方法。

方式#1:如果你有以秒为纪元格式的日期时间,只需使用类似的东西:

 var d=new Date(seconds_since_epoch);
 document.write(d.toString());

方式 #2:如果您只有 UTC 时间的年、月、日、小时、分钟和秒,请使用:

 var d=new Date(yyyy,mo-1,dd,hh,mi,ss); // in JavaScript, January is month 0
 document.write(d.toString());
于 2010-02-16T06:10:11.527 回答