循环访问每月夏令时发生变化的日子

本文关键字:变化 日子 夏令时 访问 循环 | 更新日期: 2023-09-27 18:35:05

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

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

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

此循环在一年中的所有月份(10 月除外)都运行良好,因为夏令时更改会创建 OBO 错误,因为循环通过在每次迭代中添加 24 小时进行迭代。我想知道如何修改我的循环,使其无论夏令时如何都能正常工作。

感谢您的建议。

循环访问每月夏令时发生变化的日子

您不能只在本地时间工作,并在最后转换为 UTC 吗?

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

        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:

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