从具有偏移量的日期时间字符串中获取原始时间

时间:2011-10-26 23:57:51

标签: c# datetime

如果我跑:

// 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

4 个答案:

答案 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。