我有时间以 utc 格式保存在 sql 数据库中。我在 gridview 上显示这些时间,但它们仍然是 UTC 格式。我想将它们转换为本地时间的客户端浏览器。问题是,虽然我可以获得仅适用于当前日期/时间的时区偏移量。如果未来的某些日期最终发生在夏令时期间,则该偏移量可能会发生变化。我对 Web 编程比较陌生,但似乎我需要做的是运行一些 Javascript,因为每个条目都绑定到 gridview,它以某种方式获取 C# datetimeoffset 对象并将其转换为本地时间。或者那是不可能的?
3 回答
TimeZoneInfo
如果您有对象,这可以在服务器端完成。您可以使用静态ConvertTimeFromUtc()
方法。
在 C# 中:
DateTime localTime = TimeZoneInfo.ConvertTimeFromUtc(myDbDateTime, myTimeZoneInfo);
如果您在服务器端没有时区,事情就会变得棘手,因为 javascript 不提供客户端的时区(除非它们在美国,即使在某些浏览器上也是如此)。在这种情况下,最好强制用户选择他们当前的时区并将其存储在他们的帐户中。如果这是向匿名用户显示的,您可能应该默认以 UTC 显示,并提供一个选项来为选定的时区刷新它。
更新
尝试自动确定用户的时区时会出现几个问题。
- 用户代理不向服务器提供时区。
- 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 显示时间(并附上相关通知)。
我在“印第安纳夏令时”上找到了以下内容: http ://www.timetemperature.com/tzus/indiana_time_zone.shtml
截至目前,2010 年 1 月 18 日,Microsoft 系统库调用 TimeZoneInfo.ConvertTimeFromUtc 似乎反映了这种行为,正在检查..
这里有两种转换方法。
方式#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());