88

我试图用它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:19
2010 年 6 月 2 日下午 3:37:19 -06:00

我在中央时区,我们目前处于夏令时。我试图让第二行阅读:

2010 年 6 月 2 日下午 4:37:19 -05:00

BaseUtcOffset显然不会根据 DST 改变。

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

4

5 回答 5

72

您需要从 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)));
于 2010-06-02T22:15:33.847 回答
70

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

DateTime utc = DateTime.UtcNow;
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(utc, zone);
于 2013-05-28T10:39:45.980 回答
12

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

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id);
DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi);
于 2015-03-11T19:53:18.787 回答
6

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

于 2017-11-07T12:03:54.020 回答
0

这将自动调整...并根据您的时区返回时间。

公共静态字符串 SetLastModified (

TimeZoneInfo csttzi = TimeZoneInfo.FindSystemTimeZoneById(TimeZone.CurrentTimeZone.StandardName);

日期时间 cstTime = TimeZoneInfo.ConvertTime(DateTime.UtcNow, csttzi);

return String.Format("DaylightSavingTime: {0}", cstTime.IsDaylightSavingTime().ToString());

}

于 2022-02-17T20:56:25.057 回答