.NET DateTime& TimezoneInfo.ConvertTime聚会

时间:2012-09-04 09:06:47

标签: c# .net asp.net-mvc datetime timezone

我想做的事情非常简单:

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

想法是 - 所有到达服务器的日期都会自动转换为某个TimeZone并保存到DB(UTC,美国中部,美国太平洋等等)。

只要服务器上设置的时区与Tzi相同,这种方法就可以正常工作。但是,如果不是这样,转换失败 - 当创建DateTime实例时,.NET将其设置为机器的TimeZone,然后TimeZoneInfo.ConvertTime(dateTime,Tzi,target)以一种时髦的方式处理我的请求。例如,假设服务器时区是太平洋(UTC -8),我将Tzi设置为中央(UTC -6),我的目标是Singapure(UTC +8)。

现在,当我调用TimeZoneInfo.ConvertTime(dateTime,Tzi,target)时,首先将dateTime从UTC -8“转换”到UTC -6(Tzi时区),再添加2小时......然后才从Tzi到目标。

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

修改 好的,这两个答案都是很好的建议,但似乎我遇到了不同的麻烦。 TimeZoneInfo.ConvertTime(dateTime,Tzi,target)似乎工作正常,真正的罪魁祸首是:

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

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

2 个答案:

答案 0 :(得分: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"));

答案 1 :(得分:2)

您可以使用DateTimeOffset代替DateTime - 此结构包含时区偏移属性,因此在创建实例时,您应指定要使用的偏移量。