Main Content

日付と時刻の比較

この例では、関係演算子と比較関数を使用して日付、時刻、および期間を比較する方法を示します。datetime および duration データ型は日付と時刻を数量として表すので、数値配列の比較に使用するのと同じ関係演算子を使用できます。ただし、データ型によって比較の意味は若干異なります。

  • datetime 値は、別の datetime 値の前、同時、または後に発生する場合があります。

  • duration 値は、別の duration 値と比較して時間の長さが短い場合もあれば、同じ場合もあれば、長い場合もあります。

calendarDuration データ型は関係演算子を使用した比較をサポートしていません。カレンダー単位は必ずしも固定された時間の長さを表すわけではありません。

2 つの datetime 配列を比較できます。また、2 つの duration 配列を比較できます。関係演算子は要素単位の比較を実行するため、配列のサイズに互換性がなければなりません。最も簡単なケースでは、2 つの配列が同じサイズであるか、一方がスカラーです。詳細については、基本的な演算で互換性のある配列サイズを参照してください。

日付と時刻はテキストで表すこともできます。一方、期間はテキストおよび数値で表すこともできます。したがって、datetime 配列をテキストと比較したり、duration 配列をテキストおよび数値と比較したりできます。関係演算子は、演算を実行する前にテキストおよび数値を正しいデータ型に変換します。

datetime 配列と duration 配列を比較することはできません。ただし、datetime 配列の成分を数値または duration 配列と比較することはできます。

datetime 値の比較

datetime 配列を作成します。日付と時刻を表すテキストを変換するには、関数 datetime を使用します。

d1 = datetime("2022-06-05 11:37:05")
d1 = datetime
   05-Jun-2022 11:37:05

datetime の成分 (年数、月数、日数、時間数、分数、および秒数) を表す入力数値配列を変換して、別の datetime 配列を作成します。

d2 = datetime(2022,2:4:10,15,12,0,0)
d2 = 1x3 datetime
   15-Feb-2022 12:00:00   15-Jun-2022 12:00:00   15-Oct-2022 12:00:00

2 つの datetime 配列を比較します。結果は、d2 のどの要素が d1 の後なのかを示します。

tf = d2 > d1
tf = 1x3 logical array

   0   1   1

一致する要素のみが含まれた datetime 配列を作成するには、tf を使用して d2 へのインデックス付けを行います。

afterd1 = d2(tf)
afterd1 = 1x2 datetime
   15-Jun-2022 12:00:00   15-Oct-2022 12:00:00

テキストと datetime

関数 datetime によって認識される形式で日付と時刻を表すテキストがある場合は、そのテキストを datetime 配列と比較できます。比較により、テキストが暗黙的に変換されます。

たとえば、d2 を、2022 年 6 月 1 日を表す string と比較します。(string が日付のみを示している場合、datetime への暗黙的な変換により、時刻が午前 0 時に設定されます。)d2 の最初の要素は 6 月 1 日より前です。

tf = d2 >= "2022-06-01"
tf = 1x3 logical array

   0   1   1

afterJune1 = d2(tf)
afterJune1 = 1x2 datetime
   15-Jun-2022 12:00:00   15-Oct-2022 12:00:00

数値と datetime 配列の成分

datetime データ型では、datetime 値の成分にアクセスできます。各成分にアクセスするには、関数 yearquartermonthdayhourminute、および second を使用します。これらの関数では数値が返されるため、各成分を数値または duration 値と比較できます。

たとえば、datetime 配列 d2 を表示します。次に、その月成分を表示します。

d2
d2 = 1x3 datetime
   15-Feb-2022 12:00:00   15-Jun-2022 12:00:00   15-Oct-2022 12:00:00

m = month(d2)
m = 1×3

     2     6    10

月成分にアクセスするもう 1 つの方法として、d2Month プロパティを使用できます。datetime の成分には、YearMonthDayHourMinute、および Second の各プロパティによってアクセスできます。

m = d2.Month
m = 1×3

     2     6    10

6 月より前の d2 の要素を検出するために、d2 を 6 月に対応する数値と比較します。次に d2 にインデックスを付けます。

tf = month(d2) < 6
tf = 1x3 logical array

   1   0   0

beforeJune = d2(tf)
beforeJune = datetime
   15-Feb-2022 12:00:00

duration 配列の比較

duration 配列を作成します。hh:mm:ss 形式のテキストを変換する場合は、関数 duration を使用します。

t1 = duration("03:37:12")
t1 = duration
   03:37:12

時間数、分数、および秒数を表す入力数値配列を変換して、別の duration 配列を作成します。

t2 = duration(0:2:6,30,0)
t2 = 1x4 duration
   00:30:00   02:30:00   04:30:00   06:30:00

2 つの duration 配列を比較します。結果では、t2 のどの要素が t1 より長いのかが示されます。

tf = t2 > t1
tf = 1x4 logical array

   0   0   1   1

一致する要素のみが含まれた新しい duration 配列を作成するには、tf を使用して t2 へのインデックス付けを行います。

longerThanT1 = t2(tf)
longerThanT1 = 1x2 duration
   04:30:00   06:30:00

テキストと duration

関数 duration によって認識される形式で時間の長さを表すテキストがある場合は、そのテキストを duration 配列と比較できます。比較により、テキストが暗黙的に変換されます。

たとえば、t2 を、2 時間 5 分を表す string と比較します。t2 の最初の要素の方が短くなっています。

tf = t2 >= "02:05:00"
tf = 1x4 logical array

   0   1   1   1

longerThan205 = t2(tf)
longerThan205 = 1x3 duration
   02:30:00   04:30:00   06:30:00

数値と duration 配列

数値配列を duration 配列と比較できます。比較では、数値は固定長 (24 時間) の日数として扱われます。

t2 の要素を 1 日と比較します。すべての要素が短くなっています。

tf = t2 < 1
tf = 1x4 logical array

   1   1   1   1

t2(tf)
ans = 1x4 duration
   00:30:00   02:30:00   04:30:00   06:30:00

t2 の要素を 1 時間と比較します。t2 の最初の要素のみが短くなっています。

tf = t2 < 1/24
tf = 1x4 logical array

   1   0   0   0

t2(tf)
ans = duration
   00:30:00

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

ロサンゼルスの 2022 年 10 月 1 日午後 4 時とニューヨークの 2022 年 10 月 1 日午後 5 時を表す datetime 値を作成します。2 つの都市のタイム ゾーンは異なっています。

名前と値の引数 TimeZone を指定して、タイム ゾーンをもつ datetime 配列を作成できます。これらの値を表示する際にタイム ゾーンを表示するには、名前と値の引数 Format を指定します。なお、入力テキストの形式とは異なる datetime 表示形式を指定できます。

LAtime = datetime("2022-10-01 16:00:00", ...
                  "TimeZone","America/Los_Angeles",...
                  "Format","dd-MMM-yyyy hh:mm:ss a z")
LAtime = datetime
   01-Oct-2022 04:00:00 PM PDT

NYtime = datetime("2022-10-01 17:00:00", ...
                  "TimeZone","America/New_York",...
                  "Format","dd-MMM-yyyy hh:mm:ss a z")
NYtime = datetime
   01-Oct-2022 05:00:00 PM EDT

2 つの都市の時刻を比較します。同じ日において、ロサンゼルスの午後 4 時はニューヨークの午後 5 時より後に起こります。タイム ゾーンを指定した場合、datetime 配列の比較では、各配列のタイム ゾーン情報が考慮されます。

tf = NYtime < LAtime
tf = logical
   1

== 演算子を使用して、同じクロック時間をもつ 2 つの datetime 値を比較します。タイム ゾーンが異なるため、2 つの値は等しくありません。

NYtime4 = datetime("2022-10-01 16:00:00", ...
                  "TimeZone","America/New_York",...
                  "Format","dd-MMM-yyyy hh:mm:ss a z")
NYtime4 = datetime
   01-Oct-2022 04:00:00 PM EDT

tf = NYtime4 == LAtime
tf = logical
   0

タイムゾーンのある datetime 配列とタイムゾーンのない datetime 配列を比較することはできません。1 つの datetime 配列のみにタイム ゾーンがある場合、比較に十分な情報がありません。

他の関数を使用した日付と時刻の比較

MATLAB には日付と時刻の比較用のその他の関数が用意されています。

  • isbetweendatetime または duration 配列の要素が間隔内にあるかどうかを判別します。

  • isdstdatetime 配列の要素が夏時間期間中かどうかを判別します。

  • isweekenddatetime 配列の要素が週末 (土曜日と日曜日) かどうかを判別します。

  • ismissing — 配列の要素に欠損値 (datetime 配列の場合は NaTduration 配列の場合は NaN) があるかどうかを判別します。

datetime 配列または duration 配列に対して集合演算を実行することもできます。

  • union — 2 つの datetime 配列または 2 つの duration 配列の和集合

  • intersect — 2 つの datetime 配列または 2 つの duration 配列の積集合

  • ismember — 2 番目の datetime 配列または duration 配列の要素である 1 番目の datetime 配列または duration 配列の要素

  • setdiff — 2 つの datetime 配列または 2 つの duration 配列の差

  • setxor — 2 つの datetime 配列または 2 つの duration 配列の排他的 OR

たとえば、datetime 配列の要素が 2022 年の第 1 四半期内かどうかを判別します。(第 1 四半期の終わりは、第 2 四半期の最初の瞬間と同じです。)

start1Q = datetime("2022-01-01");
end1Q = datetime("2022-04-01");
d = datetime(2022,2:4:10,15,12,0,0)
d = 1x3 datetime
   15-Feb-2022 12:00:00   15-Jun-2022 12:00:00   15-Oct-2022 12:00:00

d のどの要素が最初の四半期の開始と終了の間にあるかを判別するには、isbetween を使用します。start1Q から end1Q までの時間間隔を右開区間として指定します。

tf = isbetween(d,start1Q,end1Q,"openright")
tf = 1x3 logical array

   1   0   0

isbetween を使用して右開区間を指定するのは、次の式と等価です。この間隔には、2022 年 1 月 1 日が開始した瞬間から、2022 年 4 月 1 日の開始までのすべての瞬間が含まれますが、2022 年 4 月 1 日が開始した瞬間は含まれません。次の期間の開始を使用して期間の終了を指定する場合、その期間は右開区間とみなします。

tf = (start1Q <= d & d < end1Q)
tf = 1x3 logical array

   1   0   0

第 1 四半期内の d の要素を表示します。

d(tf)
ans = datetime
   15-Feb-2022 12:00:00

TimeZone プロパティを設定して、d のタイム ゾーンを指定します。次に、要素が夏時間期間内かどうかを判別します。

d.TimeZone = "America/New_York";
isdst(d)
ans = 1x3 logical array

   0   1   1

要素が週末かどうかを判別します。

isweekend(d)
ans = 1x3 logical array

   0   0   1

一致する要素の曜日を表示するには、関数 day を使用します。

weekendDays = d(isweekend(d))
weekendDays = datetime
   15-Oct-2022 12:00:00

day(weekendDays,"name")
ans = 1x1 cell array
    {'Saturday'}

参考

| | | | | | |

関連するトピック