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
.
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());