关于c#:如何在夏令时期间使用TimeZoneInfo获取本地时间?

How to use TimeZoneInfo to get local time during Daylight Savings Time?

我试图用datetimeoffset在任何时区传递一个特定的时间点。我不知道如何使用TimeZoneInfo来处理夏令时。

1
2
3
4
5
6
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));

打印出:

1
2
6/2/2010 4:37:19 PM
6/2/2010 3:37:19 PM -06:00

我在中央时区,现在是夏令时。我想让第二行读:

1
6/2/2010 4:37:19 PM -05:00

根据DST,baseutcoffset显然没有改变。

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


您需要从timezoneinfo中获取utcoffset,然后将其传递给tooffset()方法:

1
2
3
4
5
6
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,这将允许夏令时:

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


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

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


我在.NET和StackOverflow都是初学者,所以我可能是错的,但下面是:

使用timezoneinfo.converttimefromutc将允许夏令时,并根据时区+可能的DST偏移量转换为正确的时间。但是-结果对象中的偏移本身将显示标准时间的偏移,而不考虑夏令时。因此,如果您想在对象上执行ToString,您将以正确的时间(以小时和分钟为单位)结束,但夏令时偏移错误,这可能导致代码后面的时间错误。

如果使用getutcoffset获取特定时间的偏移量,然后对datetimeoffset对象执行to offset,则小时/分钟和偏移量本身都将正确转换,并且可以安全地执行tostring。

1
2
3
4
5
6
7
8
9
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);

当地时间返回"2017-10-09t10:00:00+03:00"。

日期时间偏移时间区域信息获取utcoffset