Длительность и вычисление интервалов

Измерение прошедшего времени между двумя моментами выполнения кода

std-badge cat-time-badge

Пример измеряет количество времени time::Instant::elapsed, прошедшее с момента time::Instant::now.

Вызов time::Instant::elapsed возвращает time::Duration, который мы выводим на экран в конце примера. Этот метод не изменяет и не сбрасывает состояние объекта time::Instant.

use std::time::{Duration, Instant};
use std::thread;

fn expensive_function() {
    thread::sleep(Duration::from_secs(1));
}

fn main() {
    let start = Instant::now();
    expensive_function();
    let duration = start.elapsed();

    println!("Time elapsed in expensive_function() is: {:?}", duration);
}

Проверяемое вычисление даты и времени

chrono-badge cat-date-and-time-badge

Код в примере вычисляет и отображает дату и время через 2 недели от текущего момента времени используя DateTime::checked_add_signed и дату за сутки до этого дня используя DateTime::checked_sub_signed. Эти методы возвращают None, если дата и время не могут быть вычислены.

Доступные управляющие последовательности для DateTime::format могут быть найдены в chrono::format::strftime.

extern crate chrono;
use chrono::{DateTime, Duration, Utc};

fn day_earlier(date_time: DateTime<Utc>) -> Option<DateTime<Utc>> {
    date_time.checked_sub_signed(Duration::days(1))
}

fn main() {
    let now = Utc::now();
    println!("{}", now);

    let almost_three_weeks_from_now = now.checked_add_signed(Duration::weeks(2))
            .and_then(|in_2weeks| in_2weeks.checked_add_signed(Duration::weeks(1)))
            .and_then(day_earlier);

    match almost_three_weeks_from_now {
        Some(x) => println!("{}", x),
        None => eprintln!("Almost three weeks from now overflows!"),
    }

    match now.checked_add_signed(Duration::max_value()) {
        Some(x) => println!("{}", x),
        None => eprintln!("We can't use chrono to tell the time for the Solar System to complete more than one full orbit around the galactic center."),
    }
}

Преобразование локального времени во время в другом часовом поясе

chrono-badge cat-date-and-time-badge

Этот пример получает локальное время и отображает его с помощью offset::Local::now и затем преобразует его в UTC используя метод DateTime::from_utc. Затем время преобразуется посредством структуры offset::FixedOffset и время из UTC затем преобразуется в UTC+8 и UTC-2.

extern crate chrono;

use chrono::{DateTime, FixedOffset, Local, Utc};

fn main() {
    let local_time = Local::now();
    let utc_time = DateTime::<Utc>::from_utc(local_time.naive_utc(), Utc);
    let china_timezone = FixedOffset::east(8 * 3600);
    let rio_timezone = FixedOffset::west(2 * 3600);
    println!("Local time now is {}", local_time);
    println!("UTC time now is {}", utc_time);
    println!(
        "Time in Hong Kong now is {}",
        utc_time.with_timezone(&china_timezone)
    );
    println!("Time in Rio de Janeiro now is {}", utc_time.with_timezone(&rio_timezone));
}