2012-09-04 42 views
2

我想要做的事情很简单:.NET日期时间及TimezoneInfo.ConvertTime党

private static TimeZoneInfo Tzi = // ... custom timeZone I've set; 
    public static DateTime ToTimeZone(DateTime dateTime, TimeZoneInfo target) 
    { 
     return TimeZoneInfo.ConvertTime(dateTime, Tzi, target); 
    } 

理念是 - 说得出服务器的所有日期将自动转换为特定的时区和保存这样对DB (UTC,美国中部,太平洋美国,无论如何)。

只要在服务器上设置的时区与Tzi相同,此功能就可以很好地工作。然而,如果不是这样,转换就会失败 - 创建DateTime实例时,.NET会将其设置为机器的TimeZone,然后TimeZoneInfo.ConvertTime(dateTime,Tzi,target)以一种奇怪的方式处理我的请求。例如,假设服务器时区是太平洋(UTC -8),我将Tzi设置为中央(UTC -6),并且我以Singapure(UTC +8)为目标。

现在,当我呼叫TimeZoneInfo.ConvertTime(dateTime,Tzi,目标)首先“将dateTime从UTC -8转换为UTC -6(Tzi时区),加上2小时......并且只有从Tzi到目标。

有没有办法发信号给TimeZoneInfo.ConvertTime我发送的dateTime是在TimeZone中我是通过参数传入的,而不是在服务器的TimeZone中?

编辑: 好的,两个答案都是很好的建议,但似乎我有不同的麻烦。 TimeZoneInfo.ConvertTime(DATETIME,奥兹,目标)似乎是正常工作,而真正的罪魁祸首居然是:

return Json(new {data}, JsonRequestBehavior.AllowGet); 

输出日期,如: “创建”: “/日期(1346810072950)/”。我已经确认发送日期根据服务器上的TimeZone而不同(更改服务器的TimeZone后需要重新启动AppPool)。任何人都有这方面的经验,并建议如何影响ASP.NET MVC输出日期在JSON中的方式发回给客户端?

+2

相关:http://stackoverflow.com/questions/2532729/daylight-saving-time-and-timezone-best-practices – Oded

+0

1346802872950 ... – kape123

回答

2

可以使用DateTimeOffset代替DateTime - 这种结构包括一个时区偏移性,创造它的实例,所以当你要指定哪一个偏移使用。

3

ConvertTime应该做的工作。也许你的问题是DateTime.Kind

请看下面的例子:

// Gets current local date 
// Returns 04/09/12 11:30 in my case 
var date = DateTime.Now; 

// Sets DateTime as Unspecified kind (not local nor UTC) 
// Returns same date as before, but the date is not tagged as "local" 
date = DateTime.SpecifyKind(date, DateTimeKind.Unspecified); 

// Converts the current date, specified as UTC+12, into a date specified as UTC-11 
// Returns 03/09/12 12:30 in my case, which is the expected result 
// (23 hours between previous date and result) 
var zz = TimeZoneInfo.ConvertTime(
    date, 
    TimeZoneInfo.FindSystemTimeZoneById("UTC+12"), 
    TimeZoneInfo.FindSystemTimeZoneById("UTC-11")); 
+0

我总是享受downvotes没有任何评论解释... – ken2k