C# 当夏时制发生变化时,在一个月的几天内迭代

C# 当夏时制发生变化时,在一个月的几天内迭代,c#,timezone,C#,Timezone,我正在创建一个日期列表,从一个月最后一天的开始到下个月的第一天结束,都以UTC为单位。对于本月(2013年10月),法国时区的用户将其月份开始UTC日期CalendarMonthStartUTC设置为晚上9点30分,其UTC中的结束日期CalendarMonthEndUTC设置为晚上10点31分 我有一个这样的循环: DateTime StartTime = CalendarMonthStartUTC; DateTime EndTime = new DateTime() while (Star

我正在创建一个日期列表,从一个月最后一天的开始到下个月的第一天结束,都以UTC为单位。对于本月(2013年10月),法国时区的用户将其月份开始UTC日期
CalendarMonthStartUTC
设置为晚上9点30分,其UTC中的结束日期
CalendarMonthEndUTC
设置为晚上10点31分

我有一个这样的循环:

DateTime StartTime = CalendarMonthStartUTC;
DateTime EndTime = new DateTime()

while (StartTime < CalendarMonthEndUTC)
{
     EndTime = StartTime.AddHours(24);
     ... do something here
     StartTime = StartTime.AddHours(24);
} 
        var timeZone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
        var utcTime = TimeZoneInfo.ConvertTimeToUtc(startDay, timeZone)); 
DateTime StartTime=CalendarMonthStartUTC;
DateTime EndTime=新的DateTime()
while(开始时间
由于夏时制的改变,这个循环在一年中的所有月份都可以正常工作,但在10月份除外。夏时制的改变会产生一个海外建筑运营管理局的错误,因为循环在每次迭代时增加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);
        }

但是,如果OP需要执行中间计算(在开始日期和结束日期之间),并且夏令时没有计算在内,那么会累积一个错误,不是吗?@varocarbas不确定您所说的是哪种计算?生成UTC时间列表后,您可以根据需要使用UTC时间进行间隔计算等。我现在更正确地阅读了您的代码,但我错了:您通过忽略时间问题来增加天数!!毫无疑问,这是一个更好的解决方案。我太专注于时间了,所以误读了你的代码,对不起+我删除了我的答案,因为只有考虑到具体的时间才有意义;毫无疑问,在一整天的时间里,你的代码会更好。在当地时间工作是正确的一般方法,但只有在用户的计算机上运行(例如在桌面或移动应用程序中)时,这种特定代码才是好的。如果它以任何方式在服务器上运行,例如在web应用程序中,则应避免使用
DateTimeKind.Local
.ToUniversalTime()
,而应使用
TimeZoneInfo
类上的方法。@MattJohnson说得好。我以为这是本地机器上指定的时区。我添加了一个用于从指定的其他时区的本地时间转换的代码段。10月份的最后一个有效日期时间是11月1日之前的一个刻度。UTC不受夏令时更改的影响,没有错误。@HansPassant:没有。当一天超过24小时(即夏令时结束时添加一小时)并且我只添加24小时时,错误就会出现。不,UTC天总是24小时。当您将UTC日期时间转换为本地时间时,由于DST的变化,您可能会得到或多或少的天数。如果您想计算特定的小时间隔(并对每个间隔执行中间计算,如代码中所示),您必须考虑夏令时(以及我编写的答案行上的代码);但就你对整天都感兴趣而言,Ergwun的方法显然更好。我也把注意力放在了时间上,在这里失去了真正的意义(我写的代码很好,但不必要的复杂)。。。除非每天的具体时间(开始时间和结束时间)对您很重要(不确定您在“/…在这里做点什么”部分中正在做什么),也就是说,如果您想知道在“小时级别”发生了什么,尽管增加了天数。如果您需要更多地控制每次迭代中发生的事情(并且每次都考虑夏令时),请告诉我,我可以取消删除我的答案。正如你提出的问题,Ergwun的答案似乎是最恰当的解决方案。