datetimerustrust-chrono

How do I go from a NaiveDate to a specific TimeZone with Chrono?


I am parsing dates and times in Rust using the chrono crate. The dates and times are from a website in which the date and time are from different sections of the page.

The date is shown in the format %d/%m/%Y (example: 27/08/2018). The time is shown with only the hour (example: 12, 10, 21, etc.)

I want to store these datetimes as UTC so that I can compute time remaining until a given datetime from now in a "timezone agnostic" way. I know which timezone these datetimes are from (Paris time).

I created a NaiveDate from the date input (this is a work in progress so there's no error handling yet):

let naive_date = NaiveDate::parse_from_str(date, "%d/%m/%Y").unwrap()

From that point on, what would be the best way to get the UTC DateTime, given that I have a string with the hour?

I am lost in the various TimeZone/Offset traits, and do not know if I should use a Local, or FixedOffset and then convert to Utc.


Solution

  • The Chrono documentation could probably be improved to make it easier to find how to do these things.

    Assuming this is your starting point:

    use chrono::{DateTime, FixedOffset, NaiveDate, NaiveDateTime, NaiveTime, TimeZone, Utc};
    
    // The date you parsed
    let date = NaiveDate::from_ymd(2018, 5, 13);
    // The known 1 hour time offset in seconds
    let tz_offset = FixedOffset::east(1 * 3600);
    // The known time
    let time = NaiveTime::from_hms(17, 0, 0);
    // Naive date time, with no time zone information
    let datetime = NaiveDateTime::new(date, time);
    

    You can then use the FixedOffset to construct a DateTime:

    let dt_with_tz: DateTime<FixedOffset> = tz_offset.from_local_datetime(&datetime).unwrap();
    

    If you need to convert it to a DateTime<Utc>, you can do this:

    let dt_with_tz_utc: DateTime<Utc> = Utc.from_utc_datetime(&dt_with_tz.naive_utc());