Есть ли способ преобразовать сокращение часового пояса в смещение часового пояса в Rust?
Есть ли способ разбора сокращений часовых поясов (например, EST
или же MDT
) смещение часового пояса (например, -5 часов или -7 часов) в Rust? Ящик chrono_tz почти, кажется, делает это, но не совсем.
1 ответ
Вы можете использовать chrono_tz, вычитая время в запрошенном часовом поясе из того же времени в UTC:
use chrono::TimeZone;
use chrono_tz::Tz;
use chrono_tz::UTC;
fn main() {
let tz: Tz = "Australia/Melbourne".parse().unwrap();
let dt = tz.ymd(2019, 05, 09).and_hms(12, 0, 0);
let utc = UTC.ymd(2019, 05, 09).and_hms(12, 0, 0);
let offset = utc - dt;
println!("offset = UTC{:+02}:{:02}", offset.num_hours(), offset.num_minutes() % 60);
}
Результатом является Duration, из которого вы можете извлечь часы, минуты и т. Д. Мой пример выше дает результат:
offset = UTC+10:00
Обратите внимание, что часовые пояса поддерживаются chrono-tz
(которые получены из базы данных IANA TZ) не описывают фиксированные смещения. Скорее база данных содержит набор правил, описывающих переход на летнее время для каждого часового пояса. Поэтому вы можете точно получить смещение, указав время, в которое вы хотели бы узнать смещение (в моем примере это было 2019-05-09 12:00:00).
Есть также набор сокращений для фиксированных смещений от UTC. Они не очень хорошо стандартизированы, и фактически одна и та же аббревиатура может означать разные вещи в разных странах. Для этого вам может быть лучше создать простую справочную таблицу для набора сокращений, которые вы хотите поддерживать.