夏令时间如何使用TimeZoneInfo获取当地时间?
我试图使用DateTimeOffset来传达任何时区的特定时间。 我无法弄清楚如何使用TimeZoneInfo来处理夏时制。
var dt = DateTime.UtcNow; Console.WriteLine(dt.ToLocalTime()); var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero); Console.WriteLine(utcOffset.ToOffset(tz.BaseUtcOffset));
这打印出来:
6/2/2010 4:37:19 PM 6/2/2010 3:37:19 PM -06:00
我在中央时区,而且我们目前处于夏令时。 我正试图让第二行读取:
6/2/2010 4:37:19 PM -05:00
BaseUtcOffset显然不会基于DST进行更改。
我怎样才能得到适当的偏移值正确的时间?
谢谢。
您需要从TimeZoneInfo获取UtcOffset,然后将其传递给ToOffset()方法:
var dt = DateTime.UtcNow; Console.WriteLine(dt.ToLocalTime()); var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero); Console.WriteLine(utcOffset.ToOffset(tz.GetUtcOffset(utcOffset)));
您也可以使用TimeZoneInfo.ConvertTimeFromUtc,这将允许夏令时:
DateTime utc = DateTime.UtcNow; TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(utc, zone);
或者,如果您不想硬编码时区标识符 ,则更好:
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id); DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi);
我是一个.NET和stackoverflow的初学者,所以我可能是错的,但这里是:
使用TimeZoneInfo.ConvertTimeFromUtc将允许夏令时,并根据时区+可能的DST偏移量转换为正确的时间。 但是 – 结果对象中的偏移本身将显示标准时间的偏移量,而不考虑夏令时。 所以,如果你想在对象上做一个ToString,你将最终得到正确的时间(以小时和分钟为单位),但是在夏令时期间错误的偏移,这可能导致代码后面错误的时间。
如果使用GetUtcOffset获取特定时间的偏移量,然后在DateTimeOffset对象上执行ToOffset,则小时/分钟和偏移量本身都将正确转换,并且可以安全地执行ToString。
string ExpectedDateTimePattern = "yyyy'-'MM'-'dd'T'HH':'mm':'ss''zzz"; string timeZoneId = "FLE Standard Time"; string dateTimestr = "2017-10-09T09:00:00+02:00"; DateTimeOffset dto = DateTimeOffset.Parse(dateTimeStr); TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); TimeSpan offset = zone.GetUtcOffset(dto); dto = dto.ToOffset(offset); string localTime = dto.ToString(ExpectedDateTimePattern);
localTime将返回“2017-10-09T10:00:00 + 03:00”。
datetimeoffset timezoneinfo getutcoffset