方法: 調整規則のあるタイムゾーンを作成するHow to: Create time zones with adjustment rules

アプリケーションで必要とされる正確なタイムゾーン情報は、次のような理由で特定のシステムに存在しない場合があります。The precise time zone information that is required by an application may not be present on a particular system for several reasons:

  • タイムゾーンがローカルシステムのレジストリに定義されていません。The time zone has never been defined in the local system's registry.

  • タイムゾーンに関するデータは、レジストリから変更または削除されています。Data about the time zone has been modified or removed from the registry.

  • タイムゾーンには、特定の履歴期間のタイムゾーン調整に関する正確な情報がありません。The time zone does not have accurate information about time zone adjustments for a particular historic period.

このような場合は、CreateCustomTimeZone メソッドを呼び出して、アプリケーションで必要とされるタイムゾーンを定義できます。In these cases, you can call the CreateCustomTimeZone method to define the time zone required by your application. このメソッドのオーバーロードを使用して、調整規則の有無に関係なくタイムゾーンを作成できます。You can use the overloads of this method to create a time zone with or without adjustment rules. タイムゾーンで夏時間がサポートされている場合は、固定調整規則または浮動調整規則のいずれかを使用して調整を定義できます。If the time zone supports daylight saving time, you can define adjustments with either fixed or floating adjustment rules. (これらの用語の定義については、「タイムゾーンの概要」の「タイムゾーンの用語」セクションを参照してください)。(For definitions of these terms, see the "Time Zone Terminology" section in Time zone overview.)

重要

CreateCustomTimeZone メソッドを呼び出すことによって作成されたカスタムタイムゾーンは、レジストリには追加されません。Custom time zones created by calling the CreateCustomTimeZone method are not added to the registry. 代わりに、CreateCustomTimeZone メソッド呼び出しによって返されるオブジェクト参照を使用してのみアクセスできます。Instead, they can be accessed only through the object reference returned by the CreateCustomTimeZone method call.

このトピックでは、調整規則を使用してタイムゾーンを作成する方法について説明します。This topic shows how to create a time zone with adjustment rules. 夏時間調整規則をサポートしていないタイムゾーンを作成するには、「方法: 調整規則のないタイムゾーンを作成する」を参照してください。To create a time zone that does not support daylight saving time adjustment rules, see How to: Create Time Zones Without Adjustment Rules.

浮動調整規則を使用してタイムゾーンを作成するにはTo create a time zone with floating adjustment rules

  1. それぞれの調整について (つまり、特定の期間にわたって標準時間外に移行するたびに)、次の手順を実行します。For each adjustment (that is, for each transition away from and back to standard time over a particular time interval), do the following:

    1. タイムゾーン調整の開始遷移時間を定義します。Define the starting transition time for the time zone adjustment.

      TimeZoneInfo.TransitionTime.CreateFloatingDateRule メソッドを呼び出して、移行の時間を定義する DateTime 値、遷移の月を定義する整数値、遷移が発生する曜日を定義する整数値、およびを定義する DayOfWeek 値を渡す必要があります。移行が発生する曜日。You must call the TimeZoneInfo.TransitionTime.CreateFloatingDateRule method and pass it a DateTime value that defines the time of the transition, an integer value that defines the month of the transition, an integer value that defines the week on which the transition occurs, and a DayOfWeek value that defines the day of the week on which the transition occurs. このメソッド呼び出しは、TimeZoneInfo.TransitionTime オブジェクトをインスタンス化します。This method call instantiates a TimeZoneInfo.TransitionTime object.

    2. タイムゾーン調整の終了遷移時間を定義します。Define the ending transition time for the time zone adjustment. これには、TimeZoneInfo.TransitionTime.CreateFloatingDateRule メソッドの別の呼び出しが必要です。This requires another call to the TimeZoneInfo.TransitionTime.CreateFloatingDateRule method. このメソッド呼び出しは、2つ目の TimeZoneInfo.TransitionTime オブジェクトをインスタンス化します。This method call instantiates a second TimeZoneInfo.TransitionTime object.

    3. CreateAdjustmentRule メソッドを呼び出し、調整の有効な開始日と終了日、遷移の時間を定義する TimeSpan オブジェクト、および夏時間との間の切り替えが発生するタイミングを定義する2つの TimeZoneInfo.TransitionTime オブジェクトを渡します。Call the CreateAdjustmentRule method and pass it the effective start and end dates of the adjustment, a TimeSpan object that defines the amount of time in the transition, and the two TimeZoneInfo.TransitionTime objects that define when the transitions to and from daylight saving time occur. このメソッド呼び出しは、TimeZoneInfo.AdjustmentRule オブジェクトをインスタンス化します。This method call instantiates a TimeZoneInfo.AdjustmentRule object.

    4. TimeZoneInfo.AdjustmentRule オブジェクトを TimeZoneInfo.AdjustmentRule オブジェクトの配列に割り当てます。Assign the TimeZoneInfo.AdjustmentRule object to an array of TimeZoneInfo.AdjustmentRule objects.

  2. タイムゾーンの表示名を定義します。Define the time zone's display name. 表示名は、標準の形式に準拠しています。この形式では、世界協定時刻 (UTC) からのタイムゾーンのオフセットがかっこで囲まれ、その後にタイムゾーンを識別する文字列、タイムゾーン内の1つ以上の都市、または1つ以上の cou が続きます。タイムゾーンの ntries またはリージョン。The display name follows a fairly standard format in which the time zone's offset from Coordinated Universal Time (UTC) is enclosed in parentheses and is followed by a string that identifies the time zone, one or more of the cities in the time zone, or one or more of the countries or regions in the time zone.

  3. タイムゾーンの標準時刻の名前を定義します。Define the name of the time zone's standard time. 通常、この文字列はタイムゾーンの識別子としても使用されます。Typically, this string is also used as the time zone's identifier.

  4. タイムゾーンの夏時間の名前を定義します。Define the name of the time zone's daylight time.

  5. タイムゾーンの標準名とは異なる識別子を使用する場合は、タイムゾーン識別子を定義します。If you want to use a different identifier than the time zone's standard name, define the time zone identifier.

  6. タイムゾーンの UTC からのオフセットを定義する TimeSpan オブジェクトをインスタンス化します。Instantiate a TimeSpan object that defines the time zone's offset from UTC. 時刻が UTC より遅いタイムゾーンには、正のオフセットがあります。Time zones with times that are later than UTC have a positive offset. 時刻が UTC より前のタイムゾーンでは、負のオフセットが使用されます。Time zones with times that are earlier than UTC have a negative offset.

  7. TimeZoneInfo.CreateCustomTimeZone(String, TimeSpan, String, String, String, TimeZoneInfo+AdjustmentRule[]) メソッドを呼び出して、新しいタイムゾーンをインスタンス化します。Call the TimeZoneInfo.CreateCustomTimeZone(String, TimeSpan, String, String, String, TimeZoneInfo+AdjustmentRule[]) method to instantiate the new time zone.

Example

次の例では、1918から現在のまでのさまざまな時間間隔の調整規則を含む米国の中部標準時のタイムゾーンを定義します。The following example defines a Central Standard Time zone for the United States that includes adjustment rules for a variety of time intervals from 1918 to the present.

TimeZoneInfo cst;
// Declare necessary TimeZoneInfo.AdjustmentRule objects for time zone
TimeSpan delta = new TimeSpan(1, 0, 0);
TimeZoneInfo.AdjustmentRule adjustment;
List<TimeZoneInfo.AdjustmentRule> adjustmentList = new List<TimeZoneInfo.AdjustmentRule>();
// Declare transition time variables to hold transition time information
TimeZoneInfo.TransitionTime transitionRuleStart, transitionRuleEnd;
                      
// Define new Central Standard Time zone 6 hours earlier than UTC
// Define rule 1 (for 1918-1919)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 03, 05, DayOfWeek.Sunday);
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 10, 05, DayOfWeek.Sunday); 
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1918, 1, 1), new DateTime(1919, 12, 31), delta, 
                                                           transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment); 
// Define rule 2 (for 1942)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 02, 09);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1942, 1, 1), new DateTime(1942, 12, 31), 
                                                           delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 3 (for 1945)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 23, 0, 0), 08, 14);
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 09, 30);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1945, 1, 1), new DateTime(1945, 12, 31), 
                                                           delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define end rule (for 1967-2006)
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 10, 5, DayOfWeek.Sunday);
// Define rule 4 (for 1967-73)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 04, 05, DayOfWeek.Sunday);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1967, 1, 1), new DateTime(1973, 12, 31), 
                                                           delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 5 (for 1974 only)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 01, 06);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1974, 1, 1), new DateTime(1974, 12, 31), 
                                                           delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 6 (for 1975 only)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 02, 23);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1975, 1, 1), new DateTime(1975, 12, 31), 
                                                           delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 7 (1976-1986)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 04, 05, DayOfWeek.Sunday);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1976, 1, 1), new DateTime(1986, 12, 31), 
                                                           delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 8 (1987-2006)  
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 04, 01, DayOfWeek.Sunday);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1987, 1, 1), new DateTime(2006, 12, 31), 
                                                           delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 9 (2007- )  
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 03, 02, DayOfWeek.Sunday);
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 11, 01, DayOfWeek.Sunday);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(2007, 1, 1), DateTime.MaxValue.Date, 
                                                           delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
              
// Convert list of adjustment rules to an array
TimeZoneInfo.AdjustmentRule[] adjustments = new TimeZoneInfo.AdjustmentRule[adjustmentList.Count];
adjustmentList.CopyTo(adjustments);
   
cst = TimeZoneInfo.CreateCustomTimeZone("Central Standard Time", new TimeSpan(-6, 0, 0), 
      "(GMT-06:00) Central Time (US Only)", "Central Standard Time", 
      "Central Daylight Time", adjustments);
Dim cst As TimeZoneInfo
' Declare necessary TimeZoneInfo.AdjustmentRule objects for time zone
Dim delta As New TimeSpan(1, 0, 0)
Dim adjustment As TimeZoneInfo.AdjustmentRule
Dim adjustmentList As New List(Of TimeZoneInfo.AdjustmentRule)
' Declare transition time variables to hold transition time information
Dim transitionRuleStart, transitionRuleEnd As TimeZoneInfo.TransitionTime
                      
' Define new Central Standard Time zone 6 hours earlier than UTC
' Define rule 1 (for 1918-1919)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#02:00:00AM#, 03, 05, DayOfWeek.Sunday)
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#02:00:00AM#, 10, 05, DayOfWeek.Sunday) 
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1918#, #12/31/1919#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment) 
' Define rule 2 (for 1942)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(#2:00:00AM#, 02, 09)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1942#, #12/31/1942#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 3 (for 1945)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(#11:00:00PM#, 08, 14)
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFixedDateRule(#2:00:00AM#, 09, 30)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1945#, #12/31/1945#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define end rule (for 1967-2006)
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#02:00:00AM#, 10, 5, DayOfWeek.Sunday)
' Define rule 4 (for 1967-73)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#2:00:00AM#, 04, 05, DayOfWeek.Sunday)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1967#, #12/31/1973#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 5 (for 1974 only)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(#2:00:00AM#, 01, 06)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1974#, #12/31/1974#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 6 (for 1975 only)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(#2:00:00AM#, 02, 23)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1975#, #12/31/1975#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 7 (1976-1986)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#2:00:00AM#, 04, 05, DayOfWeek.Sunday)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1976#, #12/31/1986#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 8 (1987-2006)  
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#2:00:00AM#, 04, 01, DayOfWeek.Sunday)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1987#, #12/31/2006#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 9 (2007- )  
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#2:00:00AM#, 03, 02, DayOfWeek.Sunday)
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#2:00:00AM#, 11, 01, DayOfWeek.Sunday)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/2007#, Date.MaxValue.Date, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
              
' Convert list of adjustment rules to an array
Dim adjustments(adjustmentList.Count - 1) As TimeZoneInfo.AdjustmentRule
adjustmentList.CopyTo(adjustments)
   
cst = TimeZoneInfo.CreateCustomTimeZone("Central Standard Time", New TimeSpan(-6, 0, 0), _
      "(GMT-06:00) Central Time (US Only)", "Central Standard Time", _
      "Central Daylight Time", adjustments)

この例で作成したタイムゾーンには、複数の調整規則があります。The time zone created in this example has multiple adjustment rules. 調整規則の有効な開始日と終了日が、別の調整規則の日付と重複しないように注意する必要があります。Care must be taken to ensure that the effective start and end dates of any adjustment rule do not overlap with the dates of another adjustment rule. 重複がある場合は、InvalidTimeZoneException がスローされます。If there is an overlap, an InvalidTimeZoneException is thrown.

浮動調整規則の場合、CreateFloatingDateRule メソッドの week パラメーターに値5が渡され、特定の月の最後の週に移行が行われることを示します。For floating adjustment rules, the value 5 is passed to the week parameter of the CreateFloatingDateRule method to indicate that the transition occurs on the last week of a particular month.

TimeZoneInfo.CreateCustomTimeZone(String, TimeSpan, String, String, String, TimeZoneInfo+AdjustmentRule[]) メソッドの呼び出しで使用する TimeZoneInfo.AdjustmentRule オブジェクトの配列を作成する場合、コードは、タイムゾーンに対して作成される調整の数に必要なサイズに配列を初期化できます。In creating the array of TimeZoneInfo.AdjustmentRule objects to use in the TimeZoneInfo.CreateCustomTimeZone(String, TimeSpan, String, String, String, TimeZoneInfo+AdjustmentRule[]) method call, the code could initialize the array to the size required by the number of adjustments to be created for the time zone. 代わりに、このコード例では、Add メソッドを呼び出して、各調整規則を TimeZoneInfo.AdjustmentRule オブジェクトのジェネリック List<T> コレクションに追加します。Instead, this code example calls the Add method to add each adjustment rule to a generic List<T> collection of TimeZoneInfo.AdjustmentRule objects. 次に、このコードは CopyTo メソッドを呼び出して、このコレクションのメンバーを配列にコピーします。The code then calls the CopyTo method to copy the members of this collection to the array.

また、この例では、CreateFixedDateRule メソッドを使用して、固定日付調整を定義します。The example also uses the CreateFixedDateRule method to define fixed-date adjustments. これは、CreateFloatingDateRule メソッドの呼び出しと似ていますが、移行パラメーターの時刻、月、および日のみが必要である点が異なります。This is similar to calling the CreateFloatingDateRule method, except that it requires only the time, month, and day of the transition parameters.

この例は、次のようなコードを使用してテストできます。The example can be tested using code such as the following:

TimeZoneInfo est = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

DateTime pastDate1 = new DateTime(1942, 2, 11);
Console.WriteLine("Is {0} daylight saving time: {1}", pastDate1, 
                  cst.IsDaylightSavingTime(pastDate1));

DateTime pastDate2 = new DateTime(1967, 10, 29, 1, 30, 00);
Console.WriteLine("Is {0} ambiguous: {1}", pastDate2, 
                  cst.IsAmbiguousTime(pastDate2));

DateTime pastDate3 = new DateTime(1974, 1, 7, 2, 59, 00);
Console.WriteLine("{0} {1} is {2} {3}", pastDate3, 
                  est.IsDaylightSavingTime(pastDate3) ? 
                      est.DaylightName : est.StandardName, 
                  TimeZoneInfo.ConvertTime(pastDate3, est, cst),  
                  cst.IsDaylightSavingTime(TimeZoneInfo.ConvertTime(pastDate3, est, cst)) ?
                      cst.DaylightName : cst.StandardName);
//
// This code produces the following output to the console:
// 
//    Is 2/11/1942 12:00:00 AM daylight saving time: True
//    Is 10/29/1967 1:30:00 AM ambiguous: True
//    1/7/1974 2:59:00 AM Eastern Standard Time is 1/7/1974 2:59:00 AM Central Daylight Time                            
Dim est As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")

Dim pastDate1 As Date = #2/11/1942#
Console.WriteLine("Is {0} daylight saving time: {1}", pastDate1, _
                  cst.IsDaylightSavingTime(pastDate1))

Dim pastDate2 As Date = #10/29/1967 1:30AM#
Console.WriteLine("Is {0} ambiguous: {1}", pastDate2, _
                  cst.IsAmbiguousTime(pastDate2))

Dim pastDate3 As Date = #1/7/1974 2:59AM#
Console.WriteLine("{0} {1} is {2} {3}", pastDate3, _
                  IIf(est.IsDaylightSavingTime(pastDate3), _
                      est.DaylightName, est.StandardName), _
                  TimeZoneInfo.ConvertTime(pastDate3, est, cst), _ 
                  IIf(cst.IsDaylightSavingTime(TimeZoneInfo.ConvertTime(pastDate3, est, cst)), _
                      cst.DaylightName, cst.StandardName)) 
'
' This code produces the following output to the console:
' 
'    Is 2/11/1942 12:00:00 AM daylight saving time: True
'    Is 10/29/1967 1:30:00 AM ambiguous: True
'    1/7/1974 2:59:00 AM Eastern Standard Time is 1/7/1974 2:59:00 AM Central Daylight Time                            

コードのコンパイルCompiling the code

この例で必要な要素は次のとおりです。This example requires:

  • 次の名前空間がインポートされます。That the following namespaces be imported:

    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    
    Imports System.Collections.Generic
    Imports System.Collections.ObjectModel
    
    

関連項目See also