1use chrono::{DateTime, Utc};
3use serde::{Deserialize, Deserializer, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Serialize, Deserialize)]
7pub struct UtcTime(DateTime<Utc>);
8
9impl UtcTime {
10 #[inline]
11 pub fn new(datetime: DateTime<Utc>) -> Self {
12 Self(datetime)
13 }
14
15 #[inline]
17 pub fn now() -> Self {
18 Self::new(Utc::now())
19 }
20
21 #[inline]
22 pub(crate) fn before(&self, timestamp: i64) -> bool {
23 timestamp < self.0.timestamp()
24 }
25
26 #[inline]
28 pub fn format_time(&self) -> String {
29 self.0.format("%Y-%m-%dT%H:%M:%S%.3fZ").to_string()
30 }
31
32 #[inline]
36 pub fn aws_format_time(&self) -> String {
37 self.0.format("%Y%m%dT%H%M%SZ").to_string()
38 }
39
40 #[inline]
44 pub fn aws_format_date(&self) -> String {
45 self.0.format("%Y%m%d").to_string()
46 }
47}
48
49impl From<DateTime<Utc>> for UtcTime {
50 fn from(datetime: DateTime<Utc>) -> Self {
51 Self::new(datetime)
52 }
53}
54
55impl Default for UtcTime {
56 fn default() -> Self {
58 Self::now()
59 }
60}
61
62#[inline]
64pub fn aws_format_time(t: &UtcTime) -> String {
65 t.0.format("%Y%m%dT%H%M%SZ").to_string()
66}
67
68#[inline]
70pub fn aws_format_date(t: &UtcTime) -> String {
71 t.0.format("%Y%m%d").to_string()
72}
73
74pub fn deserialize_with_str<'de, D>(deserializer: D) -> Result<UtcTime, D::Error>
75where
76 D: Deserializer<'de>,
77{
78 let value = <DateTime<Utc>>::deserialize(deserializer)?;
79 Ok(UtcTime::new(value))
80}