为什么新的DateTimeOffset(DateTime.Today).AddDays(4).Offset和新的DateTimeOffset(DateTime.Today.AddDays(4))。Offset返回不同的值?

Mik*_*nov 1 .net datetime datetimeoffset

我目前在UTC + 1区域。TimeZoneInfo.Local.BaseUtcOffset返回+1。

new DateTimeOffset(DateTime.Today).AddDays(4).Offset返回+1。

但是new DateTimeOffset(DateTime.Today.AddDays(4)).Offset返回+2!

甚至更有趣的是,直到加上四天的偏移量都是一样的。从四天开始,通话new DateTimeOffset(DateTime.Today.AddDays(x)).Offset返回+2偏移。为什么?

//Same offset +1
var offset2 = new DateTimeOffset(DateTime.Today).AddDays(7).Offset;
var offset22 = new DateTimeOffset(DateTime.Today.AddDays(7)).Offset;

//Same offset +1
var offset3 = new DateTimeOffset(DateTime.Today).AddDays(3).Offset;
var offset32 = new DateTimeOffset(DateTime.Today.AddDays(3)).Offset;

//Different offset +1 and +2
var offset4 = new DateTimeOffset(DateTime.Today).AddDays(4).Offset;
var offset42 = new DateTimeOffset(DateTime.Today.AddDays(4)).Offset;

//Different offset +1 and +2
var offset5 = new DateTimeOffset(DateTime.Today).AddDays(5).Offset;
var offset52 = new DateTimeOffset(DateTime.Today.AddDays(5)).Offset;
Run Code Online (Sandbox Code Playgroud)

Joe*_*Joe 5

比我的评论更严肃的答案...

从MSDN:

因为DateTimeOffset对象不代表特定时区中的日期和时间,所以AddDays方法在执行日期和时间算术时不会考虑特定时区的调整规则。

因此

DateTimeOffset(DateTime.Today).AddDays(5)
Run Code Online (Sandbox Code Playgroud)

不会更改原始日期的时区(今天= CET = UTC + 1)

DateTime.Today.AddDays(5)
Run Code Online (Sandbox Code Playgroud)

给出5天的当地时间(CEST = UTC + 2)。

所以

DateTimeOffset(DateTime.Today.AddDays(5))
Run Code Online (Sandbox Code Playgroud)

将给出一个带有CEST偏移量的时间(UTC + 2)