Есть ли способ преобразовать сокращение часового пояса в смещение часового пояса в Rust? - PullRequest
0 голосов
/ 09 мая 2019

Есть ли способ анализа аббревиатур часовых поясов (например, EST или MDT) для смещения часового пояса (например, -5 часов или -7 часов) в Rust? ящик crono_tz почти, кажется, делает это, но не совсем.

1 Ответ

5 голосов
/ 09 мая 2019

Вы можете использовать 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. Они не очень хорошо стандартизированы, и фактически одна и та же аббревиатура может означать разные вещи в разных странах. Для этого вам может быть лучше создать простую справочную таблицу для набора сокращений, которые вы хотите поддерживать.

...