这里有一些您可以用于此的扩展方法。
首先,这个AddDays方法与您所询问的签名匹配。 它适用于DateTime值:
public static DateTime AddDays(this DateTime dt, double days, TimeZoneInfo tz)
{
DateTimeKind originalKind = dt.Kind;
if (originalKind != DateTimeKind.Unspecified)
{
dt = TimeZoneInfo.ConvertTime(dt, tz);
}
DateTime added = dt.AddDays(days);
DateTimeOffset resolved = added.ToDateTimeOffset(tz);
switch (originalKind)
{
case DateTimeKind.Local:
return resolved.LocalDateTime;
case DateTimeKind.Utc:
return resolved.UtcDateTime;
default:
return resolved.DateTime;
}
}
这里是那个扩展方法的另一种变体。它作用于 DateTimeOffset
值:
public static DateTimeOffset AddDays(this DateTimeOffset dto, double days, TimeZoneInfo tz)
{
dto = TimeZoneInfo.ConvertTime(dto, tz);
DateTime added = dto.DateTime.AddDays(days);
DateTimeOffset resolved = added.ToDateTimeOffset(tz);
return resolved;
}
上述两种方法都依赖于以下ToDateTimeOffset
扩展方法(我现在已经在几篇不同的帖子中使用了此方法)。
public static DateTimeOffset ToDateTimeOffset(this DateTime dt, TimeZoneInfo tz)
{
if (dt.Kind != DateTimeKind.Unspecified)
{
DateTimeOffset dto = new DateTimeOffset(dt.ToUniversalTime(), TimeSpan.Zero);
return TimeZoneInfo.ConvertTime(dto, tz);
}
if (tz.IsAmbiguousTime(dt))
{
TimeSpan[] offsets = tz.GetAmbiguousTimeOffsets(dt);
TimeSpan offset = offsets[0] > offsets[1] ? offsets[0] : offsets[1];
return new DateTimeOffset(dt, offset);
}
if (tz.IsInvalidTime(dt))
{
TimeSpan[] offsets = { tz.GetUtcOffset(dt.AddDays(-1)), tz.GetUtcOffset(dt.AddDays(1)) };
TimeSpan gap = offsets[1] - offsets[0];
return new DateTimeOffset(dt.Add(gap), offsets[1]);
}
return new DateTimeOffset(dt, tz.GetUtcOffset(dt));
}
最后,我要指出还有另一个可以考虑的选择:使用
Noda Time库。它的
ZoneDateTime.Add
方法正是为此而设计的。
AddDays
存在,但它需要一个double
参数,而你在这种情况下传递了两个参数。除非我误解了你的问题。 - CharmanderdayInSpecificTimezone
,它是根据特定时区创建的(正如其名称所示)。AddDays()
不是已经考虑了传递的时区吗? - C4d