Как я могу проверить, попадает ли chrono::DateTime<Local> в определенное время дня?
Я хочу сравнить текущее местное время с постоянным временным диапазоном, но мое текущее решение кажется более сложным, чем я ожидал.
Я могу построить chrono::DateTime<Local>
с Local::now()
, Тогда я могу с трудом выяснить, now
лежит в определенном диапазоне времени, например, так:
let current_hour = now.hour();
let current_minute = now.minute();
// see if `now` lies between 06:00 and 23:00
current_hour >= 6 && current_hour < 23
// note the inelegance of the syntax and the potential for fencepost errors
Если я хочу проверить диапазон от 06:12–23:15, проблема становится намного хуже, потому что я должен проверить, равен ли час 6, а затем, если минуты больше 12, а затем проверить - zzzzz...
Это скучно. Я могу попробовать строковые представления с parse_from_rfc2822
, но затем я должен сначала выдать текущую дату, а затем отредактировать время суток, а затем проверить наличие ошибок синтаксического анализа, и теперь я снова сплю.
Я предполагаю, что я просто читаю хронологическую документацию неправильно. Если бы я реализовал библиотеку, я бы попытался построить TimeOfDay<Local>
тип данных, который реализует Ord
, тем самым позволяя идиоматическую проверку диапазона. Я полагаю, что это уже где-то там, и я просто скучаю по нему.
1 ответ
DateTime
объекты имеют функцию под названием time()
, который возвращает NaiveTime
объект, представляющий время суток. NaiveTime
инвентарь PartialOrd
и имеет заводскую функцию from_hms(hour, min, sec)
, С помощью from_hms
, вы можете создать верхнюю и нижнюю границу NaiveTime
, а затем сравнить с помощью стандартных операторов.
let low = NaiveTime::from_hms(6, 12, 0);
let high = NaiveTime::from_hms(23, 15, 0);
let time_of_day = Local::now().time();
if (time_of_day > low) && (time_of_day < high) {
// do stuff...
} else {
// do something else...
};