我想做的事情很简单:
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),我的目标是新加坡(UTC+8)。
现在,当我调用TimeZoneInfo.ConvertTime(dateTime,Tzi,target)时,首先将dateTime从UTC-8"转换"为UTC-6(Tzi时区),添加2小时。。。然后才从Tzi到目标。
有没有办法向TimeZoneInfo.ConvertTime发出信号,表明我发送的日期时间在我作为参数传入的时区中,而不是在服务器的时区中?
编辑:好吧,这两个答案都是很好的建议,但我似乎有不同的麻烦。ConvertTime(dateTime,Tzi,target)似乎工作正常,而真正的罪魁祸首实际上是:
return Json(new {data}, JsonRequestBehavior.AllowGet);
输出日期,如:"Created":"/Date(1346810072950)/"。我已经确认,发送日期因服务器上的时区而异(更改服务器的时区后需要重新启动AppPool)。有人对此有经验,并建议如何影响ASP.NET MVC以JSON输出日期并将其发送回客户端的方式?
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"));
您可以使用DateTimeOffset
而不是DateTime
-此结构包含时区偏移量属性,因此在创建其实例时,应指定要使用的偏移量。