tea_time/impls/
impl_datetime.rs1use std::convert::TryFrom;
2use std::str::FromStr;
3
4use chrono::{DateTime as CrDateTime, NaiveDate, NaiveDateTime, Utc};
5use tea_error::*;
6
7use crate::*;
8
9impl<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}