从带有偏移量的datetime字符串获取起始时间

本文关键字:获取 时间 字符串 datetime 偏移量 | 更新日期: 2023-09-27 18:12:25

如果我运行:

// 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)的本地时间?

从带有偏移量的datetime字符串获取起始时间

您可以使用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()获取可用的时区信息。

DateTimeOffset结构似乎是专门为处理时区而构建的。它包含了DateTime类型的大部分功能。

string timeString = "2011-06-15T07:10:25.894+02:00"; 
DateTimeOffset time = DateTimeOffset.Parse(timeString);

正如本文所说明的,当您需要明确地标识单个时间点时,您应该使用DateTimeOffset而不是DateTime

锁定使用TimeZoneInfo - http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx进行转换。FindSystemTimeZoneById和ConvertTimeFromUtc应该足够了。您可能需要先使用DateTime. tuniversaltime .

将本地DateTime转换为UTC。

可以设置DateTime为Parse的格式。例如,如果我想将DateTime格式设置为法语/加拿大格式:

IFormatProvider culture = new CultureInfo("fr-CA", true);
DateTime dt = DateTime.ParseExact(dateString, "dd-MM-yyyy", culture);

您可以对en-US文化进行相同的操作,并添加时间格式以指定您想要的格式…