1use std::time::Duration;
2
3use super::{Error, Timestamp};
4use chrono::{DateTime, Local, NaiveDateTime, Utc};
5
6impl TryFrom<Timestamp> for NaiveDateTime {
7 type Error = Error;
8 #[inline]
9 fn try_from(t: Timestamp) -> Result<Self, Self::Error> {
10 let d = DateTime::from_timestamp(i64::try_from(t.0.as_secs())?, t.0.subsec_nanos())
11 .ok_or(Error::ConvertChrono)?;
12 Ok(d.naive_utc())
13 }
14}
15impl TryFrom<Timestamp> for DateTime<Utc> {
16 type Error = Error;
17 fn try_from(t: Timestamp) -> Result<Self, Self::Error> {
18 let nt = NaiveDateTime::try_from(t)?;
19 let dt_utc = DateTime::<Utc>::from_naive_utc_and_offset(nt, Utc);
20 Ok(dt_utc)
21 }
22}
23impl TryFrom<Timestamp> for DateTime<Local> {
24 type Error = Error;
25 fn try_from(t: Timestamp) -> Result<Self, Self::Error> {
26 let dt_utc = DateTime::<Utc>::try_from(t)?;
27 Ok(DateTime::from(dt_utc))
28 }
29}
30impl TryFrom<NaiveDateTime> for Timestamp {
31 type Error = Error;
32 fn try_from(datetime: NaiveDateTime) -> Result<Self, Self::Error> {
33 let duration_nanos = Duration::from_secs(u64::try_from(
34 datetime
35 .and_utc()
36 .timestamp_nanos_opt()
37 .ok_or(Error::ConvertChrono)?,
38 )?);
39 Ok(Self(duration_nanos))
40 }
41}
42impl TryFrom<DateTime<Utc>> for Timestamp {
43 type Error = Error;
44 fn try_from(datetime: DateTime<Utc>) -> Result<Self, Self::Error> {
45 let duration_sec = Duration::from_secs(u64::try_from(datetime.timestamp())?);
46 let duration_nanos = Duration::from_nanos(u64::from(datetime.timestamp_subsec_nanos()));
47 Ok(Self(duration_sec + duration_nanos))
48 }
49}
50impl TryFrom<DateTime<Local>> for Timestamp {
51 type Error = Error;
52 fn try_from(datetime: DateTime<Local>) -> Result<Self, Self::Error> {
53 let duration_sec = Duration::from_secs(u64::try_from(datetime.timestamp())?);
54 let duration_nanos = Duration::from_nanos(u64::from(datetime.timestamp_subsec_nanos()));
55 Ok(Self(duration_sec + duration_nanos))
56 }
57}
58impl Timestamp {
59 #[inline]
60 pub fn try_into_naivedatetime(self) -> Result<NaiveDateTime, Error> {
61 self.try_into()
62 }
63 #[inline]
64 pub fn try_into_datetime_local(self) -> Result<DateTime<Local>, Error> {
65 self.try_into()
66 }
67 #[inline]
68 pub fn try_into_datetime_utc(self) -> Result<DateTime<Utc>, Error> {
69 self.try_into()
70 }
71}