Main Content

比较日期时间

此示例说明如何使用关系运算符和比较函数来比较日期、时间和持续时间。由于 datetimeduration 数据类型以定量方式表示日期和时间,因此您可以使用用于比较数值数组的相同关系运算符。但是,这些比较的含义略有不同,具体视数据类型而定。

  • 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 数组,请使用 tfd2 进行索引。

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 值的分量。使用 yearquartermonthdayhourminutesecond 函数访问分量。您可以将分量与数字或 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

访问月份分量的另一种方法是使用 d2Month 属性。您可以通过 datetimeYearMonthDayHourMinuteSecond 属性来访问其分量。

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 数组,请使用 tft2 进行索引。

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 - 确定 datetimeduration 数组的元素是否在一个区间内

  • isdst - 确定 datetime 数组的元素是否在夏令时出现

  • isweekend - 确定 datetime 数组的元素是否出现在周末(周六和周日)

  • ismissing - 确定数组的元素是否为缺失值(对于 datetime 数组,缺失值为 NaT;对于 duration 数组,缺失值为 NaN

您还可以对 datetimeduration 数组执行集合运算。

  • union - 两个 datetime 或两个 duration 数组的并集

  • intersect - 两个 datetime 或两个 duration 数组的交集

  • ismember - 第一个 datetimeduration 数组中属于第二个 datetimeduration 数组中的元素

  • 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。将 start1Qend1Q 之间的时间区间指定为右开区间。

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

通过设置 dTimeZone 属性来指定其时区。然后确定是否有元素出现在夏令时期间。

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'}

另请参阅

| | | | | | |

相关主题