首页 文章

如何使用TimeZoneInfo在夏令时期间获取当地时间?

提问于
浏览
72

我正在尝试使用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进行更改 .

如何使用正确的偏移值获得正确的时间?

4 回答

  • 47

    您还可以使用TimeZoneInfo.ConvertTimeFromUtc,这将允许夏令时:

    DateTime utc = DateTime.UtcNow;
    TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
    DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(utc, zone);
    
  • 53

    或者更好的是,如果您不想对时区标识符进行硬编码:

    TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id);
    DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi);
    
  • 7

    您需要从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)));
    
  • 3

    我是.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

相关问题