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