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