Как я могу проверить, попадает ли 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...
};

Детская площадка ссылка для полноты.

Другие вопросы по тегам