メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

タイム ゾーンの指定

MATLAB® では、datetime 配列に対してタイム ゾーンを指定できます。この例では、タイム ゾーンを含む datetime 配列の作成方法と使用方法を示します。

タイム ゾーンとは、共通の標準時を使用している地理的区域のことです。タイム ゾーンには、協定世界時 (UTC) からの時間オフセット、夏時間 (DST) からの時間オフセット、およびそれらのオフセットの一連の変更履歴が含まれます。datetime データ型は、タイム ゾーンの設定とタイム ゾーン オフセットの計算に、Internet Assigned Numbers Authority (IANA) が IANA タイム ゾーン データベースで提供しているコードとデータを使用します。

タイム ゾーンの table の表示と検索

MATLAB で認識されるタイム ゾーンの完全な table を調べるには、関数 timezones を使用します。table の各行に、タイム ゾーンの名前、地理的区域、UTC からのオフセット、および DST によるオフセットが表示されます。DST を使用しているタイム ゾーンについては、それらのタイム ゾーンの現在および過去の規則に従って DST オフセットが適用されます。

AllTimeZones = timezones
AllTimeZones=445×4 table
             Name              Area     UTCOffset    DSTOffset
    ______________________    ______    _________    _________

    {'Africa/Abidjan'    }    Africa        0            0    
    {'Africa/Accra'      }    Africa        0            0    
    {'Africa/Addis_Ababa'}    Africa        3            0    
    {'Africa/Algiers'    }    Africa        1            0    
    {'Africa/Asmera'     }    Africa        3            0    
    {'Africa/Bamako'     }    Africa        0            0    
    {'Africa/Bangui'     }    Africa        1            0    
    {'Africa/Banjul'     }    Africa        0            0    
    {'Africa/Bissau'     }    Africa        0            0    
    {'Africa/Blantyre'   }    Africa        2            0    
    {'Africa/Brazzaville'}    Africa        1            0    
    {'Africa/Bujumbura'  }    Africa        2            0    
    {'Africa/Cairo'      }    Africa        2            1    
    {'Africa/Casablanca' }    Africa        0            1    
    {'Africa/Ceuta'      }    Africa        1            1    
    {'Africa/Conakry'    }    Africa        0            0    
      ⋮

MATLAB で使用されている IANA タイム ゾーン データベースのバージョンを調べるには、timezones から 2 番目の出力を返します。

[~,DBversion] = timezones
DBversion = 
'2024b'

タイム ゾーンの名前を調べるために、タイム ゾーンの table の Name 変数を検索できます。名前の一部がわかっている場合に完全な名前を調べるには、関数 contains を使用できます。たとえば、「New York」に対応するタイム ゾーンの名前を調べます。検索文字列に含まれる空白文字はアンダースコアに置き換えます。

TFindex = contains(AllTimeZones.Name,"New_York");
NewYorkZone = AllTimeZones.Name(TFindex)
NewYorkZone = 1×1 cell array
    {'America/New_York'}

タイム ゾーンの table の対応する行を表示します。タイム ゾーンの正確な名前と一致させるには、関数 matches を使用します。

TFindex = matches(AllTimeZones.Name,NewYorkZone);
AllTimeZones(TFindex,:)
ans=1×4 table
            Name             Area      UTCOffset    DSTOffset
    ____________________    _______    _________    _________

    {'America/New_York'}    America       -5            1    

タイム ゾーンをもつ datetime 値の作成

すべての datetime 配列にタイム ゾーン プロパティがあります。既定では、このプロパティが設定されていないため、結果として得られる datetime 配列にゾーンはありません。ゾーンなしの datetime 配列は、現地時間の計算で他のタイム ゾーンの DST や現地時間を考慮する必要がない場合に使用できます。

たとえば、現在の時刻の datetime 値を作成し、その TimeZone プロパティを表示します。現在の日付と時刻の値がシステム クロックから取得されます。タイム ゾーンがない datetime 値では、UTC に対するタイム ゾーン オフセットは計算できません。

D = datetime("now")
D = datetime
   09-Jan-2025 01:49:02

D.TimeZone
ans =

  0×0 empty char array

datetime 配列のタイム ゾーンを設定する方法は 2 つあります。1 つ目は、datetime 配列の作成時に関数 datetime の名前と値の引数 TimeZone を指定する方法です。この引数を指定すると、TimeZone プロパティの値が設定されます。

D = datetime("now",TimeZone="America/New_York")
D = datetime
   09-Jan-2025 01:49:02

D.TimeZone
ans = 
'America/New_York'

2 つ目は、datetime 配列の作成後に TimeZone プロパティに値を代入する方法です。

D = datetime("now")
D = datetime
   09-Jan-2025 01:49:02

D.TimeZone = "America/New_York"
D = datetime
   09-Jan-2025 01:49:02

TimeZone プロパティについては、UTC からの固定のタイム ゾーン オフセットを duration として指定することもできます。このようなオフセットには、現在または過去のオフセット規則 (夏時間など) は一切組み込まれません。

たとえば、UTC より 5 時間遅れのタイム ゾーン オフセットを指定します。このオフセットは America/New_York の UTC オフセットと同じですが、夏時間のオフセットは一切含まないものになります。

D = datetime("now",TimeZone="-05:00")
D = datetime
   09-Jan-2025 01:49:02

D.TimeZone
ans = 
'-05:00'

TimeZone は次の一覧のいずれかの値として指定できます。

  • "" — タイム ゾーンなし

  • タイム ゾーンの名前 — IANA タイム ゾーン データベースのタイム ゾーン

  • +HH:mm または -HH:mm の形式のタイム ゾーン オフセット — UTC からの固定のオフセット

  • duration スカラーの形式のタイム ゾーン オフセット (R2024a 以降) — 関数 hoursminutesseconds、または duration を使用して指定した UTC からの固定のオフセット

  • "UTC" — 協定世界時

  • "UTCLeapSeconds" — うるう秒も組み込んだ協定世界時

  • "local" — システムのタイム ゾーンに対応する IANA タイム ゾーン

タイム ゾーン オフセットを含む形式の指定

datetime 配列の既定の形式にはタイム ゾーンは含まれません。ただし、識別子 z または Z を使用して、形式にタイム ゾーン オフセットを含めることができます。

たとえば、z を使用して、日付、時刻、およびタイム ゾーン オフセットを含むように形式を変更します。識別子 z は、オフセットの短いローカライズ バージョンを指定します。その動作はロケールに依存します。

D = datetime("now", ...
             TimeZone="America/New_York", ...
             Format="dd-MMM-uuuu HH:mm:ss z")
D = datetime
   09-Jan-2025 01:49:02 EST

識別子 Z は、オフセットを時、分、秒 (オプション) として表示する基本形式を指定します。

D.Format = "dd-MMM-uuuu HH:mm:ss Z"
D = datetime
   09-Jan-2025 01:49:02 -0500

長い UTC 形式も指定できます。タイム ゾーン オフセットの識別子の完全な一覧については、datetime を参照してください。

D.Format = "dd-MMM-uuuu HH:mm:ss ZZZZ"
D = datetime
   09-Jan-2025 01:49:02 UTC-05:00

異なるタイム ゾーンでの同じ時刻のエンコード

datetime 値のタイム ゾーンを変更しても、エンコードされる時点は同じです。UTC からのオフセットが変わる場合は、オフセットの変化を補正する形で日付と時刻の値が変更されます。

たとえば、ニューヨークのタイム ゾーンで datetime 値を作成し、タイム ゾーン オフセットを表示するように書式設定します。

D = datetime("today", ...
             TimeZone="America/New_York", ...
             Format="dd-MMM-uuuu HH:mm:ss z")
D = datetime
   09-Jan-2025 00:00:00 EST

次に、そのタイム ゾーンをロサンゼルスのゾーンに変更します。日付と時刻の値が、別のタイム ゾーンで同じ時点をエンコードした値に変わります。

D.TimeZone = "America/Los_Angeles"
D = datetime
   08-Jan-2025 21:00:00 PST

タイム ゾーンが異なる datetime 値の比較

タイム ゾーンが異なる datetime 値を比較する場合、比較でタイム ゾーン オフセットが考慮されます。ただし、ゾーン付きとゾーンなしの datetime 配列を比較することはできません。ゾーンなしの配列には既知のタイム ゾーン オフセットがないためです。両方の配列がゾーン付き、またはゾーンなしでなければなりません。

たとえば、datetime 値を作成します。次に、それをコピーしてタイム ゾーンを変更します。

NYTime = datetime("today", ...
                  TimeZone="America/New_York", ...
                  Format="dd-MMM-uuuu HH:mm:ss z")
NYTime = datetime
   09-Jan-2025 00:00:00 EST

LATime = NYTime;
LATime.TimeZone = "America/Los_Angeles"
LATime = datetime
   08-Jan-2025 21:00:00 PST

== 演算子を使用して 2 つの値を比較します。値は同じ時点をエンコードしたものなので等しくなります。

AreTimesEqual = NYTime == LATime
AreTimesEqual = logical
   1

2 つの時間に実際の差はありません。

TimeDiff = LATime - NYTime
TimeDiff = duration
   00:00:00

次に、ロサンゼルスの時間を 2 時間増やします。

LATime = LATime + hours(2)
LATime = datetime
   08-Jan-2025 23:00:00 PST

2 つの時間を比較します。日付と時刻の値に関係なく、ロサンゼルスの時間がニューヨークの時間よりも後になります。

IsLATimeLater = LATime > NYTime
IsLATimeLater = logical
   1

時間の差は 2 時間です。

TimeDiff = LATime - NYTime
TimeDiff = duration
   02:00:00

タイム ゾーンが異なる datetime 配列の連結

TimeZone プロパティは datetime 配列のすべての要素に適用されます。ただし、タイム ゾーンが異なる datetime 配列を連結することができます。連結後の配列のタイム ゾーンは 1 つ目の配列と同じになります。ゾーン付きとゾーンなしの datetime 配列を連結することはできません。ゾーンなしの配列には既知のタイム ゾーン オフセットがないためです。両方の配列がゾーン付き、またはゾーンなしでなければなりません。

たとえば、NYTimeLATime を連結します。ニューヨークのタイム ゾーンの結果が得られます。

combinedNYZone = [NYTime LATime]
combinedNYZone = 1×2 datetime
   09-Jan-2025 00:00:00 EST   09-Jan-2025 02:00:00 EST

次に、順序を逆にして連結します。ロサンゼルスのタイム ゾーンの結果が得られます。

combinedLAZone = [LATime NYTime]
combinedLAZone = 1×2 datetime
   08-Jan-2025 23:00:00 PST   08-Jan-2025 21:00:00 PST

特別なタイム ゾーンの使用によるうるう秒の考慮

うるう秒とは、UTC に適用される 1 秒の調整のことです。うるう秒は、地球の自転速度のわずかなずれによって、原子時計に基づく正確な時刻と実際の太陽時の間に生じる差を考慮するために 1972 年に導入されました。このずれは予測可能なパターンで起こるものではないため、うるう秒は必要に応じて宣言されてきました。MATLAB に組み込まれているうるう秒データは、国際地球回転・基準系事業 (IERS) が提供しているものです。詳細については、IERS Bulletins を参照してください。

datetime データ型には、うるう秒を考慮した特別なタイム ゾーンがあります。うるう秒を伴う計算や比較においては、いずれもタイム ゾーンを "UTCLeapSeconds" として指定します。このタイム ゾーンを使用するときの既定の形式には、日付、時刻、および UTC を示す文字 Z が含まれます。これは ISO 8601 標準に従ったものです。

todayLS = datetime("today",TimeZone="UTCLeapSeconds")
todayLS = datetime
   2025-01-09T00:00:00.000Z

一方の配列にうるう秒があり、もう一方の配列にはない場合、それらの datetime 配列を結合したり比較したりすることはできません。

うるう秒の影響を調べる 1 つの方法は、今日の日付と 1972 年 1 月 1 日の間の時間の長さを UTCUTCLeapSeconds のタイム ゾーンで計算することです。まず、UTC ゾーンで duration を計算します。hh:mm:ss の形式で duration が表示されます。

durationWithoutLS = datetime("today",TimeZone="UTC") - datetime(1972,1,1,TimeZone="UTC")
durationWithoutLS = duration
   464808:00:00

次に、UTCLeapSeconds ゾーンで duration を計算します。この 2 つの duration の差が、1972 年以降に宣言されたうるう秒の累積的な影響ということになります。

durationWithLS = datetime("today",TimeZone="UTCLeapSeconds") - datetime(1972,1,1,TimeZone="UTCLeapSeconds")
durationWithLS = duration
   464808:00:27

MATLAB で認識されるすべてのうるう秒とその宣言日を調べるには、関数 leapseconds を使用します。

LS = leapseconds
LS=27×2 timetable
       Date        Type    CumulativeAdjustment
    ___________    ____    ____________________

    30-Jun-1972     +              1 sec       
    31-Dec-1972     +              2 sec       
    31-Dec-1973     +              3 sec       
    31-Dec-1974     +              4 sec       
    31-Dec-1975     +              5 sec       
    31-Dec-1976     +              6 sec       
    31-Dec-1977     +              7 sec       
    31-Dec-1978     +              8 sec       
    31-Dec-1979     +              9 sec       
    30-Jun-1981     +             10 sec       
    30-Jun-1982     +             11 sec       
    30-Jun-1983     +             12 sec       
    30-Jun-1985     +             13 sec       
    31-Dec-1987     +             14 sec       
    31-Dec-1989     +             15 sec       
    31-Dec-1990     +             16 sec       
      ⋮

2 番目の出力は、MATLAB で使用されているうるう秒データの IERS Bulletin C バージョン番号を返します。

[~,LSvers] = leapseconds
LSvers = 
68

参考

| |

トピック