Main Content

日期时间算术运算

此示例演示了如何进行日期时间值的加减运算,以此计算未来和过去的日期以及以精确单位或日历单位计量的流逝的持续时间。日期时间数组可以进行加、减、乘、除运算,这些运算符的使用方法与其他 MATLAB® 数据类型相同。但是,日期时间存在一些特定行为。

为日期时间数组加上或减去一定的持续时间

创建一个日期时间标量。默认情况下,日期时间数组并未与时区关联。

t1 = datetime('now')
t1 = datetime
   25-Jan-2024 22:15:28

为其加上时数序列以求得未来的时间点。

t2 = t1 + hours(1:3)
t2 = 1x3 datetime
   25-Jan-2024 23:15:28   26-Jan-2024 00:15:28   26-Jan-2024 01:15:28

验证 t2 中每一对日期时间值的差是否为 1 小时。

dt = diff(t2)
dt = 1x2 duration
   01:00:00   01:00:00

diff 返回由小时数、分钟数和秒数构成的精确持续时间。

从日期时间值减去分钟数序列以查找过去的时间点。

t2 = t1 - minutes(20:10:40)
t2 = 1x3 datetime
   25-Jan-2024 21:55:28   25-Jan-2024 21:45:28   25-Jan-2024 21:35:28

将数值数组与 datetime 数组相加。MATLAB 将数值数组中的每个值视作 24 小时一天的精确天数。

t2 = t1 + [1:3]
t2 = 1x3 datetime
   26-Jan-2024 22:15:28   27-Jan-2024 22:15:28   28-Jan-2024 22:15:28

包含时区的日期时间值加法

如要处理不同时区的日期时间值,或是要考虑夏令时更改,请使用关联了时区的日期时间数组。创建一个 datetime 标量,表示纽约时间 2014 年 3 月 8 日。

t1 = datetime(2014,3,8,0,0,0,'TimeZone','America/New_York')
t1 = datetime
   08-Mar-2014

通过与天数序列(每一天固定 24 小时)相加查找未来时间点。

t2 = t1 + days(0:2)
t2 = 1x3 datetime
   08-Mar-2014 00:00:00   09-Mar-2014 00:00:00   10-Mar-2014 01:00:00

由于夏令时变化发生在 2014 年 3 月 9 日,因此 t2 中的第三个日期时间不是在午夜。

验证 t2 中每一对日期时间值的差是否为 24 小时。

dt = diff(t2)
dt = 1x2 duration
   24:00:00   24:00:00

通过将日期时间值与 yearshoursminutesseconds 等函数的输出结果相加,您还可以分别为其加上以年份、小时、分钟和秒等其他单位表示的固定长度持续时间。

如要考虑夏令时更改,则您应当用日历持续时间代替持续时间。将日期时间值与日历持续时间相加减时,日历持续时间会考虑夏令时变化。

将多个日历天与 t1 相加。

t3 = t1 + caldays(0:2)
t3 = 1x3 datetime
   08-Mar-2014   09-Mar-2014   10-Mar-2014

查看 t3 中每一对日期时间值之间的差并非始终为 24 小时,这是因为夏令时变化发生在 3 月 9 日。

dt = diff(t3)
dt = 1x2 duration
   24:00:00   23:00:00

将日历持续时间与日期时间数组相加

将多个日历月与 2014 年 1 月 31 日相加。

t1 = datetime(2014,1,31)
t1 = datetime
   31-Jan-2014

t2 = t1 + calmonths(1:4)
t2 = 1x4 datetime
   28-Feb-2014   31-Mar-2014   30-Apr-2014   31-May-2014

t2 中的每个日期时间都出现在每个月的最后一天。

使用 caldiff 函数计算 t2 中每一对日期时间值在日历天数上的差值。

dt = caldiff(t2,'days')
dt = 1x3 calendarDuration
   31d   30d   31d

dt 中连续的日期时间值对之间相差的天数并非始终相同,这是因为不同的月份由不同的天数组成。

将多个日历年与 2014 年 1 月 31 日相加。

t2 = t1 + calyears(0:4)
t2 = 1x5 datetime
   31-Jan-2014   31-Jan-2015   31-Jan-2016   31-Jan-2017   31-Jan-2018

使用 caldiff 函数计算 t2 中每一对日期时间值在日历天数上的差值。

dt = caldiff(t2,'days')
dt = 1x4 calendarDuration
   365d   365d   366d   365d

dt 中连续的日期时间值对之间相差天数并非始终相同,这是因为 2016 年是闰年,有 366 天。

您可以使用 calquarterscalweekscaldays 函数创建日历季度、日历周或日历天数组,然后将其与日期时间数组相加或相减。

日历持续时间相加时不适用加法交换律。当您将一个以上的 calendarDuration 数组与日期时间值相加时,MATLAB 会按其在命令中出现的顺序相加。

在 2014 年 1 月 31 日基础上先加上 3 个日历月,再加上 30 个日历天。

t2 = datetime(2014,1,31) + calmonths(3) + caldays(30)
t2 = datetime
   30-May-2014

对同一日期,先加上 30 个日历天,然后再加上 3 个日历月。所得到的结果并不相同,这是因为当您将日历持续时间与日期时间值相加时,加上的天数取决于原始日期。

t2 = datetime(2014,1,31) + caldays(30) + calmonths(3)
t2 = datetime
   02-Jun-2014

日历持续时间算术运算

创建两个日历持续时间,然后对其求和。

d1 = calyears(1) + calmonths(2) + caldays(20)
d1 = calendarDuration
   1y 2mo 20d

d2 = calmonths(11) + caldays(23)
d2 = calendarDuration
   11mo 23d

d = d1 + d2
d = calendarDuration
   2y 1mo 43d

当您求两个或更多日历持续时间之和时,大于 12 的月数将转进到年数。但是,较大的天数不会转进到月数,因为不同的月份由不同的天数组成。

用因子 2 乘以 d 以增加其大小。日历持续时间的值必须是整数,因此只能用整数值与其相乘。

2*d
ans = calendarDuration
   4y 2mo 86d

以精确单位计算流逝时间

将一个 datetime 数组与另一个相减,按精确的小时、分钟和秒数计算流逝的时间。

求出日期时间值序列与前一天起始时间之间的精确时长。

t2 = datetime('now') + caldays(1:3)
t2 = 1x3 datetime
   26-Jan-2024 22:15:30   27-Jan-2024 22:15:30   28-Jan-2024 22:15:30

t1 = datetime('yesterday')
t1 = datetime
   24-Jan-2024

dt = t2 - t1
dt = 1x3 duration
    70:15:30    94:15:30   118:15:30

whos dt
  Name      Size            Bytes  Class       Attributes

  dt        1x3                40  duration              

dt 以“时:分:秒”的格式存储持续时间。

通过更改 dtFormat 属性,以天为单位查看流逝的持续时间。

dt.Format = 'd'
dt = 1x3 duration
   2.9274 days   3.9274 days   4.9274 days

用因子 1.2 乘以 dt 以扩大持续时间的值。由于持续时间具有精确长度,您可以将其与小数值相乘和相除。

dt2 = 1.2*dt
dt2 = 1x3 duration
   3.5129 days   4.7129 days   5.9129 days

以日历单位计算流逝时间

使用 between 函数求两个日期之间流逝的日历年、月和天数。

t1 = datetime('today')
t1 = datetime
   25-Jan-2024

t2 = t1 + calmonths(0:2) + caldays(4)
t2 = 1x3 datetime
   29-Jan-2024   29-Feb-2024   29-Mar-2024

dt = between(t1,t2)
dt = 1x3 calendarDuration
       4d   1mo 4d   2mo 4d

另请参阅

| |