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

问题描述 投票:78回答:4

我正在尝试使用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));

此打印输出:

2010/6/2下午4:37:192010/6/2下午3:37:19 -06:00

我位于中央时区,我们目前处于夏令时。我试图让第二行显示为:

2010/6/2下午4:37:19 -05:00

BaseUtcOffset显然不会根据DST进行更改。

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

c# datetimeoffset timezone
4个回答
57
投票

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

53
投票

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

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

7
投票

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

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

4
投票

我都是.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”。

[

© www.soinside.com 2019 - 2024. All rights reserved.