我想做的事情非常简单:
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的方式发送回客户端?
答案 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
- 此结构包含时区偏移属性,因此在创建实例时,您应指定要使用的偏移量。