Момент в UTC и со сдвигом в Rust
Календарная дата без часов описывает только день. Момент на шкале времени хранят с часовым поясом: в крейте для этого есть тип даты-времени и метка UTC.
Текущий момент в UTC можно прочитать одной статической командой. Ее результат уже несет информацию о поясе нулевого сдвига.
Выведем такой момент и переведем его в пояс с фиксированным сдвигом на три часа восточнее UTC:
use chrono::{FixedOffset, Utc};
fn main() {
let now = Utc::now();
println!("{}", now);
if let Some(offset) = FixedOffset::east_opt(3 * 3600) {
let shifted = now.with_timezone(&offset);
println!("{}", shifted);
}
}
Первая строка показывает время с суффиксом
Z, вторая добавляет смещение
+03:00. Это один и тот же момент,
только подписанный по-разному.
Тот же сдвиг можно задать для наивной даты-времени без пояса через фиксированное смещение:
use chrono::{FixedOffset, NaiveDate, offset::MappedLocalTime};
fn main() {
if let Some(naive) =
NaiveDate::from_ymd_opt(2026, 10, 2).and_then(|d| d.and_hms_opt(15, 30, 0))
{
if let Some(offset) = FixedOffset::east_opt(3 * 3600) {
match offset.from_local_datetime(&naive) {
MappedLocalTime::Single(dt) => println!("{}", dt),
_ => {}
}
}
}
}
Скажите, чем момент в UTC отличается от наивной даты без пояса.
Запишите сдвиг +03:00 через
фиксированное смещение в секундах и
выведите текущий момент в этом поясе.
Дана наивная дата-время 2026-10-02 12:00:00.
Привяжите ее к UTC через and_utc
и выведите результат.