Created
May 14, 2021 17:59
-
-
Save asdacap/ee9cbd1383482309a527ec9fa4adb10f to your computer and use it in GitHub Desktop.
Snippet to specify custom date format when using Serde and Chrono
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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