关于c#:迭代DayLight保存更改的一个月的日子

iterating through the days of a month when DayLight saving changes

我正在创建一个从月的最后一天开始到下个月的第一天结束的日期列表,全部是UTC。 对于本月(2013年10月),法国时区的用户在9月30日晚上10点开始他的月开始UTC日期CalendarMonthStartUTC,他在UTC中的结束日期CalendarMonthEndUTC是10/31 @ 11PM。

我有一个看起来像这样的循环:

1
2
3
4
5
6
7
8
9
DateTime StartTime = CalendarMonthStartUTC;
DateTime EndTime = new DateTime()

while (StartTime < CalendarMonthEndUTC)
{
     EndTime = StartTime.AddHours(24);
     ... do something here
     StartTime = StartTime.AddHours(24);
}

由于DayLight保存更改会导致OBO错误,因此循环在每次迭代时添加24小时,因此该循环在一年中的所有月份都能正常工作,因为DayLight保存更改。
我想知道如何修改我的循环,以便它可以工作,无论DayLight节省日期。

谢谢你的建议。


你不能只在当地工作,并在最后转换为UTC?

如果要对本地计算机上当前设置的时区执行计算,则可以执行以下操作:

1
2
3
4
5
6
7
8
9
        DateTime calendarMonth = new DateTime(2013, 10, 1, 0, 0, 0, DateTimeKind.Local);
        DateTime startDay = calendarMonth.AddDays(-1);
        DateTime endDay = calendarMonth.AddMonths(1);

        while (startDay <= endDay)
        {
            Console.WriteLine(startDay +" =" + startDay.ToUniversalTime());
            startDay = startDay.AddDays(1);
        }

如果您想为给定时区计算它而不管本地计算机设置如何,那么您将转换为UTC,如下所示:

1
2
        var timeZone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
        var utcTime = TimeZoneInfo.ConvertTimeToUtc(startDay, timeZone));