このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
タイム ゾーンの指定
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 以降) — 関数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
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
配列を連結することはできません。ゾーンなしの配列には既知のタイム ゾーン オフセットがないためです。両方の配列がゾーン付き、またはゾーンなしでなければなりません。
たとえば、NYTime
と LATime
を連結します。ニューヨークのタイム ゾーンの結果が得られます。
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 日の間の時間の長さを UTC
と UTCLeapSeconds
のタイム ゾーンで計算することです。まず、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
参考
datetime
| timezones
| leapseconds