Main Content

转换日期向量返回意外输出

注意

不推荐使用 datenumdatestr 函数。请改用 datetime 值来表示时间点,而不是日期序列值或日期向量。与这些数值表示不同,datetime 值以人工易读格式显示,通常无需转换为文本。

如果需要将日期向量转换为文本,最佳做法是首先将其转换为 datetime 值,然后使用 stringchar 函数将 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 值。然后使用 charcellstrstring 函数对其进行转换。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 可能错误地解释为日期序列值的日期向量矩阵,请使用 datetimedatenum 函数转换该矩阵。然后将这些值转换为文本。

  • 如果您具有一个 datestr 可能解释为日期向量的日期序列值矩阵,请首先将该矩阵转换为列向量。然后,再使用 datestr 转换列向量。

另请参阅

| | |

相关主题