Skip to content

Instantly share code, notes, and snippets.

@asdacap
Created May 14, 2021 17:59
Show Gist options
  • Save asdacap/ee9cbd1383482309a527ec9fa4adb10f to your computer and use it in GitHub Desktop.
Save asdacap/ee9cbd1383482309a527ec9fa4adb10f to your computer and use it in GitHub Desktop.
Snippet to specify custom date format when using Serde and Chrono
use serde::Deserialize;
use serde_json;
use chrono::{DateTime,Utc,NaiveDateTime,NaiveDate};
#[derive(Debug, Deserialize)]
struct TheStruct {
#[serde(deserialize_with = "datetime_deserializer")]
time: DateTime<Utc>,
}
const DATE_FORMAT: &str = "%F %T";
pub fn datetime_deserializer<'de, D>(d: D) -> Result<DateTime<Utc>, D::Error>
where
D: serde::Deserializer<'de>,
{
let as_str: &str = Deserialize::deserialize(d)?;
return NaiveDateTime::parse_from_str(as_str, DATE_FORMAT)
.map(|dt| DateTime::<Utc>::from_utc(dt, Utc))
.map_err(|e| {
serde::de::Error::custom(format!("Error parting date: {}", e.to_string()))
});
}
#[test]
fn test_date_format() {
let json = r#"{
"time": "2019-04-01 12:00:00"
}"#;
let val: TheStruct = serde_json::from_str(json)
.expect("failed to parse json");
let expected = DateTime::<Utc>::from_utc(
NaiveDate::from_ymd(2019, 4, 1).and_hms(12, 0, 0),
Utc);
assert_eq!(val.time, expected);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment