整个下午我一直在绞尽脑汁想要把它弄清楚。从本质上讲,问题本身似乎很简单。我给出了一个日期/时间,代表另一个时区(非本地)的日期和时间。我想将此值转换为UTC值以存储在数据库中。但是,我在网上找到的所有方法似乎都指向您从UTC开始或以本地时区开始。您可以从这些区域转换为其他时区,但不能从那些区域开始。结果,似乎我必须做一些复杂的偏移数学来做我想要的。以下是问题的一个示例:
var dateString = "8/20/2014 6:00:00 AM";
DateTime date1 = DateTime.Parse(dateString,
System.Globalization.CultureInfo.InvariantCulture);
var currentTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
// Now the server is set to Central Standard Time, so any automated offset calculation that it runs will come from that point of view:
var utcDate = date1.ToUniversalTime; // This is wrong
// Similarly, if I try to reverse-calculate it, it doesn't work either
var convertedDate = TimeZoneInfo.ConvertTime(date1, currentTimeZone);
utcDate = convertedDate.ToUniversalTime; // This is also wrong
本质上,我想以某种方式告诉系统我正在使用的日期时间对象是来自本地以外的时区,因此我知道转换是正确的。我知道我最终需要在那里计算夏令时,但这是另一天的问题。
答案 0 :(得分:2)
this方法会对您有用吗?
TimeZoneInfo.ConvertTime方法转换来自一个时区的时间 到另一个。
或者,您可以使用ConvertTimeToUtc
方法将任何日期(指定源时区)简单地转换为UTC。
var dateString = "8/20/2014 6:00:00 AM";
DateTime date1 = DateTime.Parse(dateString,
System.Globalization.CultureInfo.InvariantCulture);
var currentTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
var utcDate = TimeZoneInfo.ConvertTimeToUtc(date1, currentTimeZone);
答案 1 :(得分:1)
System.DateTime
结构只有两位用于存储“种类”信息。这就是为什么你只能拥有“本地”或“通用”或“未知”(或“魔术本地”)。
看看System.DateTimeOffset
结构。它就像一个DateTime
,但它也保留了时区(偏离(加或减)UTC)。