メインコンテンツ

タイム ゾーンおよび時間標準の指定

R2026b

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

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

時間標準は、原子時計、天体観測、および国際協定に基づいて、時点を測定する方法を定義します。指定する時間標準およびタイム ゾーンは、datetime 配列内で一貫していなければなりません。

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

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

AllTimeZones = timezones
AllTimeZones = 446×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 = 
'2026b'

タイム ゾーンの名前を調べるために、タイム ゾーンの 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
   07-Aug-2026 00:31:16

D.TimeZone
ans =

  0×0 empty char array

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

D = datetime("now",TimeZone="America/New_York")
D = datetime
   07-Aug-2026 00:31:16

D.TimeZone
ans = 
'America/New_York'

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

D = datetime("now")
D = datetime
   07-Aug-2026 00:31:16

D.TimeZone = "America/New_York"
D = datetime
   07-Aug-2026 00:31:16

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

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

D = datetime("now",TimeZone="-05:00")
D = datetime
   06-Aug-2026 23:31:16

D.TimeZone
ans = 
'-05:00'

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

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

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

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

  • duration スカラーの形式のタイム ゾーン オフセット (R2024a 以降) — 関数 hours、minutes、seconds、または 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
   07-Aug-2026 00:31:16 EDT

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

D.Format = "dd-MMM-uuuu HH:mm:ss Z"
D = datetime
   07-Aug-2026 00:31:16 -0400

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

D.Format = "dd-MMM-uuuu HH:mm:ss ZZZZ"
D = datetime
   07-Aug-2026 00:31:16 UTC-04:00

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

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

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

D = datetime("today", ...
             TimeZone="America/New_York", ...
             Format="dd-MMM-uuuu HH:mm:ss z")
D = datetime
   07-Aug-2026 00:00:00 EDT

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

D.TimeZone = "America/Los_Angeles"
D = datetime
   06-Aug-2026 21:00:00 PDT

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

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

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

NYTime = datetime("today", ...
                  TimeZone="America/New_York", ...
                  Format="dd-MMM-uuuu HH:mm:ss z")
NYTime = datetime
   07-Aug-2026 00:00:00 EDT

LATime = NYTime;
LATime.TimeZone = "America/Los_Angeles"
LATime = datetime
   06-Aug-2026 21:00:00 PDT

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

AreTimesEqual = NYTime == LATime
AreTimesEqual = logical
   1

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

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

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

LATime = LATime + hours(2)
LATime = datetime
   06-Aug-2026 23:00:00 PDT

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

IsLATimeLater = LATime > NYTime
IsLATimeLater = logical
   1

時間の差は 2 時間です。

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

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

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

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

combinedNYZone = [NYTime LATime]
combinedNYZone = 1×2 datetime
   07-Aug-2026 00:00:00 EDT   07-Aug-2026 02:00:00 EDT

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

combinedLAZone = [LATime NYTime]
combinedLAZone = 1×2 datetime
   06-Aug-2026 23:00:00 PDT   06-Aug-2026 21:00:00 PDT

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

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

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

todayLS = datetime("today",TimeZone="UTCLeapSeconds")
todayLS = datetime
   2026-08-07T00:00:00.000Z

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

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

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

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

durationWithLS = datetime("today",TimeZone="UTCLeapSeconds") - datetime(1972,1,1,TimeZone="UTCLeapSeconds")
durationWithLS = duration
   478608: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 = 
71

時間標準およびタイム ゾーンをもつ datetime 値の指定

すべての datetime 配列に時間標準プロパティがあります。既定では、このプロパティは "none" に設定されています。これは、結果として得られる datetime 配列に関連付けられた時間標準がなく、その時間標準の解釈はユーザーに委ねられることを意味します。

TimeStandard の各値に対して、特定の TimeZone の値のみが有効です。次の表に、TimeStandard の値ごとに使用可能な TimeZone の値を示します。2 つのプロパティのうち一方のみが指定されている場合、MATLAB はもう一方のプロパティを互換性のある既定値に設定します。

TimeStandard の値

使用可能な TimeZone の値

"none"

""

"simplifiedUTC"

"UTC" (既定)、任意の有効な IANA タイム ゾーン (たとえば、"America/New_York" や "+01:00")、"UTCLeapSeconds"

"UTC","TAI","TT"

"none"

TimeZone に新しい値を代入したとき、TimeStandard プロパティの現在の値が無効になる場合、そのプロパティは使用可能な値に更新されます。同様に、TimeStandard に新しい値を代入すると、TimeZone プロパティも更新されます。代入によってあいまいな組み合わせやサポートされていない組み合わせが生じる場合、MATLAB はエラーを返します。

たとえば、"America/New_York" タイム ゾーンの datetime スカラーを作成します。この datetime スカラーは、既定で "simplifiedUTC" 時間標準を使用します。

t = datetime(2025,7,4,12,0,0,TimeZone="America/New_York",Format="dd-MMM-uuuu HH:mm:ss Z B")
t = datetime
   04-Jul-2025 12:00:00 -0400 simplifiedUTC

TimeStandard プロパティに TAI 時間標準を代入することで、datetime スカラーを TAI 時間標準に変換します。

t.TimeStandard = "TAI"
t = datetime
   04-Jul-2025 16:00:37 * TAI

t.TimeZone
ans = 
'none'

TimeZone プロパティが "none" に更新され、datetime 値が対応する TAI 時間標準に変換されます。

参考

| |

トピック