转换日期向量返回意外输出
注意
不推荐使用 datenum 和 datestr 函数。请改用 datetime 值来表示时间点,而不是序列日期值或日期向量。与这些数值表示不同,datetime 值以人工易读格式显示,通常无需转换为文本。
如果需要将日期向量转换为文本,最佳做法是首先将其转换为 datetime 值,然后使用 string 或 char 函数将 datetime 值转换为文本。有关更新代码以使用 datetime 值的详细信息,请参阅Replace Discouraged Instances of Serial Date Numbers and Date Strings。
虽然您可以使用 datestr 函数直接将日期向量转换为文本,但您可能会得到意外的结果,如本节中所述。
由于日期向量是一个 1×6 数值行向量,因此 datestr 函数可能会将输入日期向量解释为序列日期值向量,并返回异常输出。或者,它可能将序列日期值向量解释为日期向量。之所以存在这种多义性,是因为 datestr 采用启发式规则,该规则将一个 1×6 的行向量解释为日期向量或包含六个序列日期值的向量。作为 m×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'(0000 年 1 月 0 日之后第 3000 天的日期)。另外,datestr 还转换接下来的五个元素,就好像它们也是序列日期值一样。
有两种方法可以将这样的日期向量转换为文本。
推荐方法是将日期向量转换为
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"或者,使用
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 个日期向量:
前五列包含整数。
每一行之和的绝对值位于 1500–2500 范围内。
对于任何一行,如果上述任意一个条件为 false,则 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