Как получить DateTime в указанную дату и время в указанном часовом поясе с помощью rust chrono

У меня есть название часового пояса, например "America/New_York", а также год, месяц, день, час, минута и секунда в этом часовом поясе для определенного времени. Как я могу получить объект DateTime с учетом часового пояса для этого времени в этом часовом поясе. Как локальный объект, но с указанным часовым поясом вместо местного часового пояса.

std::env::set_var("TZ", "America/New_York");
let x = Local.ymd(2019, 12, 1).and_hms(2, 0, 0);

Это дает результат, который я хочу, но я не хочу устанавливать переменную среды TZ, потому что я хочу, чтобы локальное время оставалось местным, и мне нужно иметь возможность изменять TZ для разных случаев, в то время как chrono только читает переменную среды TZ один раз, насколько я знаю.

Я хочу что-то вроде

пусть x =???.tz("Америка / Нью-Йорк").ymd(2019, 12, 1).and_hms(2, 0, 0);

Это возвращает DateTime с учетом часового пояса, который будет правильно обрабатывать такие операции, как добавление и вычитание продолжительности, с учетом часового пояса. Таким образом, FixeOffest не работает, потому что добавление продолжительности, которая охватывает переход на летнее время, например, не дает (по моему опыту) результата с правильным смещением - он остается на исходном фиксированном смещении, даже если это не так. не подать заявку на новую дату.

Что-то подобное существует? Могу ли я создать локальный объект с указанным TZ без установки переменной среды TZ?

1 ответ

Вы можете просто использоватьchrono_tz

      use chrono::TimeZone;
use chrono_tz::Tz;
fn main() {
    let x = chrono_tz::America::New_York.with_ymd_and_hms(2019, 12, 1, 2, 0, 0);
    // or with parsing from a string:
    let y = "America/New_York"
        .parse::<Tz>()
        .unwrap()
        .with_ymd_and_hms(2022, 12, 1, 1, 39, 0);
    dbg!(x, y);
}
Другие вопросы по тегам