我试图在一个时间间隔内获取在一个时区内看到的所有偏移量。下面是我用来完成此操作的函数,我知道您可以使用 TimeZoneInfo.BaseUtcOffset
获取标准时间时区的 UTC 偏移量
,但没有类似的方法方法在夏令时期间获取一个,除非您将特定的 DST
时间点传递给 GetUTCOffset()
方法。
static void GetOffsets(DateTime startTime, DateTime endTime, TimeZoneInfo tz)
{
var result = new HashSet<int>();
var adjRules = tz.GetAdjustmentRules();
result.Add(tz.BaseUtcOffset);
foreach (var adjustmentRule in adjRules)
{
if ((startTime >= adjustmentRule.DateStart && startTime <= adjustmentRule.DateEnd) || (endTime >= adjustmentRule.DateStart && endTime <= adjustmentRule.DateEnd) ||
(stTime <= adjustmentRule.DateStart && endTime >= adjustmentRule.DateEnd))
{
if(adjustmentRule.DaylightDelta != TimeSpan.Zero)
{
if (!result.Contains(tz.BaseUtcOffset + adjustmentRule.DaylightDelta))
result.Add((tz.BaseUtcOffset + adjustmentRule.DaylightDelta));
}
}
}
foreach (var res in result)
{
Console.WriteLine(res);
}
}
如果有更好的方法,请告诉我。
最佳答案
I am trying to get all offsets seen in a timezone, in an interval.
我强烈建议您避免尝试直接使用TimeZoneInfo
。在某些年份,某些区域的调整规则可能出奇地尴尬,正如我发现的那样。
虽然我有偏见,但我建议使用 Noda Time ,它可以包装 TimeZoneInfo
并通过 BclDateTimeZone.FromTimeZoneInfo
为您完成繁重的工作。你的问题在要求方面并不完全清楚,但如果你能多说一点你想做什么,我可以为你编写适当的 Noda Time 代码。
你的初始描述可以用这样的东西来实现:
public IEnumerable<ZoneInterval> GetZoneIntervalsInInterval
(this DateTimeZone zone, Interval interval)
{
Instant current = interval.Start;
while (current < interval.End && current != Instant.MaxValue)
{
ZoneInterval zi = zone.GetZoneInterval(current);
yield return zi;
current = zi.End;
}
}
然后:
var zone = BclDateTimeZone.FromTimeZoneInfo(tzInfo);
var offsets = zone.GetZoneIntervalsInInterval(interval)
.Select(zi => zi.WallOffset)
.Distinct();
这是假设您和我所说的“偏移量”指的是同一个东西(即 UTC 和本地时间之间的差异)。
关于c# - 如何在 .NET 中获取夏令时期间的 UTC 偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13328349/