本文演示了如何进行日期和时间值的加减运算,以此计算未来和过去的日期以及以精确单位或日历单位计量的流逝的持续时间。日期和时间数组可以进行加、减、乘、除运算,这些运算符的使用方法与其他 MATLAB 数据类型相同。但是,日期和时间存在一些特定行为。
为日期时间数组加上或减去一定的持续时间
创建一个日期时间标量。默认情况下,日期时间数组并未与时区关联。
t1 = datetime('now')
t1 = datetime
03-Aug-2020 20:35:07
为其加上时数序列以求得未来的时间点。
t2 = t1 + hours(1:3)
t2 = 1x3 datetime
03-Aug-2020 21:35:07 03-Aug-2020 22:35:07 03-Aug-2020 23:35:07
验证 t2 中每一对日期时间值的差是否为 1 小时。
dt = diff(t2)
dt = 1x2 duration
01:00:00 01:00:00
diff 返回由小时数、分钟数和秒数构成的精确持续时间。
从日期时间值减去分钟数序列以查找过去的时间点。
t2 = t1 - minutes(20:10:40)
t2 = 1x3 datetime
03-Aug-2020 20:15:07 03-Aug-2020 20:05:07 03-Aug-2020 19:55:07
将数值数组与 datetime 数组相加。MATLAB 将数值数组中的每个值视作 24 小时一天的精确天数。
t2 = t1 + [1:3]
t2 = 1x3 datetime
04-Aug-2020 20:35:07 05-Aug-2020 20:35:07 06-Aug-2020 20:35:07
包含时区的日期时间值加法
如要处理不同时区的日期时间值,或是要考虑夏令时更改,请使用关联了时区的日期时间数组。创建一个 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
通过将日期时间值与 years、hours、minutes 和 seconds 等函数的输出结果相加,您还可以分别为其加上以年份、小时、分钟和秒等其他单位表示的固定长度持续时间。
如要考虑夏令时更改,则您应当用日历持续时间代替持续时间。将日期时间值与日历持续时间相加减时,日历持续时间会考虑夏令时变化。
将多个日历天与 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 天。
您可以使用 calquarters、calweeks 和 caldays 函数创建日历季度、日历周或日历天数组,然后将其与日期时间数组相加或相减。
日历持续时间相加时不适用加法交换律。当您将一个以上的 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
04-Aug-2020 20:35:09 05-Aug-2020 20:35:09 06-Aug-2020 20:35:09
t1 = datetime('yesterday')
t1 = datetime
02-Aug-2020
dt = t2 - t1
dt = 1x3 duration
68:35:09 92:35:09 116:35:09
whos dt
Name Size Bytes Class Attributes
dt 1x3 40 duration
dt 以“时:分:秒”的格式存储持续时间。
通过更改 dt 的 Format 属性,以天为单位查看流逝的持续时间。
dt.Format = 'd'
dt = 1x3 duration
2.8578 days 3.8578 days 4.8578 days
用因子 1.2 乘以 dt 以扩大持续时间的值。由于持续时间具有精确长度,您可以将其与小数值相乘和相除。
dt2 = 1.2*dt
dt2 = 1x3 duration
3.4293 days 4.6293 days 5.8293 days
以日历单位计算流逝时间
使用 between 函数求两个日期之间流逝的日历年、月和天数。
t1 = datetime('today')
t1 = datetime
03-Aug-2020
t2 = t1 + calmonths(0:2) + caldays(4)
t2 = 1x3 datetime
07-Aug-2020 07-Sep-2020 07-Oct-2020
dt = between(t1,t2)
dt = 1x3 calendarDuration
4d 1mo 4d 2mo 4d