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

我是.net和Stackoverflow的初学者,所以我可能错了,但是这里是:

使用TimeZoneInfo.convertTimeFromutc将允许节省日光的时间,并根据时区 +可能的DST偏移量转换为正确的时间。但是 - 结果对象中的偏移本身将显示标准时间的偏移,而不是考虑日光保存时间。因此,如果您想在对象上进行to绳,最终将获得正确的时间(以小时和几分钟的形式),但是在夏令时,错误的偏移时间是错误的,这可能会导致代码以后的时间到达错误的时刻。

如果您使用getUtCoffset在特定时间内获取偏移,然后在dateTimeOffset对象上进行toftset,则小时/分钟和偏移本身都会正确转换,并且您可以安全地进行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);

本地时间将返回“ 2017-10-09T10:00:00+03:00”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top