如何在夏令时期间使用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);
链接地址: http://www.djcxy.com/p/29387.html

上一篇: How to use TimeZoneInfo to get local time during Daylight Savings Time?

下一篇: Insert UTC timestamp into MySQL