3

C# を使用してすべてのタイム ゾーンの夏時間の境界を取得するにはどうすればよいですか?

4

2 に答える 2

5

TimeZone.GetDaylightChangesメソッドを見てください。

編集:

TimeZoneクラスを見ると、ローカルタイムゾーンのみをサポートし、現在の年のみをサポートしているようです。TimeZoneInfo.GetAdjustmentRulesを見てください。これにより、任意のタイムゾーンの調整ルールを取得できます。そのページの例は、ここでのタスクと非常によく似ているようです。

于 2012-10-17T18:34:08.343 に答える
4

免責事項:私は以下で参照されているNodaTimeライブラリの主な著者です:)

バニラの.NETコードだけを使用するのは比較的難しいです

  • TimeZone履歴データを使用しません
  • TimeZoneInfo遷移を見つけるのは簡単ではありません。基本的に、ルールデータを自分で解釈する必要があります。すべての情報を提供しますが、経験から、本当に必要な場合を除いて、それに対してコーディングを試みることは避けることをお勧めします。TimeZoneInfo.GetAdjustmentRules

ただし、 Noda Timeを使用すると、これをかなり簡単に行うことができます。以下のコードは、BCLタイムゾーンのラッパーを使用しています。TZDBタイムゾーン(「ヨーロッパ/ロンドン」など)を使用するように変更Bclします。Tzdb

using System;
using NodaTime;

class Test
{
    static readonly Instant Start = Instant.FromUtc(2002, 10, 17, 0, 0);
    static readonly Instant End = Instant.FromUtc(2012, 10, 17, 0, 0);

    static void Main()
    {
        var provider = DateTimeZoneProviders.Bcl;
        foreach (var id in provider.Ids)
        {
            var zone = provider[id];
            ShowTransitions(zone);
        }        
    }

    static void ShowTransitions(DateTimeZone zone)
    {
        Console.WriteLine("{0}:", zone.Id);
        var zoneInterval = zone.GetZoneInterval(Start);
        while (zoneInterval.End < End)
        {
            Console.WriteLine("{0} - {1}: {2}",
                              zoneInterval.Start,
                              zoneInterval.End,
                              zoneInterval.WallOffset);
            zoneInterval = zone.GetZoneInterval(zoneInterval.End);
        }
    }
}
于 2012-10-17T18:39:09.070 に答える