比较日期时间
此示例说明如何使用关系运算符和比较函数来比较日期、时间和持续时间。由于 datetime
和 duration
数据类型以定量方式表示日期和时间,因此您可以使用用于比较数值数组的相同关系运算符。但是,这些比较的含义略有不同,具体视数据类型而定。
datetime
值可以在另一个datetime
值之前、同时或之后。duration
值可以短于、等于或长于另一个duration
值。
calendarDuration
数据类型不支持使用关系运算符进行比较。日历单位不一定表示固定的时间长度。
您可以比较两个 datetime
数组,也可以比较两个 duration
数组。这些数组必须具有兼容的大小,因为关系运算符执行按元素比较。在最简单的情况下,两个数组大小相同,或其中一个是标量数组。有关详细信息,请参阅基本运算的兼容数组大小。
日期时间也可以用文本表示,而持续时间也可以用文本和数字表示。因此,您可以将 datetime
数组与文本进行比较,将 duration
数组与文本和数字进行比较。关系运算符在执行运算之前会将文本和数字转换为正确的数据类型。
datetime
数组和 duration
数组无法进行比较。但是,您可以将 datetime
数组的分量与数字或 duration
数组进行比较。
比较 datetime
值
创建一个 datetime
数组。要转换表示日期时间的文本,请使用 datetime
函数。
d1 = datetime("2022-06-05 11:37:05")
d1 = datetime
05-Jun-2022 11:37:05
通过转换表示 datetime
分量(年、月、日、小时、分钟和秒)的输入数值数组,创建另一个 datetime
数组。
d2 = datetime(2022,2:4:10,15,12,0,0)
d2 = 1x3 datetime
15-Feb-2022 12:00:00 15-Jun-2022 12:00:00 15-Oct-2022 12:00:00
比较这两个 datetime
数组。结果会显示 d2
中的哪些元素在 d1
之后出现。
tf = d2 > d1
tf = 1x3 logical array
0 1 1
要创建仅包含匹配元素的 datetime
数组,请使用 tf
对 d2
进行索引。
afterd1 = d2(tf)
afterd1 = 1x2 datetime
15-Jun-2022 12:00:00 15-Oct-2022 12:00:00
文本与 datetime
值
如果您有表示日期时间的文本,并且其格式可以被 datetime
函数识别,则您可以将该文本与 datetime
数组进行比较。比较会隐式转换该文本。
例如,将 d2
与表示 2022 年 6 月 1 日的字符串进行比较。(如果字符串只指定了一个日期,则对 datetime
的隐式转换会将时间设置为午夜。)d2
的第一个元素出现在 6 月 1 日之前。
tf = d2 >= "2022-06-01"
tf = 1x3 logical array
0 1 1
afterJune1 = d2(tf)
afterJune1 = 1x2 datetime
15-Jun-2022 12:00:00 15-Oct-2022 12:00:00
数值与 datetime
数组的分量
datetime
数据类型支持访问 datetime
值的分量。使用 year
、quarter
、month
、day
、hour
、minute
和 second
函数访问分量。您可以将分量与数字或 duration
值进行比较,因为这些函数返回数字。
例如,先显示 datetime
数组 d2
。然后显示其月份分量。
d2
d2 = 1x3 datetime
15-Feb-2022 12:00:00 15-Jun-2022 12:00:00 15-Oct-2022 12:00:00
m = month(d2)
m = 1×3
2 6 10
访问月份分量的另一种方法是使用 d2
的 Month
属性。您可以通过 datetime
的 Year
、Month
、Day
、Hour
、Minute
和 Second
属性来访问其分量。
m = d2.Month
m = 1×3
2 6 10
要查找 d2
中出现在 6 月之前的元素,请将 d2
与对应于 6 月的数值进行比较。然后对 d2
进行索引。
tf = month(d2) < 6
tf = 1x3 logical array
1 0 0
beforeJune = d2(tf)
beforeJune = datetime
15-Feb-2022 12:00:00
比较 duration
数组
创建一个 duration
数组。要转换 hh:mm:ss
格式的文本,请使用 duration
函数。
t1 = duration("03:37:12")
t1 = duration
03:37:12
通过转换表示小时、分钟和秒的输入数值数组,创建另一个 duration
数组。
t2 = duration(0:2:6,30,0)
t2 = 1x4 duration
00:30:00 02:30:00 04:30:00 06:30:00
比较这两个 duration
数组。结果会显示 t2
中的哪些元素比 t1
长。
tf = t2 > t1
tf = 1x4 logical array
0 0 1 1
要创建仅包含匹配元素的新 duration
数组,请使用 tf
对 t2
进行索引。
longerThanT1 = t2(tf)
longerThanT1 = 1x2 duration
04:30:00 06:30:00
文本与 duration
值
如果您有表示时长的文本,其格式可以被 duration
函数识别,则您可以将该文本与 duration
数组进行比较。比较会隐式转换该文本。
例如,将 t2
与表示两小时零五分钟的字符串进行比较。t2
中的第一个元素较短。
tf = t2 >= "02:05:00"
tf = 1x4 logical array
0 1 1 1
longerThan205 = t2(tf)
longerThan205 = 1x3 duration
02:30:00 04:30:00 06:30:00
数值数组与 duration
数组
您可以将数值数组与 duration
数组进行比较。比较会将数值视为固定长度(24 小时制)的天数。
将 t2
中的元素与一天进行比较。每个元素都较短。
tf = t2 < 1
tf = 1x4 logical array
1 1 1 1
t2(tf)
ans = 1x4 duration
00:30:00 02:30:00 04:30:00 06:30:00
将 t2
中的元素与一小时进行比较。只有 t2
中的第一个元素较短。
tf = t2 < 1/24
tf = 1x4 logical array
1 0 0 0
t2(tf)
ans = duration
00:30:00
比较不同时区的 datetime
数组
分别为 2022 年 10 月 1 日下午 4 点(洛杉矶时间)和 2022 年 10 月 1 日下午 5 点(纽约时间)创建 datetime
值。这两个城市分处不同时区。
您可以通过指定 TimeZone
名称-值参量创建带时区的 datetime
数组。要在显示这些值时显示时区,请指定 Format
名称-值参量。请注意,您可以指定不同于输入文本格式的 datetime
显示格式。
LAtime = datetime("2022-10-01 16:00:00", ... "TimeZone","America/Los_Angeles",... "Format","dd-MMM-yyyy hh:mm:ss a z")
LAtime = datetime
01-Oct-2022 04:00:00 PM PDT
NYtime = datetime("2022-10-01 17:00:00", ... "TimeZone","America/New_York",... "Format","dd-MMM-yyyy hh:mm:ss a z")
NYtime = datetime
01-Oct-2022 05:00:00 PM EDT
比较这两个城市的时间。洛杉矶下午 4:00 发生在纽约同一天的下午 5:00 点之后。如果您指定了时区,则 datetime
数组的比较会考虑每个数组的时区信息。
tf = NYtime < LAtime
tf = logical
1
使用 ==
运算符比较时钟时间相同的两个 datetime
值。这两个值不相等,因为其时区不同。
NYtime4 = datetime("2022-10-01 16:00:00", ... "TimeZone","America/New_York",... "Format","dd-MMM-yyyy hh:mm:ss a z")
NYtime4 = datetime
01-Oct-2022 04:00:00 PM EDT
tf = NYtime4 == LAtime
tf = logical
0
无法将带时区的 datetime
数组与不带时区的 datetime
数组进行比较。如果只有一个 datetime
数组有时区,则没有足够的信息进行比较。
使用其他函数比较日期时间
MATLAB 还提供了其他用于日期时间比较的函数。
isbetween
- 确定datetime
或duration
数组的元素是否在一个区间内isdst
- 确定datetime
数组的元素是否在夏令时出现isweekend
- 确定datetime
数组的元素是否出现在周末(周六和周日)ismissing
- 确定数组的元素是否为缺失值(对于datetime
数组,缺失值为NaT
;对于duration
数组,缺失值为NaN
)
您还可以对 datetime
或 duration
数组执行集合运算。
union
- 两个datetime
或两个duration
数组的并集intersect
- 两个datetime
或两个duration
数组的交集ismember
- 第一个datetime
或duration
数组中属于第二个datetime
或duration
数组中的元素setdiff
- 两个datetime
或两个duration
数组的差集setxor
- 两个datetime
或两个duration
数组的异或集
例如,确定 datetime
数组中是否有出现在 2022 年第一季度的元素。(第一个季度的结束时刻与第二个季度的开始时刻相同。)
start1Q = datetime("2022-01-01"); end1Q = datetime("2022-04-01"); d = datetime(2022,2:4:10,15,12,0,0)
d = 1x3 datetime
15-Feb-2022 12:00:00 15-Jun-2022 12:00:00 15-Oct-2022 12:00:00
要确定 d
的哪些元素在第一季度的开始和结束之间,请使用 isbetween
。将 start1Q
和 end1Q
之间的时间区间指定为右开区间。
tf = isbetween(d,start1Q,end1Q,"openright")
tf = 1x3 logical array
1 0 0
当您使用 isbetween
并指定右开区间时,它等效于此表达式。该区间包括从 2022 年 1 月 1 日开始时刻到 2022 年 4 月 1 日开始时刻之间的每个时刻(但不包含后者)。当您使用下一个时间段的开始时间来指定时间段的结束时间时,请将该时间段视为右开时间区间。
tf = (start1Q <= d & d < end1Q)
tf = 1x3 logical array
1 0 0
显示 d
中出现在第一季度的元素。
d(tf)
ans = datetime
15-Feb-2022 12:00:00
通过设置 d
的 TimeZone
属性来指定其时区。然后确定是否有元素出现在夏令时期间。
d.TimeZone = "America/New_York";
isdst(d)
ans = 1x3 logical array
0 1 1
确定是否有元素出现在周末。
isweekend(d)
ans = 1x3 logical array
0 0 1
要显示匹配元素是星期几,请使用 day
函数。
weekendDays = d(isweekend(d))
weekendDays = datetime
15-Oct-2022 12:00:00
day(weekendDays,"name")
ans = 1x1 cell array
{'Saturday'}
另请参阅
datetime
| duration
| isbetween
| isdst
| isweekend
| ismissing
| day
| month