Main Content

日付ベクトルの変換から予期しない出力が返される

メモ

ベスト プラクティスは、日付ベクトルの代わりに datetime 値を使用して時点を表現することです。日付ベクトルと異なり、datetime 値は人間が判読可能な形式で表示され、多くの場合はテキストに変換する必要がなくなります。日付ベクトルをテキストに変換する必要がある場合のベスト プラクティスとしては、最初に datetime 値に変換してから、関数 string または char を使用して datetime 値をテキストに変換することをお勧めします。関数 datestr を使用して日付ベクトルをテキストに直接変換することもできますが、このセクションで説明するように予期しない結果になる可能性があります。

日付ベクトルは 1 行 6 列の行ベクトルの値なので、関数 datestr は入力された日付ベクトルをシリアル日付値のベクトルと解釈し、予期しない出力が返されることがあります。また、シリアル日付値のベクトルを日付ベクトルと解釈することもあります。このあいまいさの原因は、datestr が 1 行 6 列の行ベクトルをヒューリスティックな方法で日付ベクトルまたは 6 つのシリアル日付値のベクトルと解釈することにあります。入力が m 行 6 列の数値行列である場合にも同様のあいまいさがあり、各行が日付ベクトルまたは 6 つのシリアル日付値と解釈される可能性があります。

たとえば、3000 年を含む日付ベクトルについて考えます。この年は、datestr で日付ベクトルの要素と解釈される年の範囲を超えています。そのため、入力は 1 行 6 列のシリアル日付値のベクトルとみなされます。

d = datestr([3000 11 05 10 32 56])
d =

  6×11 char array

    '18-Mar-0008'
    '11-Jan-0000'
    '05-Jan-0000'
    '10-Jan-0000'
    '01-Feb-0000'
    '25-Feb-0000'

ここで、datestr は 3000 をシリアル日付値とみなし、テキスト '18-Mar-0008' (0-Jan-0000 の 3000 日後の日付) に変換します。また、datestr は次の 5 つの要素もシリアル日付値として変換します。

このような日付ベクトルをテキストに変換する方法は 2 つあります。

  • "推奨" される方法は、日付ベクトルを datetime 値に変換する方法です。その後、関数 charcellstr、または string を使用して変換します。関数 datetime は、1 行 6 列の数値ベクトルを常に日付ベクトルとして扱います。

    dt = datetime([3000 11 05 10 32 56]);
    ds = string(dt)
    
    dt =
    
        "05-Nov-3000 10:32:56"
    
  • もう 1 つの方法は、関数 datenum を使用してシリアル日付値を変換する方法です。その後、datestr を使用して日付値を文字ベクトルに変換します。

    dn = datenum([3000 11 05 10 32 56]);
    ds = datestr(dn)
    
    ds =
    
        '05-Nov-3000 10:32:56'
    

日付をテキストに変換する際、datestr はヒューリスティックな方法で入力値を日付ベクトルまたはシリアル日付値と解釈します。m 行 6 列の行列を考えます。関数 datestr は、次の場合に行列を m 個の日付ベクトルと解釈します。

  • 最初の 5 列に整数が含まれている場合。

  • 各行の和の絶対値が 1500 ~ 2500 の範囲内にある場合。

任意の行でいずれかの条件が偽の場合、datestrm 行 6 列の行列を m 行 6 列のシリアル日付値の行列と解釈します。

通常、1700 ~ 2300 年の範囲は日付ベクトルとして解釈されます。ただし、月、日、時、分または秒が標準範囲外の場合、datestr はそれらをシリアル日付値と解釈することがあります。たとえば、datestr は次の 2020 年の日付ベクトルを正しく解釈します。

d = datestr([2020 06 21 10 51 00])
d =

    '21-Jun-2020 10:51:00'

しかし、日の値が通常の範囲 (1 ~ 31) の値でない場合は、datestr はベクトルの要素ごとに日付を返します。

d = datestr([2020 06 2110 10 51 00])
d =

  6×11 char array

    '12-Jul-0005'
    '06-Jan-0000'
    '10-Oct-0005'
    '10-Jan-0000'
    '20-Feb-0000'
    '00-Jan-0000'

前述のとおり、関数 datetime は数値入力を常に日付ベクトルとして扱います。この場合、該当する日付が計算され、2110 は 2020 年 6 月始めからの 2110 番目の日と解釈されます。

d = datetime([2020 06 2110 10 51 00])
d = 

  datetime

   11-Mar-2026 10:51:00
  • datestr が誤ってシリアル日付値と解釈するような日付ベクトルの行列がある場合、関数 datetime または datenum を使用して行列を変換します。次に、それらの値をテキストに変換します。

  • datestr が誤って日付ベクトルと解釈するようなシリアル日付値の行列がある場合、まず、行列を列ベクトルに変換します。次に、datestr を使用して列ベクトルを変換します。

参考

| | | | |

関連するトピック