search interval in datetime

3 views (last 30 days)
Luca Re
Luca Re on 20 May 2024
Commented: Luca Re on 21 May 2024
hi, I have a datetime array of several many days. I need to serch interval
example:
TimeA=22:00
TimeB=03:00
search datetime>=timeA and datetime<=timeB (22:00 ..22:01..22:02. etc......23:59 ..00:00...00:01.etc... 2:58..2:59 3:00)
So I want without checking the day to have the indices of that range in the whole array
(the times in datetime are already ordered in a correct chronological way so the next time is always after the previous one)

Accepted Answer

Steven Lord
Steven Lord on 21 May 2024
Use the timeofday function to return the time since midnight of each element of the datetime array.
T = datetime('today') + hours(24*rand(10, 1))
T = 10x1 datetime array
21-May-2024 00:01:16 21-May-2024 10:22:46 21-May-2024 07:40:50 21-May-2024 23:22:42 21-May-2024 10:42:10 21-May-2024 20:30:07 21-May-2024 22:42:34 21-May-2024 13:15:17 21-May-2024 06:45:24 21-May-2024 06:13:04
TOD = timeofday(T)
TOD = 10x1 duration array
00:01:16 10:22:46 07:40:50 23:22:42 10:42:10 20:30:07 22:42:34 13:15:17 06:45:24 06:13:04
Then compare to duration objects representing the ends of the interval of interest. In this case because the interval includes midnight we need to ask if the timeofday is greater than the first end or less than the second end.
past2200 = TOD > duration(22, 0, 0)
past2200 = 10x1 logical array
0 0 0 1 0 0 1 0 0 0
before0300 = TOD < duration(3, 0, 0)
before0300 = 10x1 logical array
1 0 0 0 0 0 0 0 0 0
T(past2200 | before0300)
ans = 3x1 datetime array
21-May-2024 00:01:16 21-May-2024 23:22:42 21-May-2024 22:42:34
results = table(T, past2200, before0300, past2200 | before0300, ...
'VariableNames', ["times", "> 2200", "< 0300", "overnight"])
results = 10x4 table
times > 2200 < 0300 overnight ____________________ ______ ______ _________ 21-May-2024 00:01:16 false true true 21-May-2024 10:22:46 false false false 21-May-2024 07:40:50 false false false 21-May-2024 23:22:42 true false true 21-May-2024 10:42:10 false false false 21-May-2024 20:30:07 false false false 21-May-2024 22:42:34 true false true 21-May-2024 13:15:17 false false false 21-May-2024 06:45:24 false false false 21-May-2024 06:13:04 false false false
  3 Comments
Steven Lord
Steven Lord on 21 May 2024
Use the ymd function to obtain the year, month, and day components of the datetime.
dt = datetime('now')
dt = datetime
21-May-2024 15:02:57
[y, m, d] = ymd(dt)
y = 2024
m = 5
d = 21
There's a similar hms function for hour, minute, and second.
[h, m2, s] = hms(dt)
h = 15
m2 = 2
s = 57.0178

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!