vks*_*ksp 7 .net c# datetime utc dst
我试图在一个时间间隔中看到时区中看到的所有偏移量.下面是我用来实现这个功能,我知道你可以使用TimeZoneInfo.BaseUtcOffset得到UTC offset了在标准时间的时区,但目前还没有类似的方法来获得一个夏令时期间,除非你通过一个特定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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果有更好的方法,请告诉我.
我试图在一个时间间隔中看到时区中看到的所有偏移量.
我强烈建议你不要试图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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后:
var zone = BclDateTimeZone.FromTimeZoneInfo(tzInfo);
var offsets = zone.GetZoneIntervalsInInterval(interval)
.Select(zi => zi.WallOffset)
.Distinct();
Run Code Online (Sandbox Code Playgroud)
这假设你的意思与我所说的"偏移"相同(即UTC和当地时间之间的差异).
| 归档时间: |
|
| 查看次数: |
3499 次 |
| 最近记录: |