我有时间以utc格式保存在sql数据库中。我在gridview上显示那些时间,但它们仍然是UTC格式。我想在当地时间将它们转换为客户端的浏览器。问题是虽然我可以获得仅适用于当前日期/时间的时区偏移量。如果将来某些日期在夏令时期间结束,那么这种抵消可能会改变。我对网络编程比较陌生,但似乎我需要做的是运行一些Javascript,因为每个条目都绑定到gridview,它以某种方式获取C#datetimeoffset对象并将其转换为本地时间。或许那可能不可能?
答案 0 :(得分:8)
如果你有一个TimeZoneInfo
对象,可以在服务器端完成。您可以使用静态ConvertTimeFromUtc()
方法。
在C#中:
DateTime localTime = TimeZoneInfo.ConvertTimeFromUtc(myDbDateTime, myTimeZoneInfo);
如果你在服务器端没有时区,那么事情变得棘手,因为javascript不提供客户端的时区(除非它们在美国,甚至只在某些浏览器上)。在这种情况下,最好强制用户选择他们当前的时区并将其存储在他们的帐户中。如果向匿名用户显示此内容,则默认情况下应显示为UTC,并提供一个选项以针对选定的时区刷新它。
<强>更新强>
尝试自动确定用户的时区时会出现几个问题。
javascript函数getTimezoneOffset()
最初可能听起来不错,但由于有多个时区具有相同的偏移量,因此这不是唯一值。许多这些非独特区域之间的区别在于它们实现了夏令时。
示例:Indiana不认为DST。因此,半年的偏移量与东部时间相匹配,而另一半的偏移量等于中心时间。
但是,如果您的用户群主要位于美国且使用IE,Chrome,Safari或Firefox,则可以使用toString()
对象上的Date
方法获取时区。这些浏览器以不同的方式将时区附加到日期字符串。在美国以外的地区,所有浏览器都不包含时区(尽管有些人可能仍会显示)。
打开http://jsbin.com/onulo3观察:
IE8: Sun Feb 14 22:12:22 EST 2010 Chrome: 2010年2月14日星期二22:12:22 GMT-0500(东部标准时间)
Safari: 2010年2月14日星期二22:12:22 GMT-0500(东部标准时间)
Firefox: 2010年2月14日星期二22:12:22 GMT-0500(东部标准时间)
通过一些解析,您现在可以确定所有美国用户的时区。对于其他人,您可以用UTC显示时间(并注意到这一点)。
答案 1 :(得分:1)
我在“印第安纳州夏令时”中找到了以下内容: http://www.timetemperature.com/tzus/indiana_time_zone.shtml
截至2010年1月18日,Microsoft系统库调用 TimeZoneInfo.ConvertTimeFromUtc似乎反映了这种行为,我正在检查..
答案 2 :(得分:-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());