如果我跑:
// 7:10 am at a location which has a +2 offset from UTC
string timeString = "2011-06-15T07:10:25.894+02:00";
DateTime time = DateTime.Parse(timeString);
它给了我time = 6/14/2011 10:10:25 PM
。这是我所在的当地时间(太平洋时间,即UTC -7)。
是否有一种优雅的方式来获取原点的当地时间,即6/15/2011 07:10:25 AM
?
答案 0 :(得分:3)
您可以使用TimeZoneInfo
:
DateTime localTime = DateTime.Now;
TimeZoneInfo targetTimeZone =
TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime targetTime = TimeZoneInfo.ConvertTime(localTime, targetTimeZone);
实际上,ConvertTimeBySystemTimeZoneId
方法会更简洁:
DateTime targetTime =
TimeZoneInfo.ConvertTimeBySystemTimeZoneId(localTime, "Eastern Standard Time");
您可以使用TimeZoneInfo.GetSystemTimeZones()
获取有关时区的信息。
答案 1 :(得分:2)
DateTimeOffset
结构似乎是为了专门处理时区而构建的。它包含DateTime
类型的大部分功能。
string timeString = "2011-06-15T07:10:25.894+02:00";
DateTimeOffset time = DateTimeOffset.Parse(timeString);
正如this article所示,只要您需要明确地识别单个时间点,就应该DateTimeOffset
而不是DateTime
。
答案 2 :(得分:0)
您可以格式化DateTime为Parse的方式。 例如,如果我希望DateTime采用法语加拿大格式:
IFormatProvider culture = new CultureInfo("fr-CA", true);
DateTime dt = DateTime.ParseExact(dateString, "dd-MM-yyyy", culture);
您可以按照相同的方式为en-US文化执行此操作,并添加时间格式以指定所需的格式...
答案 3 :(得分:0)
锁定使用TimeZoneInfo - http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx进行转换。 FindSystemTimeZoneById和ConvertTimeFromUtc应该足够了。您可能需要先使用DateTime.ToUniversalTime将本地DateTime转换为UTC。