从带有偏移量的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
)的本地时间?
您可以使用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为Parse的格式。例如,如果我想将DateTime格式设置为法语/加拿大格式:
IFormatProvider culture = new CultureInfo("fr-CA", true);
DateTime dt = DateTime.ParseExact(dateString, "dd-MM-yyyy", culture);
您可以对en-US文化进行相同的操作,并添加时间格式以指定您想要的格式…