2

我正在创建一个从当月最后一天开始到下个月第一天结束的日期列表,全部以 UTC 表示。对于本月(2013 年 10 月),法国时区的用户的 UTC 开始日期CalendarMonthStartUTC为 9/30 @ 10PM,UTC 结束日期CalendarMonthEndUTC为 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 小时进行迭代。我想知道如何修改我的循环,以便无论夏令时如何都能正常工作。

感谢您的建议。

4

1 回答 1

3

你不能只在本地时间工作,最后转换为 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)); 
于 2013-10-13T15:06:35.607 回答