pub struct OffsetTime<F> { /* private fields */ }
Available 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§

source§

impl OffsetTime<Rfc3339>

source

pub fn local_rfc_3339() -> Result<Self, IndeterminateOffset>

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 subscriber = 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();
}
source§

impl<F: Formattable> OffsetTime<F>

source

pub fn new(offset: UtcOffset, format: F) -> Self

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 subscriber = 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 subscriber = 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 subscriber = tracing_subscriber::fmt()
    .with_timer(timer);

Trait Implementations§

source§

impl<F: Clone> Clone for OffsetTime<F>

source§

fn clone(&self) -> OffsetTime<F>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<F: Debug> Debug for OffsetTime<F>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<F> FormatTime for OffsetTime<F>
where F: Formattable,

source§

fn format_time(&self, w: &mut Writer<'_>) -> Result

Measure and write out the current time. Read more

Auto Trait Implementations§

§

impl<F> RefUnwindSafe for OffsetTime<F>
where F: RefUnwindSafe,

§

impl<F> Send for OffsetTime<F>
where F: Send,

§

impl<F> Sync for OffsetTime<F>
where F: Sync,

§

impl<F> Unpin for OffsetTime<F>
where F: Unpin,

§

impl<F> UnwindSafe for OffsetTime<F>
where F: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

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

fn in_current_span(self) -> Instrumented<Self>

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

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

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

source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

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

fn clone_into(&self, target: &mut T)

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

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

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

fn with_current_subscriber(self) -> WithDispatch<Self>

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