日付ベクトルの変換から予期しない出力が返される
メモ
関数 datenum と関数 datestr は推奨されません。代わりに、datetime 値を使用して、シリアル日付値や日付ベクトルではなく時点を表します。シリアル日付値や日付ベクトルの数値表現と異なり、datetime 値は人間が判読可能な形式で表示され、多くの場合はテキストに変換する必要がなくなります。
日付ベクトルをテキストに変換する必要がある場合のベスト プラクティスとしては、最初に datetime 値に変換してから、関数 string または char を使用して datetime 値をテキストに変換することをお勧めします。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値に変換する方法です。その後、関数char、cellstr、または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 の範囲内にある場合。
任意の行でいずれかの条件が偽の場合、datestr は m 行 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を使用して列ベクトルを変換します。
参考
datetime | datevec | char | string