转换日期向量返回意外输出
注意
不推荐使用 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