tea_time/impls/
impl_datetime.rs

1use std::convert::TryFrom;
2use std::str::FromStr;
3
4use chrono::{DateTime as CrDateTime, NaiveDate, NaiveDateTime, Utc};
5use tea_error::*;
6
7use crate::*;
8
9// const fn try_into_chrono_datetime<U: TimeUnitTrait>(dt: DateTime<U>) -> CrDateTime<Utc> {
10//     match U::unit() {
11//         TimeUnit::Second => CrDateTime::from_timestamp(dt.0, 0).unwrap(),
12//         TimeUnit::Millisecond => CrDateTime::from_timestamp_millis(dt.0).unwrap(),
13//         TimeUnit::Microsecond => CrDateTime::from_timestamp_micros(dt.0).unwrap(),
14//         TimeUnit::Nanosecond => CrDateTime::from_timestamp_nanos(dt.0),
15//         _ => todo!(),
16//     }
17// }
18
19impl<U: TimeUnitTrait> From<i64> for DateTime<U> {
20    #[inline]
21    fn from(dt: i64) -> Self {
22        DateTime::new(dt)
23    }
24}
25
26impl<U: TimeUnitTrait> From<Option<i64>> for DateTime<U> {
27    #[inline]
28    fn from(dt: Option<i64>) -> Self {
29        if let Some(dt) = dt {
30            DateTime::new(dt)
31        } else {
32            DateTime::nat()
33        }
34    }
35}
36
37impl<U: TimeUnitTrait> Default for DateTime<U> {
38    #[inline]
39    fn default() -> Self {
40        DateTime::nat()
41    }
42}
43
44impl<U: TimeUnitTrait> FromStr for DateTime<U>
45where
46    Self: From<CrDateTime<Utc>>,
47{
48    type Err = TError;
49
50    #[inline]
51    fn from_str(s: &str) -> Result<Self, Self::Err> {
52        DateTime::parse(s, None)
53    }
54}
55
56impl<U: TimeUnitTrait> From<NaiveDateTime> for DateTime<U>
57where
58    Self: From<CrDateTime<Utc>>,
59{
60    #[inline]
61    fn from(dt: NaiveDateTime) -> Self {
62        CrDateTime::from_naive_utc_and_offset(dt, Utc).into()
63    }
64}
65
66impl<U: TimeUnitTrait> From<Option<NaiveDateTime>> for DateTime<U>
67where
68    Self: From<CrDateTime<Utc>>,
69{
70    #[inline]
71    fn from(dt: Option<NaiveDateTime>) -> Self {
72        if let Some(dt) = dt {
73            CrDateTime::from_naive_utc_and_offset(dt, Utc).into()
74        } else {
75            DateTime::nat()
76        }
77    }
78}
79
80impl<U: TimeUnitTrait> From<NaiveDate> for DateTime<U>
81where
82    Self: From<CrDateTime<Utc>>,
83{
84    #[inline]
85    fn from(dt: NaiveDate) -> Self {
86        CrDateTime::from_naive_utc_and_offset(dt.and_hms_opt(0, 0, 0).unwrap(), Utc).into()
87    }
88}
89
90impl TryFrom<DateTime<Second>> for CrDateTime<Utc> {
91    type Error = TError;
92    #[inline]
93    fn try_from(dt: DateTime<Second>) -> TResult<Self> {
94        CrDateTime::from_timestamp(dt.0, 0)
95            .ok_or_else(|| terr!("Failed to convert DateTime<Second> to CrDateTime"))
96    }
97}
98
99impl TryFrom<DateTime<Millisecond>> for CrDateTime<Utc> {
100    type Error = TError;
101    #[inline]
102    fn try_from(dt: DateTime<Millisecond>) -> TResult<Self> {
103        CrDateTime::from_timestamp_millis(dt.0)
104            .ok_or_else(|| terr!("Failed to convert DateTime<Millisecond> to CrDateTime"))
105    }
106}
107
108impl TryFrom<DateTime<Microsecond>> for CrDateTime<Utc> {
109    type Error = TError;
110    #[inline]
111    fn try_from(dt: DateTime<Microsecond>) -> TResult<Self> {
112        CrDateTime::from_timestamp_micros(dt.0)
113            .ok_or_else(|| terr!("Failed to convert DateTime<Microsecond> to CrDateTime"))
114    }
115}
116
117impl TryFrom<DateTime<Nanosecond>> for CrDateTime<Utc> {
118    type Error = TError;
119    #[inline]
120    fn try_from(dt: DateTime<Nanosecond>) -> TResult<Self> {
121        Ok(CrDateTime::from_timestamp_nanos(dt.0))
122    }
123}
124
125impl From<CrDateTime<Utc>> for DateTime<Second> {
126    #[inline]
127    fn from(dt: CrDateTime<Utc>) -> Self {
128        dt.timestamp().into()
129    }
130}
131
132impl From<CrDateTime<Utc>> for DateTime<Millisecond> {
133    #[inline]
134    fn from(dt: CrDateTime<Utc>) -> Self {
135        dt.timestamp_millis().into()
136    }
137}
138
139impl From<CrDateTime<Utc>> for DateTime<Microsecond> {
140    #[inline]
141    fn from(dt: CrDateTime<Utc>) -> Self {
142        dt.timestamp_micros().into()
143    }
144}
145
146impl From<CrDateTime<Utc>> for DateTime<Nanosecond> {
147    #[inline]
148    fn from(dt: CrDateTime<Utc>) -> Self {
149        dt.timestamp_nanos_opt()
150            .expect("Failed to convert to nanosecond")
151            .into()
152    }
153}