logo
pub struct OffsetTime<F> { /* private fields */ }
This is supported on crate features fmt and std and time only.
Expand description

Formats the current time using a fixed offset and a formatter from the time crate.

This is typically used as an alternative to LocalTime. LocalTime determines the offset every time it formats a message, which may be unsound or fail. With OffsetTime, the offset is determined once. This makes it possible to do so while the program is still single-threaded and handle any errors. However, this also means the offset cannot change while the program is running (the offset will not change across DST changes).

Implementations

Returns a formatter that formats the current time using the local time offset in the RFC 3339 format (a subset of the ISO 8601 timestamp format).

Returns an error if the local time offset cannot be determined. This typically occurs in multithreaded programs. To avoid this problem, initialize OffsetTime before forking threads. When using Tokio, this means initializing OffsetTime before the Tokio runtime.

Examples
use tracing_subscriber::fmt::{self, time};

let collector = tracing_subscriber::fmt()
    .with_timer(time::OffsetTime::local_rfc_3339().expect("could not get local offset!"));

Using OffsetTime with Tokio:

use tracing_subscriber::fmt::time::OffsetTime;

#[tokio::main]
async fn run() {
    tracing::info!("runtime initialized");

    // At this point the Tokio runtime is initialized, and we can use both Tokio and Tracing
    // normally.
}

fn main() {
    // Because we need to get the local offset before Tokio spawns any threads, our `main`
    // function cannot use `tokio::main`.
    tracing_subscriber::fmt()
        .with_timer(OffsetTime::local_rfc_3339().expect("could not get local time offset"))
        .init();

    // Even though `run` is written as an `async fn`, because we used `tokio::main` on it
    // we can call it as a synchronous function.
    run();
}

Returns a formatter that formats the current time using the time crate with the provided provided format and timezone offset. The format may be any type that implements the Formattable trait.

Typically, the offset will be the local offset, and format will be a format description string, or one of the time crate’s well-known formats.

If the format description is statically known, then the format_description! macro should be used. This is identical to the time::format_description::parse method, but runs at compile-time, throwing an error if the format description is invalid. If the desired format is not known statically (e.g., a user is providing a format string), then the time::format_description::parse method should be used. Note that this method is fallible.

See the time book for details on the format description syntax.

Examples

Using the format_description! macro:

use tracing_subscriber::fmt::{self, time::OffsetTime};
use time::macros::format_description;
use time::UtcOffset;

let offset = UtcOffset::current_local_offset().expect("should get local offset!");
let timer = OffsetTime::new(offset, format_description!("[hour]:[minute]:[second]"));
let collector = tracing_subscriber::fmt()
    .with_timer(timer);

Using time::format_description::parse:

use tracing_subscriber::fmt::{self, time::OffsetTime};
use time::UtcOffset;

let offset = UtcOffset::current_local_offset().expect("should get local offset!");
let time_format = time::format_description::parse("[hour]:[minute]:[second]")
    .expect("format string should be valid!");
let timer = OffsetTime::new(offset, time_format);
let collector = tracing_subscriber::fmt()
    .with_timer(timer);

Using the format_description! macro requires enabling the time crate’s “macros” feature flag.

Using a well-known format (this is equivalent to OffsetTime::local_rfc_3339):

use tracing_subscriber::fmt::{self, time::OffsetTime};
use time::UtcOffset;

let offset = UtcOffset::current_local_offset().expect("should get local offset!");
let timer = OffsetTime::new(offset, time::format_description::well_known::Rfc3339);
let collector = tracing_subscriber::fmt()
    .with_timer(timer);

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Measure and write out the current time. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more

Instruments this type with the current Span, returning an Instrumented wrapper. Read more

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into #41263)

Uses borrowed data to replace owned data, usually by cloning. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more