Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用TimeZoneInfo类说明夏令时中的时间更改_C#_.net_Timezone_Console Application_Dst - Fatal编程技术网

C# 使用TimeZoneInfo类说明夏令时中的时间更改

C# 使用TimeZoneInfo类说明夏令时中的时间更改,c#,.net,timezone,console-application,dst,C#,.net,Timezone,Console Application,Dst,我有一些过时的代码试图解释夏令时造成的时间变化,如下所示: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { for (int i = 1;

我有一些过时的代码试图解释夏令时造成的时间变化,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 1; i <= 31; i++)
            {
                DateTime dt = new DateTime(1960, 3, i, 0, 0, 0);
                Console.WriteLine(dt.ToUniversalTime());
            }

            Console.WriteLine();

            for (int i = 1; i <= 30; i++)
            {
                DateTime dt = new DateTime(1960, 4, i, 0, 0, 0);
                Console.WriteLine(dt.ToUniversalTime());
            }

            Console.ReadKey();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间控制台应用程序2
{
班级计划
{
静态void Main(字符串[]参数)
{

对于(int i=1;i有一个dt.IsDaylightSavingTime()。它在1960年对我来说是4/4变化的(比你的晚一天),但我是CST。对于2012年,它在我的系统上是正确的。它可能是一个bug。它可能只是那一年,也可能是到X为止的所有年份

我想这就是原因:

“在20世纪60年代早期,夏时制的遵守是相当不一致的,有一个大杂烩的时间遵守,并没有关于何时更换时钟的协议。”


“1966年的《统一时间法案》在美国各地建立了统一(在每个时区内)夏令时制度。”

看起来Windows时区信息与我通过TZDB所期望的不匹配。下面是一个程序,用于显示~1960年到1965年之间的所有转换,同时显示BCL时区信息(包装)以及TZDB 2012i数据:

using System;
using NodaTime;

class Test
{
    static void Main()
    {
        var bcl = DateTimeZoneProviders.Bcl["Eastern Standard Time"];
        var tzdb = DateTimeZoneProviders.Tzdb["America/New_York"];

        ShowTransitions(bcl);
        ShowTransitions(tzdb);
    }

    static void ShowTransitions(DateTimeZone zone)
    {
        Console.WriteLine("Transitions for {0}", zone.Id);
        Instant start = Instant.FromUtc(1960, 1, 1, 0, 0);
        Instant end = Instant.FromUtc(1965, 1, 1, 0, 0);
        var interval = zone.GetZoneInterval(start);
        while (interval.Start < end)
        {
            Console.WriteLine(interval.Start);
            interval = zone.GetZoneInterval(interval.End);
        }
        Console.WriteLine();
    }
}
还有其他时区ID映射到“东部标准时间”,但我没有找到任何与Windows行为匹配的时区ID

我不认为这是一个
TimeZoneInfo
bug-我相信这是底层Windows时区数据中的一个潜在问题


当然,如果你想匹配TZDB数据,你可以使用野田佳彦时间:)

在不知道你所说的时区的情况下很难回答这个问题。还要记住,Windows对时区的概念并不总是与(比如)相同TZDB。我的时区是东部,但这会影响1960年夏令时的应用日期吗?@Christian,是的,DST的规则对于时区是不同的。甚至还有时区这里的规则是没有规则,只是随意选择的日期。对不起,问题是夏令时,而不是时区,我编辑了措辞,其中有歧义。@Christian:夏令时是时区的一部分。这就是问题所在。我相信即使是“东部”是不明确的,因为不同的地方会在不同的时间发生变化。你的时区信息的ID是什么?DateTimeZoneProviders.Tzdb[“美国/纽约”]对我来说并不存在(抛出例外;实际上在你的输出中你有“美国/多伦多”),但是有一个列表可以将城市映射到某个地方的适当时区吗?实际上带下划线的“America/New_York”(美国/纽约)是存在的…,但在某处还有列表吗?想把“Las Vegas”(拉斯维加斯)映射到任何时区…@PaulWestcott:修复了,谢谢-抱歉输入错误。恐怕我不知道有什么好的映射列表。
using System;
using NodaTime;

class Test
{
    static void Main()
    {
        var bcl = DateTimeZoneProviders.Bcl["Eastern Standard Time"];
        var tzdb = DateTimeZoneProviders.Tzdb["America/New_York"];

        ShowTransitions(bcl);
        ShowTransitions(tzdb);
    }

    static void ShowTransitions(DateTimeZone zone)
    {
        Console.WriteLine("Transitions for {0}", zone.Id);
        Instant start = Instant.FromUtc(1960, 1, 1, 0, 0);
        Instant end = Instant.FromUtc(1965, 1, 1, 0, 0);
        var interval = zone.GetZoneInterval(start);
        while (interval.Start < end)
        {
            Console.WriteLine(interval.Start);
            interval = zone.GetZoneInterval(interval.End);
        }
        Console.WriteLine();
    }
}
Transitions for Eastern Standard Time
1959-10-25T06:00:00Z
1960-04-03T07:00:00Z
1960-10-30T06:00:00Z
1961-04-02T07:00:00Z
1961-10-29T06:00:00Z
1962-04-01T07:00:00Z
1962-10-28T06:00:00Z
1963-04-07T07:00:00Z
1963-10-27T06:00:00Z
1964-04-05T07:00:00Z
1964-10-25T06:00:00Z

Transitions for America/Toronto
1959-10-25T06:00:00Z
1960-04-24T07:00:00Z
1960-10-30T06:00:00Z
1961-04-30T07:00:00Z
1961-10-29T06:00:00Z
1962-04-29T07:00:00Z
1962-10-28T06:00:00Z
1963-04-28T07:00:00Z
1963-10-27T06:00:00Z
1964-04-26T07:00:00Z
1964-10-25T06:00:00Z