1 | // This is a part of Chrono. |
2 | // See README.md and LICENSE.txt for details. |
3 | |
4 | //! The UTC (Coordinated Universal Time) time zone. |
5 | |
6 | use core::fmt; |
7 | #[cfg (all( |
8 | feature = "now" , |
9 | not(all( |
10 | target_arch = "wasm32" , |
11 | feature = "wasmbind" , |
12 | not(any(target_os = "emscripten" , target_os = "wasi" )) |
13 | )) |
14 | ))] |
15 | use std::time::{SystemTime, UNIX_EPOCH}; |
16 | |
17 | #[cfg (any(feature = "rkyv" , feature = "rkyv-16" , feature = "rkyv-32" , feature = "rkyv-64" ))] |
18 | use rkyv::{Archive, Deserialize, Serialize}; |
19 | |
20 | use super::{FixedOffset, LocalResult, Offset, TimeZone}; |
21 | use crate::naive::{NaiveDate, NaiveDateTime}; |
22 | #[cfg (feature = "now" )] |
23 | #[allow (deprecated)] |
24 | use crate::{Date, DateTime}; |
25 | |
26 | /// The UTC time zone. This is the most efficient time zone when you don't need the local time. |
27 | /// It is also used as an offset (which is also a dummy type). |
28 | /// |
29 | /// Using the [`TimeZone`](./trait.TimeZone.html) methods |
30 | /// on the UTC struct is the preferred way to construct `DateTime<Utc>` |
31 | /// instances. |
32 | /// |
33 | /// # Example |
34 | /// |
35 | /// ``` |
36 | /// use chrono::{DateTime, TimeZone, Utc}; |
37 | /// |
38 | /// let dt = DateTime::from_timestamp(61, 0).unwrap(); |
39 | /// |
40 | /// assert_eq!(Utc.timestamp_opt(61, 0).unwrap(), dt); |
41 | /// assert_eq!(Utc.with_ymd_and_hms(1970, 1, 1, 0, 1, 1).unwrap(), dt); |
42 | /// ``` |
43 | #[derive (Copy, Clone, PartialEq, Eq, Hash)] |
44 | #[cfg_attr ( |
45 | any(feature = "rkyv" , feature = "rkyv-16" , feature = "rkyv-32" , feature = "rkyv-64" ), |
46 | derive(Archive, Deserialize, Serialize), |
47 | archive(compare(PartialEq)), |
48 | archive_attr(derive(Clone, Copy, PartialEq, Eq, Debug, Hash)) |
49 | )] |
50 | #[cfg_attr (feature = "rkyv-validation" , archive(check_bytes))] |
51 | #[cfg_attr (all(feature = "arbitrary" , feature = "std" ), derive(arbitrary::Arbitrary))] |
52 | pub struct Utc; |
53 | |
54 | #[cfg (feature = "now" )] |
55 | impl Utc { |
56 | /// Returns a `Date` which corresponds to the current date. |
57 | #[deprecated ( |
58 | since = "0.4.23" , |
59 | note = "use `Utc::now()` instead, potentially with `.date_naive()`" |
60 | )] |
61 | #[allow (deprecated)] |
62 | #[must_use ] |
63 | pub fn today() -> Date<Utc> { |
64 | Utc::now().date() |
65 | } |
66 | |
67 | /// Returns a `DateTime<Utc>` which corresponds to the current date and time in UTC. |
68 | /// |
69 | /// See also the similar [`Local::now()`] which returns `DateTime<Local>`, i.e. the local date |
70 | /// and time including offset from UTC. |
71 | /// |
72 | /// [`Local::now()`]: crate::Local::now |
73 | /// |
74 | /// # Example |
75 | /// |
76 | /// ``` |
77 | /// # #![allow (unused_variables)] |
78 | /// # use chrono::{FixedOffset, Utc}; |
79 | /// // Current time in UTC |
80 | /// let now_utc = Utc::now(); |
81 | /// |
82 | /// // Current date in UTC |
83 | /// let today_utc = now_utc.date_naive(); |
84 | /// |
85 | /// // Current time in some timezone (let's use +05:00) |
86 | /// let offset = FixedOffset::east_opt(5 * 60 * 60).unwrap(); |
87 | /// let now_with_offset = Utc::now().with_timezone(&offset); |
88 | /// ``` |
89 | #[cfg (not(all( |
90 | target_arch = "wasm32" , |
91 | feature = "wasmbind" , |
92 | not(any(target_os = "emscripten" , target_os = "wasi" )) |
93 | )))] |
94 | #[must_use ] |
95 | pub fn now() -> DateTime<Utc> { |
96 | let now = |
97 | SystemTime::now().duration_since(UNIX_EPOCH).expect("system time before Unix epoch" ); |
98 | DateTime::from_timestamp(now.as_secs() as i64, now.subsec_nanos()).unwrap() |
99 | } |
100 | |
101 | /// Returns a `DateTime` which corresponds to the current date and time. |
102 | #[cfg (all( |
103 | target_arch = "wasm32" , |
104 | feature = "wasmbind" , |
105 | not(any(target_os = "emscripten" , target_os = "wasi" )) |
106 | ))] |
107 | #[must_use ] |
108 | pub fn now() -> DateTime<Utc> { |
109 | let now = js_sys::Date::new_0(); |
110 | DateTime::<Utc>::from(now) |
111 | } |
112 | } |
113 | |
114 | impl TimeZone for Utc { |
115 | type Offset = Utc; |
116 | |
117 | fn from_offset(_state: &Utc) -> Utc { |
118 | Utc |
119 | } |
120 | |
121 | fn offset_from_local_date(&self, _local: &NaiveDate) -> LocalResult<Utc> { |
122 | LocalResult::Single(Utc) |
123 | } |
124 | fn offset_from_local_datetime(&self, _local: &NaiveDateTime) -> LocalResult<Utc> { |
125 | LocalResult::Single(Utc) |
126 | } |
127 | |
128 | fn offset_from_utc_date(&self, _utc: &NaiveDate) -> Utc { |
129 | Utc |
130 | } |
131 | fn offset_from_utc_datetime(&self, _utc: &NaiveDateTime) -> Utc { |
132 | Utc |
133 | } |
134 | } |
135 | |
136 | impl Offset for Utc { |
137 | fn fix(&self) -> FixedOffset { |
138 | FixedOffset::east_opt(secs:0).unwrap() |
139 | } |
140 | } |
141 | |
142 | impl fmt::Debug for Utc { |
143 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
144 | write!(f, "Z" ) |
145 | } |
146 | } |
147 | |
148 | impl fmt::Display for Utc { |
149 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
150 | write!(f, "UTC" ) |
151 | } |
152 | } |
153 | |