chrono/naive/datetime/mod.rs
1// This is a part of Chrono.
2// See README.md and LICENSE.txt for details.
3
4//! ISO 8601 date and time without timezone.
5
6#[cfg(feature = "alloc")]
7use core::borrow::Borrow;
8use core::fmt::Write;
9use core::ops::{Add, AddAssign, Sub, SubAssign};
10use core::time::Duration;
11use core::{fmt, str};
12
13#[cfg(any(feature = "rkyv", feature = "rkyv-16", feature = "rkyv-32", feature = "rkyv-64"))]
14use rkyv::{Archive, Deserialize, Serialize};
15
16#[cfg(feature = "alloc")]
17use crate::format::DelayedFormat;
18use crate::format::{parse, parse_and_remainder, ParseError, ParseResult, Parsed, StrftimeItems};
19use crate::format::{Fixed, Item, Numeric, Pad};
20use crate::naive::{Days, IsoWeek, NaiveDate, NaiveTime};
21use crate::offset::Utc;
22use crate::time_delta::NANOS_PER_SEC;
23use crate::{
24 expect, try_opt, DateTime, Datelike, FixedOffset, LocalResult, Months, TimeDelta, TimeZone,
25 Timelike, Weekday,
26};
27#[cfg(feature = "rustc-serialize")]
28pub(super) mod rustc_serialize;
29
30/// Tools to help serializing/deserializing `NaiveDateTime`s
31#[cfg(feature = "serde")]
32pub(crate) mod serde;
33
34#[cfg(test)]
35mod tests;
36
37/// The tight upper bound guarantees that a time delta with `|TimeDelta| >= 2^MAX_SECS_BITS`
38/// will always overflow the addition with any date and time type.
39///
40/// So why is this needed? `TimeDelta::seconds(rhs)` may overflow, and we don't have
41/// an alternative returning `Option` or `Result`. Thus we need some early bound to avoid
42/// touching that call when we are already sure that it WILL overflow...
43const MAX_SECS_BITS: usize = 44;
44
45/// The minimum possible `NaiveDateTime`.
46#[deprecated(since = "0.4.20", note = "Use NaiveDateTime::MIN instead")]
47pub const MIN_DATETIME: NaiveDateTime = NaiveDateTime::MIN;
48/// The maximum possible `NaiveDateTime`.
49#[deprecated(since = "0.4.20", note = "Use NaiveDateTime::MAX instead")]
50pub const MAX_DATETIME: NaiveDateTime = NaiveDateTime::MAX;
51
52/// ISO 8601 combined date and time without timezone.
53///
54/// # Example
55///
56/// `NaiveDateTime` is commonly created from [`NaiveDate`].
57///
58/// ```
59/// use chrono::{NaiveDate, NaiveDateTime};
60///
61/// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2016, 7, 8).unwrap().and_hms_opt(9, 10, 11).unwrap();
62/// # let _ = dt;
63/// ```
64///
65/// You can use typical [date-like](Datelike) and [time-like](Timelike) methods,
66/// provided that relevant traits are in the scope.
67///
68/// ```
69/// # use chrono::{NaiveDate, NaiveDateTime};
70/// # let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2016, 7, 8).unwrap().and_hms_opt(9, 10, 11).unwrap();
71/// use chrono::{Datelike, Timelike, Weekday};
72///
73/// assert_eq!(dt.weekday(), Weekday::Fri);
74/// assert_eq!(dt.num_seconds_from_midnight(), 33011);
75/// ```
76#[derive(PartialEq, Eq, Hash, PartialOrd, Ord, Copy, Clone)]
77#[cfg_attr(
78 any(feature = "rkyv", feature = "rkyv-16", feature = "rkyv-32", feature = "rkyv-64"),
79 derive(Archive, Deserialize, Serialize),
80 archive(compare(PartialEq, PartialOrd)),
81 archive_attr(derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash))
82)]
83#[cfg_attr(feature = "rkyv-validation", archive(check_bytes))]
84#[cfg_attr(all(feature = "arbitrary", feature = "std"), derive(arbitrary::Arbitrary))]
85pub struct NaiveDateTime {
86 date: NaiveDate,
87 time: NaiveTime,
88}
89
90impl NaiveDateTime {
91 /// Makes a new `NaiveDateTime` from date and time components.
92 /// Equivalent to [`date.and_time(time)`](./struct.NaiveDate.html#method.and_time)
93 /// and many other helper constructors on `NaiveDate`.
94 ///
95 /// # Example
96 ///
97 /// ```
98 /// use chrono::{NaiveDate, NaiveTime, NaiveDateTime};
99 ///
100 /// let d = NaiveDate::from_ymd_opt(2015, 6, 3).unwrap();
101 /// let t = NaiveTime::from_hms_milli_opt(12, 34, 56, 789).unwrap();
102 ///
103 /// let dt = NaiveDateTime::new(d, t);
104 /// assert_eq!(dt.date(), d);
105 /// assert_eq!(dt.time(), t);
106 /// ```
107 #[inline]
108 pub const fn new(date: NaiveDate, time: NaiveTime) -> NaiveDateTime {
109 NaiveDateTime { date, time }
110 }
111
112 /// Makes a new `NaiveDateTime` corresponding to a UTC date and time,
113 /// from the number of non-leap seconds
114 /// since the midnight UTC on January 1, 1970 (aka "UNIX timestamp")
115 /// and the number of nanoseconds since the last whole non-leap second.
116 ///
117 /// For a non-naive version of this function see [`TimeZone::timestamp`].
118 ///
119 /// The nanosecond part can exceed 1,000,000,000 in order to represent a
120 /// [leap second](NaiveTime#leap-second-handling), but only when `secs % 60 == 59`.
121 /// (The true "UNIX timestamp" cannot represent a leap second unambiguously.)
122 ///
123 /// # Panics
124 ///
125 /// Panics if the number of seconds would be out of range for a `NaiveDateTime` (more than
126 /// ca. 262,000 years away from common era), and panics on an invalid nanosecond (2 seconds or
127 /// more).
128 #[deprecated(since = "0.4.23", note = "use `from_timestamp_opt()` instead")]
129 #[inline]
130 #[must_use]
131 pub const fn from_timestamp(secs: i64, nsecs: u32) -> NaiveDateTime {
132 let datetime = NaiveDateTime::from_timestamp_opt(secs, nsecs);
133 expect!(datetime, "invalid or out-of-range datetime")
134 }
135
136 /// Creates a new [NaiveDateTime] from milliseconds since the UNIX epoch.
137 ///
138 /// The UNIX epoch starts on midnight, January 1, 1970, UTC.
139 ///
140 /// # Errors
141 ///
142 /// Returns `None` if the number of milliseconds would be out of range for a `NaiveDateTime`
143 /// (more than ca. 262,000 years away from common era)
144 ///
145 /// # Example
146 ///
147 /// ```
148 /// use chrono::NaiveDateTime;
149 /// let timestamp_millis: i64 = 1662921288000; //Sunday, September 11, 2022 6:34:48 PM
150 /// let naive_datetime = NaiveDateTime::from_timestamp_millis(timestamp_millis);
151 /// assert!(naive_datetime.is_some());
152 /// assert_eq!(timestamp_millis, naive_datetime.unwrap().timestamp_millis());
153 ///
154 /// // Negative timestamps (before the UNIX epoch) are supported as well.
155 /// let timestamp_millis: i64 = -2208936075000; //Mon Jan 01 1900 14:38:45 GMT+0000
156 /// let naive_datetime = NaiveDateTime::from_timestamp_millis(timestamp_millis);
157 /// assert!(naive_datetime.is_some());
158 /// assert_eq!(timestamp_millis, naive_datetime.unwrap().timestamp_millis());
159 /// ```
160 #[inline]
161 #[must_use]
162 pub const fn from_timestamp_millis(millis: i64) -> Option<NaiveDateTime> {
163 let secs = millis.div_euclid(1000);
164 let nsecs = millis.rem_euclid(1000) as u32 * 1_000_000;
165 NaiveDateTime::from_timestamp_opt(secs, nsecs)
166 }
167
168 /// Creates a new [NaiveDateTime] from microseconds since the UNIX epoch.
169 ///
170 /// The UNIX epoch starts on midnight, January 1, 1970, UTC.
171 ///
172 /// # Errors
173 ///
174 /// Returns `None` if the number of microseconds would be out of range for a `NaiveDateTime`
175 /// (more than ca. 262,000 years away from common era)
176 ///
177 /// # Example
178 ///
179 /// ```
180 /// use chrono::NaiveDateTime;
181 /// let timestamp_micros: i64 = 1662921288000000; //Sunday, September 11, 2022 6:34:48 PM
182 /// let naive_datetime = NaiveDateTime::from_timestamp_micros(timestamp_micros);
183 /// assert!(naive_datetime.is_some());
184 /// assert_eq!(timestamp_micros, naive_datetime.unwrap().timestamp_micros());
185 ///
186 /// // Negative timestamps (before the UNIX epoch) are supported as well.
187 /// let timestamp_micros: i64 = -2208936075000000; //Mon Jan 01 1900 14:38:45 GMT+0000
188 /// let naive_datetime = NaiveDateTime::from_timestamp_micros(timestamp_micros);
189 /// assert!(naive_datetime.is_some());
190 /// assert_eq!(timestamp_micros, naive_datetime.unwrap().timestamp_micros());
191 /// ```
192 #[inline]
193 #[must_use]
194 pub const fn from_timestamp_micros(micros: i64) -> Option<NaiveDateTime> {
195 let secs = micros.div_euclid(1_000_000);
196 let nsecs = micros.rem_euclid(1_000_000) as u32 * 1000;
197 NaiveDateTime::from_timestamp_opt(secs, nsecs)
198 }
199
200 /// Creates a new [NaiveDateTime] from nanoseconds since the UNIX epoch.
201 ///
202 /// The UNIX epoch starts on midnight, January 1, 1970, UTC.
203 ///
204 /// # Errors
205 ///
206 /// Returns `None` if the number of nanoseconds would be out of range for a `NaiveDateTime`
207 /// (more than ca. 262,000 years away from common era)
208 ///
209 /// # Example
210 ///
211 /// ```
212 /// use chrono::NaiveDateTime;
213 /// let timestamp_nanos: i64 = 1662921288_000_000_000; //Sunday, September 11, 2022 6:34:48 PM
214 /// let naive_datetime = NaiveDateTime::from_timestamp_nanos(timestamp_nanos);
215 /// assert!(naive_datetime.is_some());
216 /// assert_eq!(timestamp_nanos, naive_datetime.unwrap().timestamp_nanos_opt().unwrap());
217 ///
218 /// // Negative timestamps (before the UNIX epoch) are supported as well.
219 /// let timestamp_nanos: i64 = -2208936075_000_000_000; //Mon Jan 01 1900 14:38:45 GMT+0000
220 /// let naive_datetime = NaiveDateTime::from_timestamp_nanos(timestamp_nanos);
221 /// assert!(naive_datetime.is_some());
222 /// assert_eq!(timestamp_nanos, naive_datetime.unwrap().timestamp_nanos_opt().unwrap());
223 /// ```
224 #[inline]
225 #[must_use]
226 pub const fn from_timestamp_nanos(nanos: i64) -> Option<NaiveDateTime> {
227 let secs = nanos.div_euclid(NANOS_PER_SEC as i64);
228 let nsecs = nanos.rem_euclid(NANOS_PER_SEC as i64) as u32;
229
230 NaiveDateTime::from_timestamp_opt(secs, nsecs)
231 }
232
233 /// Makes a new `NaiveDateTime` corresponding to a UTC date and time,
234 /// from the number of non-leap seconds
235 /// since the midnight UTC on January 1, 1970 (aka "UNIX timestamp")
236 /// and the number of nanoseconds since the last whole non-leap second.
237 ///
238 /// The nanosecond part can exceed 1,000,000,000 in order to represent a
239 /// [leap second](NaiveTime#leap-second-handling), but only when `secs % 60 == 59`.
240 /// (The true "UNIX timestamp" cannot represent a leap second unambiguously.)
241 ///
242 /// # Errors
243 ///
244 /// Returns `None` if the number of seconds would be out of range for a `NaiveDateTime` (more
245 /// than ca. 262,000 years away from common era), and panics on an invalid nanosecond
246 /// (2 seconds or more).
247 ///
248 /// # Example
249 ///
250 /// ```
251 /// use chrono::NaiveDateTime;
252 /// use std::i64;
253 ///
254 /// let from_timestamp_opt = NaiveDateTime::from_timestamp_opt;
255 ///
256 /// assert!(from_timestamp_opt(0, 0).is_some());
257 /// assert!(from_timestamp_opt(0, 999_999_999).is_some());
258 /// assert!(from_timestamp_opt(0, 1_500_000_000).is_none()); // invalid leap second
259 /// assert!(from_timestamp_opt(59, 1_500_000_000).is_some()); // leap second
260 /// assert!(from_timestamp_opt(59, 2_000_000_000).is_none());
261 /// assert!(from_timestamp_opt(i64::MAX, 0).is_none());
262 /// ```
263 #[inline]
264 #[must_use]
265 pub const fn from_timestamp_opt(secs: i64, nsecs: u32) -> Option<NaiveDateTime> {
266 let days = secs.div_euclid(86_400);
267 let secs = secs.rem_euclid(86_400);
268 if days < i32::MIN as i64 || days > i32::MAX as i64 {
269 return None;
270 }
271 let date =
272 NaiveDate::from_num_days_from_ce_opt(try_opt!((days as i32).checked_add(719_163)));
273 let time = NaiveTime::from_num_seconds_from_midnight_opt(secs as u32, nsecs);
274 match (date, time) {
275 (Some(date), Some(time)) => Some(NaiveDateTime { date, time }),
276 (_, _) => None,
277 }
278 }
279
280 /// Parses a string with the specified format string and returns a new `NaiveDateTime`.
281 /// See the [`format::strftime` module](crate::format::strftime)
282 /// on the supported escape sequences.
283 ///
284 /// # Example
285 ///
286 /// ```
287 /// use chrono::{NaiveDateTime, NaiveDate};
288 ///
289 /// let parse_from_str = NaiveDateTime::parse_from_str;
290 ///
291 /// assert_eq!(parse_from_str("2015-09-05 23:56:04", "%Y-%m-%d %H:%M:%S"),
292 /// Ok(NaiveDate::from_ymd_opt(2015, 9, 5).unwrap().and_hms_opt(23, 56, 4).unwrap()));
293 /// assert_eq!(parse_from_str("5sep2015pm012345.6789", "%d%b%Y%p%I%M%S%.f"),
294 /// Ok(NaiveDate::from_ymd_opt(2015, 9, 5).unwrap().and_hms_micro_opt(13, 23, 45, 678_900).unwrap()));
295 /// ```
296 ///
297 /// Offset is ignored for the purpose of parsing.
298 ///
299 /// ```
300 /// # use chrono::{NaiveDateTime, NaiveDate};
301 /// # let parse_from_str = NaiveDateTime::parse_from_str;
302 /// assert_eq!(parse_from_str("2014-5-17T12:34:56+09:30", "%Y-%m-%dT%H:%M:%S%z"),
303 /// Ok(NaiveDate::from_ymd_opt(2014, 5, 17).unwrap().and_hms_opt(12, 34, 56).unwrap()));
304 /// ```
305 ///
306 /// [Leap seconds](./struct.NaiveTime.html#leap-second-handling) are correctly handled by
307 /// treating any time of the form `hh:mm:60` as a leap second.
308 /// (This equally applies to the formatting, so the round trip is possible.)
309 ///
310 /// ```
311 /// # use chrono::{NaiveDateTime, NaiveDate};
312 /// # let parse_from_str = NaiveDateTime::parse_from_str;
313 /// assert_eq!(parse_from_str("2015-07-01 08:59:60.123", "%Y-%m-%d %H:%M:%S%.f"),
314 /// Ok(NaiveDate::from_ymd_opt(2015, 7, 1).unwrap().and_hms_milli_opt(8, 59, 59, 1_123).unwrap()));
315 /// ```
316 ///
317 /// Missing seconds are assumed to be zero,
318 /// but out-of-bound times or insufficient fields are errors otherwise.
319 ///
320 /// ```
321 /// # use chrono::{NaiveDateTime, NaiveDate};
322 /// # let parse_from_str = NaiveDateTime::parse_from_str;
323 /// assert_eq!(parse_from_str("94/9/4 7:15", "%y/%m/%d %H:%M"),
324 /// Ok(NaiveDate::from_ymd_opt(1994, 9, 4).unwrap().and_hms_opt(7, 15, 0).unwrap()));
325 ///
326 /// assert!(parse_from_str("04m33s", "%Mm%Ss").is_err());
327 /// assert!(parse_from_str("94/9/4 12", "%y/%m/%d %H").is_err());
328 /// assert!(parse_from_str("94/9/4 17:60", "%y/%m/%d %H:%M").is_err());
329 /// assert!(parse_from_str("94/9/4 24:00:00", "%y/%m/%d %H:%M:%S").is_err());
330 /// ```
331 ///
332 /// All parsed fields should be consistent to each other, otherwise it's an error.
333 ///
334 /// ```
335 /// # use chrono::NaiveDateTime;
336 /// # let parse_from_str = NaiveDateTime::parse_from_str;
337 /// let fmt = "%Y-%m-%d %H:%M:%S = UNIX timestamp %s";
338 /// assert!(parse_from_str("2001-09-09 01:46:39 = UNIX timestamp 999999999", fmt).is_ok());
339 /// assert!(parse_from_str("1970-01-01 00:00:00 = UNIX timestamp 1", fmt).is_err());
340 /// ```
341 ///
342 /// Years before 1 BCE or after 9999 CE, require an initial sign
343 ///
344 ///```
345 /// # use chrono::NaiveDateTime;
346 /// # let parse_from_str = NaiveDateTime::parse_from_str;
347 /// let fmt = "%Y-%m-%d %H:%M:%S";
348 /// assert!(parse_from_str("10000-09-09 01:46:39", fmt).is_err());
349 /// assert!(parse_from_str("+10000-09-09 01:46:39", fmt).is_ok());
350 ///```
351 pub fn parse_from_str(s: &str, fmt: &str) -> ParseResult<NaiveDateTime> {
352 let mut parsed = Parsed::new();
353 parse(&mut parsed, s, StrftimeItems::new(fmt))?;
354 parsed.to_naive_datetime_with_offset(0) // no offset adjustment
355 }
356
357 /// Parses a string with the specified format string and returns a new `NaiveDateTime`, and a
358 /// slice with the remaining portion of the string.
359 /// See the [`format::strftime` module](crate::format::strftime)
360 /// on the supported escape sequences.
361 ///
362 /// Similar to [`parse_from_str`](#method.parse_from_str).
363 ///
364 /// # Example
365 ///
366 /// ```rust
367 /// # use chrono::{NaiveDate, NaiveDateTime};
368 /// let (datetime, remainder) = NaiveDateTime::parse_and_remainder(
369 /// "2015-02-18 23:16:09 trailing text", "%Y-%m-%d %H:%M:%S").unwrap();
370 /// assert_eq!(
371 /// datetime,
372 /// NaiveDate::from_ymd_opt(2015, 2, 18).unwrap().and_hms_opt(23, 16, 9).unwrap()
373 /// );
374 /// assert_eq!(remainder, " trailing text");
375 /// ```
376 pub fn parse_and_remainder<'a>(s: &'a str, fmt: &str) -> ParseResult<(NaiveDateTime, &'a str)> {
377 let mut parsed = Parsed::new();
378 let remainder = parse_and_remainder(&mut parsed, s, StrftimeItems::new(fmt))?;
379 parsed.to_naive_datetime_with_offset(0).map(|d| (d, remainder)) // no offset adjustment
380 }
381
382 /// Retrieves a date component.
383 ///
384 /// # Example
385 ///
386 /// ```
387 /// use chrono::NaiveDate;
388 ///
389 /// let dt = NaiveDate::from_ymd_opt(2016, 7, 8).unwrap().and_hms_opt(9, 10, 11).unwrap();
390 /// assert_eq!(dt.date(), NaiveDate::from_ymd_opt(2016, 7, 8).unwrap());
391 /// ```
392 #[inline]
393 pub const fn date(&self) -> NaiveDate {
394 self.date
395 }
396
397 /// Retrieves a time component.
398 ///
399 /// # Example
400 ///
401 /// ```
402 /// use chrono::{NaiveDate, NaiveTime};
403 ///
404 /// let dt = NaiveDate::from_ymd_opt(2016, 7, 8).unwrap().and_hms_opt(9, 10, 11).unwrap();
405 /// assert_eq!(dt.time(), NaiveTime::from_hms_opt(9, 10, 11).unwrap());
406 /// ```
407 #[inline]
408 pub const fn time(&self) -> NaiveTime {
409 self.time
410 }
411
412 /// Returns the number of non-leap seconds since the midnight on January 1, 1970.
413 ///
414 /// Note that this does *not* account for the timezone!
415 /// The true "UNIX timestamp" would count seconds since the midnight *UTC* on the epoch.
416 ///
417 /// # Example
418 ///
419 /// ```
420 /// use chrono::NaiveDate;
421 ///
422 /// let dt = NaiveDate::from_ymd_opt(1970, 1, 1).unwrap().and_hms_milli_opt(0, 0, 1, 980).unwrap();
423 /// assert_eq!(dt.timestamp(), 1);
424 ///
425 /// let dt = NaiveDate::from_ymd_opt(2001, 9, 9).unwrap().and_hms_opt(1, 46, 40).unwrap();
426 /// assert_eq!(dt.timestamp(), 1_000_000_000);
427 ///
428 /// let dt = NaiveDate::from_ymd_opt(1969, 12, 31).unwrap().and_hms_opt(23, 59, 59).unwrap();
429 /// assert_eq!(dt.timestamp(), -1);
430 ///
431 /// let dt = NaiveDate::from_ymd_opt(-1, 1, 1).unwrap().and_hms_opt(0, 0, 0).unwrap();
432 /// assert_eq!(dt.timestamp(), -62198755200);
433 /// ```
434 #[inline]
435 #[must_use]
436 pub const fn timestamp(&self) -> i64 {
437 const UNIX_EPOCH_DAY: i64 = 719_163;
438 let gregorian_day = self.date.num_days_from_ce() as i64;
439 let seconds_from_midnight = self.time.num_seconds_from_midnight() as i64;
440 (gregorian_day - UNIX_EPOCH_DAY) * 86_400 + seconds_from_midnight
441 }
442
443 /// Returns the number of non-leap *milliseconds* since midnight on January 1, 1970.
444 ///
445 /// Note that this does *not* account for the timezone!
446 /// The true "UNIX timestamp" would count seconds since the midnight *UTC* on the epoch.
447 ///
448 /// # Example
449 ///
450 /// ```
451 /// use chrono::NaiveDate;
452 ///
453 /// let dt = NaiveDate::from_ymd_opt(1970, 1, 1).unwrap().and_hms_milli_opt(0, 0, 1, 444).unwrap();
454 /// assert_eq!(dt.timestamp_millis(), 1_444);
455 ///
456 /// let dt = NaiveDate::from_ymd_opt(2001, 9, 9).unwrap().and_hms_milli_opt(1, 46, 40, 555).unwrap();
457 /// assert_eq!(dt.timestamp_millis(), 1_000_000_000_555);
458 ///
459 /// let dt = NaiveDate::from_ymd_opt(1969, 12, 31).unwrap().and_hms_milli_opt(23, 59, 59, 100).unwrap();
460 /// assert_eq!(dt.timestamp_millis(), -900);
461 /// ```
462 #[inline]
463 #[must_use]
464 pub const fn timestamp_millis(&self) -> i64 {
465 let as_ms = self.timestamp() * 1000;
466 as_ms + self.timestamp_subsec_millis() as i64
467 }
468
469 /// Returns the number of non-leap *microseconds* since midnight on January 1, 1970.
470 ///
471 /// Note that this does *not* account for the timezone!
472 /// The true "UNIX timestamp" would count seconds since the midnight *UTC* on the epoch.
473 ///
474 /// # Example
475 ///
476 /// ```
477 /// use chrono::NaiveDate;
478 ///
479 /// let dt = NaiveDate::from_ymd_opt(1970, 1, 1).unwrap().and_hms_micro_opt(0, 0, 1, 444).unwrap();
480 /// assert_eq!(dt.timestamp_micros(), 1_000_444);
481 ///
482 /// let dt = NaiveDate::from_ymd_opt(2001, 9, 9).unwrap().and_hms_micro_opt(1, 46, 40, 555).unwrap();
483 /// assert_eq!(dt.timestamp_micros(), 1_000_000_000_000_555);
484 /// ```
485 #[inline]
486 #[must_use]
487 pub const fn timestamp_micros(&self) -> i64 {
488 let as_us = self.timestamp() * 1_000_000;
489 as_us + self.timestamp_subsec_micros() as i64
490 }
491
492 /// Returns the number of non-leap *nanoseconds* since midnight on January 1, 1970.
493 ///
494 /// Note that this does *not* account for the timezone!
495 /// The true "UNIX timestamp" would count seconds since the midnight *UTC* on the epoch.
496 ///
497 /// # Panics
498 ///
499 /// An `i64` with nanosecond precision can span a range of ~584 years. This function panics on
500 /// an out of range `NaiveDateTime`.
501 ///
502 /// The dates that can be represented as nanoseconds are between 1677-09-21T00:12:43.145224192
503 /// and 2262-04-11T23:47:16.854775807.
504 #[deprecated(since = "0.4.31", note = "use `timestamp_nanos_opt()` instead")]
505 #[inline]
506 #[must_use]
507 pub const fn timestamp_nanos(&self) -> i64 {
508 expect!(
509 self.timestamp_nanos_opt(),
510 "value can not be represented in a timestamp with nanosecond precision."
511 )
512 }
513
514 /// Returns the number of non-leap *nanoseconds* since midnight on January 1, 1970.
515 ///
516 /// Note that this does *not* account for the timezone!
517 /// The true "UNIX timestamp" would count seconds since the midnight *UTC* on the epoch.
518 ///
519 /// # Errors
520 ///
521 /// An `i64` with nanosecond precision can span a range of ~584 years. This function returns
522 /// `None` on an out of range `NaiveDateTime`.
523 ///
524 /// The dates that can be represented as nanoseconds are between 1677-09-21T00:12:43.145224192
525 /// and 2262-04-11T23:47:16.854775807.
526 ///
527 /// # Example
528 ///
529 /// ```
530 /// use chrono::{NaiveDate, NaiveDateTime};
531 ///
532 /// let dt = NaiveDate::from_ymd_opt(1970, 1, 1).unwrap().and_hms_nano_opt(0, 0, 1, 444).unwrap();
533 /// assert_eq!(dt.timestamp_nanos_opt(), Some(1_000_000_444));
534 ///
535 /// let dt = NaiveDate::from_ymd_opt(2001, 9, 9).unwrap().and_hms_nano_opt(1, 46, 40, 555).unwrap();
536 ///
537 /// const A_BILLION: i64 = 1_000_000_000;
538 /// let nanos = dt.timestamp_nanos_opt().unwrap();
539 /// assert_eq!(nanos, 1_000_000_000_000_000_555);
540 /// assert_eq!(
541 /// Some(dt),
542 /// NaiveDateTime::from_timestamp_opt(nanos / A_BILLION, (nanos % A_BILLION) as u32)
543 /// );
544 /// ```
545 #[inline]
546 #[must_use]
547 pub const fn timestamp_nanos_opt(&self) -> Option<i64> {
548 let mut timestamp = self.timestamp();
549 let mut timestamp_subsec_nanos = self.timestamp_subsec_nanos() as i64;
550
551 // subsec nanos are always non-negative, however the timestamp itself (both in seconds and in nanos) can be
552 // negative. Now i64::MIN is NOT dividable by 1_000_000_000, so
553 //
554 // (timestamp * 1_000_000_000) + nanos
555 //
556 // may underflow (even when in theory we COULD represent the datetime as i64) because we add the non-negative
557 // nanos AFTER the multiplication. This is fixed by converting the negative case to
558 //
559 // ((timestamp + 1) * 1_000_000_000) + (ns - 1_000_000_000)
560 //
561 // Also see <https://github.com/chronotope/chrono/issues/1289>.
562 if timestamp < 0 && timestamp_subsec_nanos > 0 {
563 timestamp_subsec_nanos -= 1_000_000_000;
564 timestamp += 1;
565 }
566
567 try_opt!(timestamp.checked_mul(1_000_000_000)).checked_add(timestamp_subsec_nanos)
568 }
569
570 /// Returns the number of milliseconds since the last whole non-leap second.
571 ///
572 /// The return value ranges from 0 to 999,
573 /// or for [leap seconds](./struct.NaiveTime.html#leap-second-handling), to 1,999.
574 ///
575 /// # Example
576 ///
577 /// ```
578 /// use chrono::NaiveDate;
579 ///
580 /// let dt = NaiveDate::from_ymd_opt(2016, 7, 8).unwrap().and_hms_nano_opt(9, 10, 11, 123_456_789).unwrap();
581 /// assert_eq!(dt.timestamp_subsec_millis(), 123);
582 ///
583 /// let dt = NaiveDate::from_ymd_opt(2015, 7, 1).unwrap().and_hms_nano_opt(8, 59, 59, 1_234_567_890).unwrap();
584 /// assert_eq!(dt.timestamp_subsec_millis(), 1_234);
585 /// ```
586 #[inline]
587 #[must_use]
588 pub const fn timestamp_subsec_millis(&self) -> u32 {
589 self.timestamp_subsec_nanos() / 1_000_000
590 }
591
592 /// Returns the number of microseconds since the last whole non-leap second.
593 ///
594 /// The return value ranges from 0 to 999,999,
595 /// or for [leap seconds](./struct.NaiveTime.html#leap-second-handling), to 1,999,999.
596 ///
597 /// # Example
598 ///
599 /// ```
600 /// use chrono::NaiveDate;
601 ///
602 /// let dt = NaiveDate::from_ymd_opt(2016, 7, 8).unwrap().and_hms_nano_opt(9, 10, 11, 123_456_789).unwrap();
603 /// assert_eq!(dt.timestamp_subsec_micros(), 123_456);
604 ///
605 /// let dt = NaiveDate::from_ymd_opt(2015, 7, 1).unwrap().and_hms_nano_opt(8, 59, 59, 1_234_567_890).unwrap();
606 /// assert_eq!(dt.timestamp_subsec_micros(), 1_234_567);
607 /// ```
608 #[inline]
609 #[must_use]
610 pub const fn timestamp_subsec_micros(&self) -> u32 {
611 self.timestamp_subsec_nanos() / 1_000
612 }
613
614 /// Returns the number of nanoseconds since the last whole non-leap second.
615 ///
616 /// The return value ranges from 0 to 999,999,999,
617 /// or for [leap seconds](./struct.NaiveTime.html#leap-second-handling), to 1,999,999,999.
618 ///
619 /// # Example
620 ///
621 /// ```
622 /// use chrono::NaiveDate;
623 ///
624 /// let dt = NaiveDate::from_ymd_opt(2016, 7, 8).unwrap().and_hms_nano_opt(9, 10, 11, 123_456_789).unwrap();
625 /// assert_eq!(dt.timestamp_subsec_nanos(), 123_456_789);
626 ///
627 /// let dt = NaiveDate::from_ymd_opt(2015, 7, 1).unwrap().and_hms_nano_opt(8, 59, 59, 1_234_567_890).unwrap();
628 /// assert_eq!(dt.timestamp_subsec_nanos(), 1_234_567_890);
629 /// ```
630 #[inline]
631 #[must_use]
632 pub const fn timestamp_subsec_nanos(&self) -> u32 {
633 self.time.nanosecond()
634 }
635
636 /// Adds given `TimeDelta` to the current date and time.
637 ///
638 /// As a part of Chrono's [leap second handling](./struct.NaiveTime.html#leap-second-handling),
639 /// the addition assumes that **there is no leap second ever**,
640 /// except when the `NaiveDateTime` itself represents a leap second
641 /// in which case the assumption becomes that **there is exactly a single leap second ever**.
642 ///
643 /// # Errors
644 ///
645 /// Returns `None` if the resulting date would be out of range.
646 ///
647 /// # Example
648 ///
649 /// ```
650 /// use chrono::{TimeDelta, NaiveDate};
651 ///
652 /// let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
653 ///
654 /// let d = from_ymd(2016, 7, 8);
655 /// let hms = |h, m, s| d.and_hms_opt(h, m, s).unwrap();
656 /// assert_eq!(hms(3, 5, 7).checked_add_signed(TimeDelta::zero()),
657 /// Some(hms(3, 5, 7)));
658 /// assert_eq!(hms(3, 5, 7).checked_add_signed(TimeDelta::seconds(1)),
659 /// Some(hms(3, 5, 8)));
660 /// assert_eq!(hms(3, 5, 7).checked_add_signed(TimeDelta::seconds(-1)),
661 /// Some(hms(3, 5, 6)));
662 /// assert_eq!(hms(3, 5, 7).checked_add_signed(TimeDelta::seconds(3600 + 60)),
663 /// Some(hms(4, 6, 7)));
664 /// assert_eq!(hms(3, 5, 7).checked_add_signed(TimeDelta::seconds(86_400)),
665 /// Some(from_ymd(2016, 7, 9).and_hms_opt(3, 5, 7).unwrap()));
666 ///
667 /// let hmsm = |h, m, s, milli| d.and_hms_milli_opt(h, m, s, milli).unwrap();
668 /// assert_eq!(hmsm(3, 5, 7, 980).checked_add_signed(TimeDelta::milliseconds(450)),
669 /// Some(hmsm(3, 5, 8, 430)));
670 /// ```
671 ///
672 /// Overflow returns `None`.
673 ///
674 /// ```
675 /// # use chrono::{TimeDelta, NaiveDate};
676 /// # let hms = |h, m, s| NaiveDate::from_ymd_opt(2016, 7, 8).unwrap().and_hms_opt(h, m, s).unwrap();
677 /// assert_eq!(hms(3, 5, 7).checked_add_signed(TimeDelta::days(1_000_000_000)), None);
678 /// ```
679 ///
680 /// Leap seconds are handled,
681 /// but the addition assumes that it is the only leap second happened.
682 ///
683 /// ```
684 /// # use chrono::{TimeDelta, NaiveDate};
685 /// # let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
686 /// # let hmsm = |h, m, s, milli| from_ymd(2016, 7, 8).and_hms_milli_opt(h, m, s, milli).unwrap();
687 /// let leap = hmsm(3, 5, 59, 1_300);
688 /// assert_eq!(leap.checked_add_signed(TimeDelta::zero()),
689 /// Some(hmsm(3, 5, 59, 1_300)));
690 /// assert_eq!(leap.checked_add_signed(TimeDelta::milliseconds(-500)),
691 /// Some(hmsm(3, 5, 59, 800)));
692 /// assert_eq!(leap.checked_add_signed(TimeDelta::milliseconds(500)),
693 /// Some(hmsm(3, 5, 59, 1_800)));
694 /// assert_eq!(leap.checked_add_signed(TimeDelta::milliseconds(800)),
695 /// Some(hmsm(3, 6, 0, 100)));
696 /// assert_eq!(leap.checked_add_signed(TimeDelta::seconds(10)),
697 /// Some(hmsm(3, 6, 9, 300)));
698 /// assert_eq!(leap.checked_add_signed(TimeDelta::seconds(-10)),
699 /// Some(hmsm(3, 5, 50, 300)));
700 /// assert_eq!(leap.checked_add_signed(TimeDelta::days(1)),
701 /// Some(from_ymd(2016, 7, 9).and_hms_milli_opt(3, 5, 59, 300).unwrap()));
702 /// ```
703 #[must_use]
704 pub const fn checked_add_signed(self, rhs: TimeDelta) -> Option<NaiveDateTime> {
705 let (time, rhs) = self.time.overflowing_add_signed(rhs);
706
707 // early checking to avoid overflow in TimeDelta::seconds
708 if rhs <= (-1 << MAX_SECS_BITS) || rhs >= (1 << MAX_SECS_BITS) {
709 return None;
710 }
711
712 let date = try_opt!(self.date.checked_add_signed(TimeDelta::seconds(rhs)));
713 Some(NaiveDateTime { date, time })
714 }
715
716 /// Adds given `Months` to the current date and time.
717 ///
718 /// Uses the last day of the month if the day does not exist in the resulting month.
719 ///
720 /// # Errors
721 ///
722 /// Returns `None` if the resulting date would be out of range.
723 ///
724 /// # Example
725 ///
726 /// ```
727 /// use chrono::{Months, NaiveDate};
728 ///
729 /// assert_eq!(
730 /// NaiveDate::from_ymd_opt(2014, 1, 1).unwrap().and_hms_opt(1, 0, 0).unwrap()
731 /// .checked_add_months(Months::new(1)),
732 /// Some(NaiveDate::from_ymd_opt(2014, 2, 1).unwrap().and_hms_opt(1, 0, 0).unwrap())
733 /// );
734 ///
735 /// assert_eq!(
736 /// NaiveDate::from_ymd_opt(2014, 1, 1).unwrap().and_hms_opt(1, 0, 0).unwrap()
737 /// .checked_add_months(Months::new(core::i32::MAX as u32 + 1)),
738 /// None
739 /// );
740 /// ```
741 #[must_use]
742 pub const fn checked_add_months(self, rhs: Months) -> Option<NaiveDateTime> {
743 Some(Self { date: try_opt!(self.date.checked_add_months(rhs)), time: self.time })
744 }
745
746 /// Adds given `FixedOffset` to the current datetime.
747 /// Returns `None` if the result would be outside the valid range for [`NaiveDateTime`].
748 ///
749 /// This method is similar to [`checked_add_signed`](#method.checked_add_offset), but preserves
750 /// leap seconds.
751 #[must_use]
752 pub const fn checked_add_offset(self, rhs: FixedOffset) -> Option<NaiveDateTime> {
753 let (time, days) = self.time.overflowing_add_offset(rhs);
754 let date = match days {
755 -1 => try_opt!(self.date.pred_opt()),
756 1 => try_opt!(self.date.succ_opt()),
757 _ => self.date,
758 };
759 Some(NaiveDateTime { date, time })
760 }
761
762 /// Subtracts given `FixedOffset` from the current datetime.
763 /// Returns `None` if the result would be outside the valid range for [`NaiveDateTime`].
764 ///
765 /// This method is similar to [`checked_sub_signed`](#method.checked_sub_signed), but preserves
766 /// leap seconds.
767 pub const fn checked_sub_offset(self, rhs: FixedOffset) -> Option<NaiveDateTime> {
768 let (time, days) = self.time.overflowing_sub_offset(rhs);
769 let date = match days {
770 -1 => try_opt!(self.date.pred_opt()),
771 1 => try_opt!(self.date.succ_opt()),
772 _ => self.date,
773 };
774 Some(NaiveDateTime { date, time })
775 }
776
777 /// Adds given `FixedOffset` to the current datetime.
778 /// The resulting value may be outside the valid range of [`NaiveDateTime`].
779 ///
780 /// This can be useful for intermediate values, but the resulting out-of-range `NaiveDate`
781 /// should not be exposed to library users.
782 #[must_use]
783 pub(crate) fn overflowing_add_offset(self, rhs: FixedOffset) -> NaiveDateTime {
784 let (time, days) = self.time.overflowing_add_offset(rhs);
785 let date = match days {
786 -1 => self.date.pred_opt().unwrap_or(NaiveDate::BEFORE_MIN),
787 1 => self.date.succ_opt().unwrap_or(NaiveDate::AFTER_MAX),
788 _ => self.date,
789 };
790 NaiveDateTime { date, time }
791 }
792
793 /// Subtracts given `FixedOffset` from the current datetime.
794 /// The resulting value may be outside the valid range of [`NaiveDateTime`].
795 ///
796 /// This can be useful for intermediate values, but the resulting out-of-range `NaiveDate`
797 /// should not be exposed to library users.
798 #[must_use]
799 #[allow(unused)] // currently only used in `Local` but not on all platforms
800 pub(crate) fn overflowing_sub_offset(self, rhs: FixedOffset) -> NaiveDateTime {
801 let (time, days) = self.time.overflowing_sub_offset(rhs);
802 let date = match days {
803 -1 => self.date.pred_opt().unwrap_or(NaiveDate::BEFORE_MIN),
804 1 => self.date.succ_opt().unwrap_or(NaiveDate::AFTER_MAX),
805 _ => self.date,
806 };
807 NaiveDateTime { date, time }
808 }
809
810 /// Subtracts given `TimeDelta` from the current date and time.
811 ///
812 /// As a part of Chrono's [leap second handling](./struct.NaiveTime.html#leap-second-handling),
813 /// the subtraction assumes that **there is no leap second ever**,
814 /// except when the `NaiveDateTime` itself represents a leap second
815 /// in which case the assumption becomes that **there is exactly a single leap second ever**.
816 ///
817 /// # Errors
818 ///
819 /// Returns `None` if the resulting date would be out of range.
820 ///
821 /// # Example
822 ///
823 /// ```
824 /// use chrono::{TimeDelta, NaiveDate};
825 ///
826 /// let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
827 ///
828 /// let d = from_ymd(2016, 7, 8);
829 /// let hms = |h, m, s| d.and_hms_opt(h, m, s).unwrap();
830 /// assert_eq!(hms(3, 5, 7).checked_sub_signed(TimeDelta::zero()),
831 /// Some(hms(3, 5, 7)));
832 /// assert_eq!(hms(3, 5, 7).checked_sub_signed(TimeDelta::seconds(1)),
833 /// Some(hms(3, 5, 6)));
834 /// assert_eq!(hms(3, 5, 7).checked_sub_signed(TimeDelta::seconds(-1)),
835 /// Some(hms(3, 5, 8)));
836 /// assert_eq!(hms(3, 5, 7).checked_sub_signed(TimeDelta::seconds(3600 + 60)),
837 /// Some(hms(2, 4, 7)));
838 /// assert_eq!(hms(3, 5, 7).checked_sub_signed(TimeDelta::seconds(86_400)),
839 /// Some(from_ymd(2016, 7, 7).and_hms_opt(3, 5, 7).unwrap()));
840 ///
841 /// let hmsm = |h, m, s, milli| d.and_hms_milli_opt(h, m, s, milli).unwrap();
842 /// assert_eq!(hmsm(3, 5, 7, 450).checked_sub_signed(TimeDelta::milliseconds(670)),
843 /// Some(hmsm(3, 5, 6, 780)));
844 /// ```
845 ///
846 /// Overflow returns `None`.
847 ///
848 /// ```
849 /// # use chrono::{TimeDelta, NaiveDate};
850 /// # let hms = |h, m, s| NaiveDate::from_ymd_opt(2016, 7, 8).unwrap().and_hms_opt(h, m, s).unwrap();
851 /// assert_eq!(hms(3, 5, 7).checked_sub_signed(TimeDelta::days(1_000_000_000)), None);
852 /// ```
853 ///
854 /// Leap seconds are handled,
855 /// but the subtraction assumes that it is the only leap second happened.
856 ///
857 /// ```
858 /// # use chrono::{TimeDelta, NaiveDate};
859 /// # let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
860 /// # let hmsm = |h, m, s, milli| from_ymd(2016, 7, 8).and_hms_milli_opt(h, m, s, milli).unwrap();
861 /// let leap = hmsm(3, 5, 59, 1_300);
862 /// assert_eq!(leap.checked_sub_signed(TimeDelta::zero()),
863 /// Some(hmsm(3, 5, 59, 1_300)));
864 /// assert_eq!(leap.checked_sub_signed(TimeDelta::milliseconds(200)),
865 /// Some(hmsm(3, 5, 59, 1_100)));
866 /// assert_eq!(leap.checked_sub_signed(TimeDelta::milliseconds(500)),
867 /// Some(hmsm(3, 5, 59, 800)));
868 /// assert_eq!(leap.checked_sub_signed(TimeDelta::seconds(60)),
869 /// Some(hmsm(3, 5, 0, 300)));
870 /// assert_eq!(leap.checked_sub_signed(TimeDelta::days(1)),
871 /// Some(from_ymd(2016, 7, 7).and_hms_milli_opt(3, 6, 0, 300).unwrap()));
872 /// ```
873 #[must_use]
874 pub const fn checked_sub_signed(self, rhs: TimeDelta) -> Option<NaiveDateTime> {
875 let (time, rhs) = self.time.overflowing_sub_signed(rhs);
876
877 // early checking to avoid overflow in TimeDelta::seconds
878 if rhs <= (-1 << MAX_SECS_BITS) || rhs >= (1 << MAX_SECS_BITS) {
879 return None;
880 }
881
882 let date = try_opt!(self.date.checked_sub_signed(TimeDelta::seconds(rhs)));
883 Some(NaiveDateTime { date, time })
884 }
885
886 /// Subtracts given `Months` from the current date and time.
887 ///
888 /// Uses the last day of the month if the day does not exist in the resulting month.
889 ///
890 /// # Errors
891 ///
892 /// Returns `None` if the resulting date would be out of range.
893 ///
894 /// # Example
895 ///
896 /// ```
897 /// use chrono::{Months, NaiveDate};
898 ///
899 /// assert_eq!(
900 /// NaiveDate::from_ymd_opt(2014, 1, 1).unwrap().and_hms_opt(1, 0, 0).unwrap()
901 /// .checked_sub_months(Months::new(1)),
902 /// Some(NaiveDate::from_ymd_opt(2013, 12, 1).unwrap().and_hms_opt(1, 0, 0).unwrap())
903 /// );
904 ///
905 /// assert_eq!(
906 /// NaiveDate::from_ymd_opt(2014, 1, 1).unwrap().and_hms_opt(1, 0, 0).unwrap()
907 /// .checked_sub_months(Months::new(core::i32::MAX as u32 + 1)),
908 /// None
909 /// );
910 /// ```
911 #[must_use]
912 pub const fn checked_sub_months(self, rhs: Months) -> Option<NaiveDateTime> {
913 Some(Self { date: try_opt!(self.date.checked_sub_months(rhs)), time: self.time })
914 }
915
916 /// Add a duration in [`Days`] to the date part of the `NaiveDateTime`
917 ///
918 /// Returns `None` if the resulting date would be out of range.
919 #[must_use]
920 pub const fn checked_add_days(self, days: Days) -> Option<Self> {
921 Some(Self { date: try_opt!(self.date.checked_add_days(days)), ..self })
922 }
923
924 /// Subtract a duration in [`Days`] from the date part of the `NaiveDateTime`
925 ///
926 /// Returns `None` if the resulting date would be out of range.
927 #[must_use]
928 pub const fn checked_sub_days(self, days: Days) -> Option<Self> {
929 Some(Self { date: try_opt!(self.date.checked_sub_days(days)), ..self })
930 }
931
932 /// Subtracts another `NaiveDateTime` from the current date and time.
933 /// This does not overflow or underflow at all.
934 ///
935 /// As a part of Chrono's [leap second handling](./struct.NaiveTime.html#leap-second-handling),
936 /// the subtraction assumes that **there is no leap second ever**,
937 /// except when any of the `NaiveDateTime`s themselves represents a leap second
938 /// in which case the assumption becomes that
939 /// **there are exactly one (or two) leap second(s) ever**.
940 ///
941 /// # Example
942 ///
943 /// ```
944 /// use chrono::{TimeDelta, NaiveDate};
945 ///
946 /// let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
947 ///
948 /// let d = from_ymd(2016, 7, 8);
949 /// assert_eq!(d.and_hms_opt(3, 5, 7).unwrap().signed_duration_since(d.and_hms_opt(2, 4, 6).unwrap()),
950 /// TimeDelta::seconds(3600 + 60 + 1));
951 ///
952 /// // July 8 is 190th day in the year 2016
953 /// let d0 = from_ymd(2016, 1, 1);
954 /// assert_eq!(d.and_hms_milli_opt(0, 7, 6, 500).unwrap().signed_duration_since(d0.and_hms_opt(0, 0, 0).unwrap()),
955 /// TimeDelta::seconds(189 * 86_400 + 7 * 60 + 6) + TimeDelta::milliseconds(500));
956 /// ```
957 ///
958 /// Leap seconds are handled, but the subtraction assumes that
959 /// there were no other leap seconds happened.
960 ///
961 /// ```
962 /// # use chrono::{TimeDelta, NaiveDate};
963 /// # let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
964 /// let leap = from_ymd(2015, 6, 30).and_hms_milli_opt(23, 59, 59, 1_500).unwrap();
965 /// assert_eq!(leap.signed_duration_since(from_ymd(2015, 6, 30).and_hms_opt(23, 0, 0).unwrap()),
966 /// TimeDelta::seconds(3600) + TimeDelta::milliseconds(500));
967 /// assert_eq!(from_ymd(2015, 7, 1).and_hms_opt(1, 0, 0).unwrap().signed_duration_since(leap),
968 /// TimeDelta::seconds(3600) - TimeDelta::milliseconds(500));
969 /// ```
970 #[must_use]
971 pub const fn signed_duration_since(self, rhs: NaiveDateTime) -> TimeDelta {
972 expect!(
973 self.date
974 .signed_duration_since(rhs.date)
975 .checked_add(&self.time.signed_duration_since(rhs.time)),
976 "always in range"
977 )
978 }
979
980 /// Formats the combined date and time with the specified formatting items.
981 /// Otherwise it is the same as the ordinary [`format`](#method.format) method.
982 ///
983 /// The `Iterator` of items should be `Clone`able,
984 /// since the resulting `DelayedFormat` value may be formatted multiple times.
985 ///
986 /// # Example
987 ///
988 /// ```
989 /// use chrono::NaiveDate;
990 /// use chrono::format::strftime::StrftimeItems;
991 ///
992 /// let fmt = StrftimeItems::new("%Y-%m-%d %H:%M:%S");
993 /// let dt = NaiveDate::from_ymd_opt(2015, 9, 5).unwrap().and_hms_opt(23, 56, 4).unwrap();
994 /// assert_eq!(dt.format_with_items(fmt.clone()).to_string(), "2015-09-05 23:56:04");
995 /// assert_eq!(dt.format("%Y-%m-%d %H:%M:%S").to_string(), "2015-09-05 23:56:04");
996 /// ```
997 ///
998 /// The resulting `DelayedFormat` can be formatted directly via the `Display` trait.
999 ///
1000 /// ```
1001 /// # use chrono::NaiveDate;
1002 /// # use chrono::format::strftime::StrftimeItems;
1003 /// # let fmt = StrftimeItems::new("%Y-%m-%d %H:%M:%S").clone();
1004 /// # let dt = NaiveDate::from_ymd_opt(2015, 9, 5).unwrap().and_hms_opt(23, 56, 4).unwrap();
1005 /// assert_eq!(format!("{}", dt.format_with_items(fmt)), "2015-09-05 23:56:04");
1006 /// ```
1007 #[cfg(feature = "alloc")]
1008 #[inline]
1009 #[must_use]
1010 pub fn format_with_items<'a, I, B>(&self, items: I) -> DelayedFormat<I>
1011 where
1012 I: Iterator<Item = B> + Clone,
1013 B: Borrow<Item<'a>>,
1014 {
1015 DelayedFormat::new(Some(self.date), Some(self.time), items)
1016 }
1017
1018 /// Formats the combined date and time with the specified format string.
1019 /// See the [`format::strftime` module](crate::format::strftime)
1020 /// on the supported escape sequences.
1021 ///
1022 /// This returns a `DelayedFormat`,
1023 /// which gets converted to a string only when actual formatting happens.
1024 /// You may use the `to_string` method to get a `String`,
1025 /// or just feed it into `print!` and other formatting macros.
1026 /// (In this way it avoids the redundant memory allocation.)
1027 ///
1028 /// A wrong format string does *not* issue an error immediately.
1029 /// Rather, converting or formatting the `DelayedFormat` fails.
1030 /// You are recommended to immediately use `DelayedFormat` for this reason.
1031 ///
1032 /// # Example
1033 ///
1034 /// ```
1035 /// use chrono::NaiveDate;
1036 ///
1037 /// let dt = NaiveDate::from_ymd_opt(2015, 9, 5).unwrap().and_hms_opt(23, 56, 4).unwrap();
1038 /// assert_eq!(dt.format("%Y-%m-%d %H:%M:%S").to_string(), "2015-09-05 23:56:04");
1039 /// assert_eq!(dt.format("around %l %p on %b %-d").to_string(), "around 11 PM on Sep 5");
1040 /// ```
1041 ///
1042 /// The resulting `DelayedFormat` can be formatted directly via the `Display` trait.
1043 ///
1044 /// ```
1045 /// # use chrono::NaiveDate;
1046 /// # let dt = NaiveDate::from_ymd_opt(2015, 9, 5).unwrap().and_hms_opt(23, 56, 4).unwrap();
1047 /// assert_eq!(format!("{}", dt.format("%Y-%m-%d %H:%M:%S")), "2015-09-05 23:56:04");
1048 /// assert_eq!(format!("{}", dt.format("around %l %p on %b %-d")), "around 11 PM on Sep 5");
1049 /// ```
1050 #[cfg(feature = "alloc")]
1051 #[inline]
1052 #[must_use]
1053 pub fn format<'a>(&self, fmt: &'a str) -> DelayedFormat<StrftimeItems<'a>> {
1054 self.format_with_items(StrftimeItems::new(fmt))
1055 }
1056
1057 /// Converts the `NaiveDateTime` into the timezone-aware `DateTime<Tz>`
1058 /// with the provided timezone, if possible.
1059 ///
1060 /// This can fail in cases where the local time represented by the `NaiveDateTime`
1061 /// is not a valid local timestamp in the target timezone due to an offset transition
1062 /// for example if the target timezone had a change from +00:00 to +01:00
1063 /// occuring at 2015-09-05 22:59:59, then a local time of 2015-09-05 23:56:04
1064 /// could never occur. Similarly, if the offset transitioned in the opposite direction
1065 /// then there would be two local times of 2015-09-05 23:56:04, one at +00:00 and one
1066 /// at +01:00.
1067 ///
1068 /// # Example
1069 ///
1070 /// ```
1071 /// use chrono::{NaiveDate, FixedOffset};
1072 /// let hour = 3600;
1073 /// let tz = FixedOffset::east_opt(5 * hour).unwrap();
1074 /// let dt = NaiveDate::from_ymd_opt(2015, 9, 5).unwrap().and_hms_opt(23, 56, 4).unwrap().and_local_timezone(tz).unwrap();
1075 /// assert_eq!(dt.timezone(), tz);
1076 /// ```
1077 #[must_use]
1078 pub fn and_local_timezone<Tz: TimeZone>(&self, tz: Tz) -> LocalResult<DateTime<Tz>> {
1079 tz.from_local_datetime(self)
1080 }
1081
1082 /// Converts the `NaiveDateTime` into the timezone-aware `DateTime<Utc>`.
1083 ///
1084 /// # Example
1085 ///
1086 /// ```
1087 /// use chrono::{NaiveDate, Utc};
1088 /// let dt = NaiveDate::from_ymd_opt(2023, 1, 30).unwrap().and_hms_opt(19, 32, 33).unwrap().and_utc();
1089 /// assert_eq!(dt.timezone(), Utc);
1090 /// ```
1091 #[must_use]
1092 pub const fn and_utc(&self) -> DateTime<Utc> {
1093 DateTime::from_naive_utc_and_offset(*self, Utc)
1094 }
1095
1096 /// The minimum possible `NaiveDateTime`.
1097 pub const MIN: Self = Self { date: NaiveDate::MIN, time: NaiveTime::MIN };
1098
1099 /// The maximum possible `NaiveDateTime`.
1100 pub const MAX: Self = Self { date: NaiveDate::MAX, time: NaiveTime::MAX };
1101
1102 /// The Unix Epoch, 1970-01-01 00:00:00.
1103 pub const UNIX_EPOCH: Self =
1104 expect!(NaiveDate::from_ymd_opt(1970, 1, 1), "").and_time(NaiveTime::MIN);
1105}
1106
1107impl From<NaiveDate> for NaiveDateTime {
1108 /// Converts a `NaiveDate` to a `NaiveDateTime` of the same date but at midnight.
1109 ///
1110 /// # Example
1111 ///
1112 /// ```
1113 /// use chrono::{NaiveDate, NaiveDateTime};
1114 ///
1115 /// let nd = NaiveDate::from_ymd_opt(2016, 5, 28).unwrap();
1116 /// let ndt = NaiveDate::from_ymd_opt(2016, 5, 28).unwrap().and_hms_opt(0, 0, 0).unwrap();
1117 /// assert_eq!(ndt, NaiveDateTime::from(nd));
1118 fn from(date: NaiveDate) -> Self {
1119 date.and_hms_opt(0, 0, 0).unwrap()
1120 }
1121}
1122
1123impl Datelike for NaiveDateTime {
1124 /// Returns the year number in the [calendar date](./struct.NaiveDate.html#calendar-date).
1125 ///
1126 /// See also the [`NaiveDate::year`](./struct.NaiveDate.html#method.year) method.
1127 ///
1128 /// # Example
1129 ///
1130 /// ```
1131 /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
1132 ///
1133 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
1134 /// assert_eq!(dt.year(), 2015);
1135 /// ```
1136 #[inline]
1137 fn year(&self) -> i32 {
1138 self.date.year()
1139 }
1140
1141 /// Returns the month number starting from 1.
1142 ///
1143 /// The return value ranges from 1 to 12.
1144 ///
1145 /// See also the [`NaiveDate::month`](./struct.NaiveDate.html#method.month) method.
1146 ///
1147 /// # Example
1148 ///
1149 /// ```
1150 /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
1151 ///
1152 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
1153 /// assert_eq!(dt.month(), 9);
1154 /// ```
1155 #[inline]
1156 fn month(&self) -> u32 {
1157 self.date.month()
1158 }
1159
1160 /// Returns the month number starting from 0.
1161 ///
1162 /// The return value ranges from 0 to 11.
1163 ///
1164 /// See also the [`NaiveDate::month0`] method.
1165 ///
1166 /// # Example
1167 ///
1168 /// ```
1169 /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
1170 ///
1171 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
1172 /// assert_eq!(dt.month0(), 8);
1173 /// ```
1174 #[inline]
1175 fn month0(&self) -> u32 {
1176 self.date.month0()
1177 }
1178
1179 /// Returns the day of month starting from 1.
1180 ///
1181 /// The return value ranges from 1 to 31. (The last day of month differs by months.)
1182 ///
1183 /// See also the [`NaiveDate::day`](./struct.NaiveDate.html#method.day) method.
1184 ///
1185 /// # Example
1186 ///
1187 /// ```
1188 /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
1189 ///
1190 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
1191 /// assert_eq!(dt.day(), 25);
1192 /// ```
1193 #[inline]
1194 fn day(&self) -> u32 {
1195 self.date.day()
1196 }
1197
1198 /// Returns the day of month starting from 0.
1199 ///
1200 /// The return value ranges from 0 to 30. (The last day of month differs by months.)
1201 ///
1202 /// See also the [`NaiveDate::day0`] method.
1203 ///
1204 /// # Example
1205 ///
1206 /// ```
1207 /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
1208 ///
1209 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
1210 /// assert_eq!(dt.day0(), 24);
1211 /// ```
1212 #[inline]
1213 fn day0(&self) -> u32 {
1214 self.date.day0()
1215 }
1216
1217 /// Returns the day of year starting from 1.
1218 ///
1219 /// The return value ranges from 1 to 366. (The last day of year differs by years.)
1220 ///
1221 /// See also the [`NaiveDate::ordinal`](./struct.NaiveDate.html#method.ordinal) method.
1222 ///
1223 /// # Example
1224 ///
1225 /// ```
1226 /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
1227 ///
1228 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
1229 /// assert_eq!(dt.ordinal(), 268);
1230 /// ```
1231 #[inline]
1232 fn ordinal(&self) -> u32 {
1233 self.date.ordinal()
1234 }
1235
1236 /// Returns the day of year starting from 0.
1237 ///
1238 /// The return value ranges from 0 to 365. (The last day of year differs by years.)
1239 ///
1240 /// See also the [`NaiveDate::ordinal0`] method.
1241 ///
1242 /// # Example
1243 ///
1244 /// ```
1245 /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
1246 ///
1247 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
1248 /// assert_eq!(dt.ordinal0(), 267);
1249 /// ```
1250 #[inline]
1251 fn ordinal0(&self) -> u32 {
1252 self.date.ordinal0()
1253 }
1254
1255 /// Returns the day of week.
1256 ///
1257 /// See also the [`NaiveDate::weekday`](./struct.NaiveDate.html#method.weekday) method.
1258 ///
1259 /// # Example
1260 ///
1261 /// ```
1262 /// use chrono::{NaiveDate, NaiveDateTime, Datelike, Weekday};
1263 ///
1264 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
1265 /// assert_eq!(dt.weekday(), Weekday::Fri);
1266 /// ```
1267 #[inline]
1268 fn weekday(&self) -> Weekday {
1269 self.date.weekday()
1270 }
1271
1272 #[inline]
1273 fn iso_week(&self) -> IsoWeek {
1274 self.date.iso_week()
1275 }
1276
1277 /// Makes a new `NaiveDateTime` with the year number changed, while keeping the same month and
1278 /// day.
1279 ///
1280 /// See also the [`NaiveDate::with_year`] method.
1281 ///
1282 /// # Errors
1283 ///
1284 /// Returns `None` if the resulting date does not exist, or when the `NaiveDateTime` would be
1285 /// out of range.
1286 ///
1287 /// # Example
1288 ///
1289 /// ```
1290 /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
1291 ///
1292 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
1293 /// assert_eq!(dt.with_year(2016), Some(NaiveDate::from_ymd_opt(2016, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap()));
1294 /// assert_eq!(dt.with_year(-308), Some(NaiveDate::from_ymd_opt(-308, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap()));
1295 /// ```
1296 #[inline]
1297 fn with_year(&self, year: i32) -> Option<NaiveDateTime> {
1298 self.date.with_year(year).map(|d| NaiveDateTime { date: d, ..*self })
1299 }
1300
1301 /// Makes a new `NaiveDateTime` with the month number (starting from 1) changed.
1302 ///
1303 /// See also the [`NaiveDate::with_month`] method.
1304 ///
1305 /// # Errors
1306 ///
1307 /// Returns `None` if the resulting date does not exist, or if the value for `month` is invalid.
1308 ///
1309 /// # Example
1310 ///
1311 /// ```
1312 /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
1313 ///
1314 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 30).unwrap().and_hms_opt(12, 34, 56).unwrap();
1315 /// assert_eq!(dt.with_month(10), Some(NaiveDate::from_ymd_opt(2015, 10, 30).unwrap().and_hms_opt(12, 34, 56).unwrap()));
1316 /// assert_eq!(dt.with_month(13), None); // no month 13
1317 /// assert_eq!(dt.with_month(2), None); // no February 30
1318 /// ```
1319 #[inline]
1320 fn with_month(&self, month: u32) -> Option<NaiveDateTime> {
1321 self.date.with_month(month).map(|d| NaiveDateTime { date: d, ..*self })
1322 }
1323
1324 /// Makes a new `NaiveDateTime` with the month number (starting from 0) changed.
1325 ///
1326 /// See also the [`NaiveDate::with_month0`] method.
1327 ///
1328 /// # Errors
1329 ///
1330 /// Returns `None` if the resulting date does not exist, or if the value for `month0` is
1331 /// invalid.
1332 ///
1333 /// # Example
1334 ///
1335 /// ```
1336 /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
1337 ///
1338 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 30).unwrap().and_hms_opt(12, 34, 56).unwrap();
1339 /// assert_eq!(dt.with_month0(9), Some(NaiveDate::from_ymd_opt(2015, 10, 30).unwrap().and_hms_opt(12, 34, 56).unwrap()));
1340 /// assert_eq!(dt.with_month0(12), None); // no month 13
1341 /// assert_eq!(dt.with_month0(1), None); // no February 30
1342 /// ```
1343 #[inline]
1344 fn with_month0(&self, month0: u32) -> Option<NaiveDateTime> {
1345 self.date.with_month0(month0).map(|d| NaiveDateTime { date: d, ..*self })
1346 }
1347
1348 /// Makes a new `NaiveDateTime` with the day of month (starting from 1) changed.
1349 ///
1350 /// See also the [`NaiveDate::with_day`] method.
1351 ///
1352 /// # Errors
1353 ///
1354 /// Returns `None` if the resulting date does not exist, or if the value for `day` is invalid.
1355 ///
1356 /// # Example
1357 ///
1358 /// ```
1359 /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
1360 ///
1361 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_opt(12, 34, 56).unwrap();
1362 /// assert_eq!(dt.with_day(30), Some(NaiveDate::from_ymd_opt(2015, 9, 30).unwrap().and_hms_opt(12, 34, 56).unwrap()));
1363 /// assert_eq!(dt.with_day(31), None); // no September 31
1364 /// ```
1365 #[inline]
1366 fn with_day(&self, day: u32) -> Option<NaiveDateTime> {
1367 self.date.with_day(day).map(|d| NaiveDateTime { date: d, ..*self })
1368 }
1369
1370 /// Makes a new `NaiveDateTime` with the day of month (starting from 0) changed.
1371 ///
1372 /// See also the [`NaiveDate::with_day0`] method.
1373 ///
1374 /// # Errors
1375 ///
1376 /// Returns `None` if the resulting date does not exist, or if the value for `day0` is invalid.
1377 ///
1378 /// # Example
1379 ///
1380 /// ```
1381 /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
1382 ///
1383 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_opt(12, 34, 56).unwrap();
1384 /// assert_eq!(dt.with_day0(29), Some(NaiveDate::from_ymd_opt(2015, 9, 30).unwrap().and_hms_opt(12, 34, 56).unwrap()));
1385 /// assert_eq!(dt.with_day0(30), None); // no September 31
1386 /// ```
1387 #[inline]
1388 fn with_day0(&self, day0: u32) -> Option<NaiveDateTime> {
1389 self.date.with_day0(day0).map(|d| NaiveDateTime { date: d, ..*self })
1390 }
1391
1392 /// Makes a new `NaiveDateTime` with the day of year (starting from 1) changed.
1393 ///
1394 /// See also the [`NaiveDate::with_ordinal`] method.
1395 ///
1396 /// # Errors
1397 ///
1398 /// Returns `None` if the resulting date does not exist, or if the value for `ordinal` is
1399 /// invalid.
1400 ///
1401 /// # Example
1402 ///
1403 /// ```
1404 /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
1405 ///
1406 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_opt(12, 34, 56).unwrap();
1407 /// assert_eq!(dt.with_ordinal(60),
1408 /// Some(NaiveDate::from_ymd_opt(2015, 3, 1).unwrap().and_hms_opt(12, 34, 56).unwrap()));
1409 /// assert_eq!(dt.with_ordinal(366), None); // 2015 had only 365 days
1410 ///
1411 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2016, 9, 8).unwrap().and_hms_opt(12, 34, 56).unwrap();
1412 /// assert_eq!(dt.with_ordinal(60),
1413 /// Some(NaiveDate::from_ymd_opt(2016, 2, 29).unwrap().and_hms_opt(12, 34, 56).unwrap()));
1414 /// assert_eq!(dt.with_ordinal(366),
1415 /// Some(NaiveDate::from_ymd_opt(2016, 12, 31).unwrap().and_hms_opt(12, 34, 56).unwrap()));
1416 /// ```
1417 #[inline]
1418 fn with_ordinal(&self, ordinal: u32) -> Option<NaiveDateTime> {
1419 self.date.with_ordinal(ordinal).map(|d| NaiveDateTime { date: d, ..*self })
1420 }
1421
1422 /// Makes a new `NaiveDateTime` with the day of year (starting from 0) changed.
1423 ///
1424 /// See also the [`NaiveDate::with_ordinal0`] method.
1425 ///
1426 /// # Errors
1427 ///
1428 /// Returns `None` if the resulting date does not exist, or if the value for `ordinal0` is
1429 /// invalid.
1430 ///
1431 /// # Example
1432 ///
1433 /// ```
1434 /// use chrono::{NaiveDate, NaiveDateTime, Datelike};
1435 ///
1436 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_opt(12, 34, 56).unwrap();
1437 /// assert_eq!(dt.with_ordinal0(59),
1438 /// Some(NaiveDate::from_ymd_opt(2015, 3, 1).unwrap().and_hms_opt(12, 34, 56).unwrap()));
1439 /// assert_eq!(dt.with_ordinal0(365), None); // 2015 had only 365 days
1440 ///
1441 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2016, 9, 8).unwrap().and_hms_opt(12, 34, 56).unwrap();
1442 /// assert_eq!(dt.with_ordinal0(59),
1443 /// Some(NaiveDate::from_ymd_opt(2016, 2, 29).unwrap().and_hms_opt(12, 34, 56).unwrap()));
1444 /// assert_eq!(dt.with_ordinal0(365),
1445 /// Some(NaiveDate::from_ymd_opt(2016, 12, 31).unwrap().and_hms_opt(12, 34, 56).unwrap()));
1446 /// ```
1447 #[inline]
1448 fn with_ordinal0(&self, ordinal0: u32) -> Option<NaiveDateTime> {
1449 self.date.with_ordinal0(ordinal0).map(|d| NaiveDateTime { date: d, ..*self })
1450 }
1451}
1452
1453impl Timelike for NaiveDateTime {
1454 /// Returns the hour number from 0 to 23.
1455 ///
1456 /// See also the [`NaiveTime::hour`] method.
1457 ///
1458 /// # Example
1459 ///
1460 /// ```
1461 /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
1462 ///
1463 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 56, 789).unwrap();
1464 /// assert_eq!(dt.hour(), 12);
1465 /// ```
1466 #[inline]
1467 fn hour(&self) -> u32 {
1468 self.time.hour()
1469 }
1470
1471 /// Returns the minute number from 0 to 59.
1472 ///
1473 /// See also the [`NaiveTime::minute`] method.
1474 ///
1475 /// # Example
1476 ///
1477 /// ```
1478 /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
1479 ///
1480 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 56, 789).unwrap();
1481 /// assert_eq!(dt.minute(), 34);
1482 /// ```
1483 #[inline]
1484 fn minute(&self) -> u32 {
1485 self.time.minute()
1486 }
1487
1488 /// Returns the second number from 0 to 59.
1489 ///
1490 /// See also the [`NaiveTime::second`] method.
1491 ///
1492 /// # Example
1493 ///
1494 /// ```
1495 /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
1496 ///
1497 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 56, 789).unwrap();
1498 /// assert_eq!(dt.second(), 56);
1499 /// ```
1500 #[inline]
1501 fn second(&self) -> u32 {
1502 self.time.second()
1503 }
1504
1505 /// Returns the number of nanoseconds since the whole non-leap second.
1506 /// The range from 1,000,000,000 to 1,999,999,999 represents
1507 /// the [leap second](./struct.NaiveTime.html#leap-second-handling).
1508 ///
1509 /// See also the [`NaiveTime#method.nanosecond`] method.
1510 ///
1511 /// # Example
1512 ///
1513 /// ```
1514 /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
1515 ///
1516 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 56, 789).unwrap();
1517 /// assert_eq!(dt.nanosecond(), 789_000_000);
1518 /// ```
1519 #[inline]
1520 fn nanosecond(&self) -> u32 {
1521 self.time.nanosecond()
1522 }
1523
1524 /// Makes a new `NaiveDateTime` with the hour number changed.
1525 ///
1526 /// See also the [`NaiveTime::with_hour`] method.
1527 ///
1528 /// # Errors
1529 ///
1530 /// Returns `None` if the value for `hour` is invalid.
1531 ///
1532 /// # Example
1533 ///
1534 /// ```
1535 /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
1536 ///
1537 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 56, 789).unwrap();
1538 /// assert_eq!(dt.with_hour(7),
1539 /// Some(NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(7, 34, 56, 789).unwrap()));
1540 /// assert_eq!(dt.with_hour(24), None);
1541 /// ```
1542 #[inline]
1543 fn with_hour(&self, hour: u32) -> Option<NaiveDateTime> {
1544 self.time.with_hour(hour).map(|t| NaiveDateTime { time: t, ..*self })
1545 }
1546
1547 /// Makes a new `NaiveDateTime` with the minute number changed.
1548 ///
1549 /// See also the [`NaiveTime::with_minute`] method.
1550 ///
1551 /// # Errors
1552 ///
1553 /// Returns `None` if the value for `minute` is invalid.
1554 ///
1555 /// # Example
1556 ///
1557 /// ```
1558 /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
1559 ///
1560 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 56, 789).unwrap();
1561 /// assert_eq!(dt.with_minute(45),
1562 /// Some(NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 45, 56, 789).unwrap()));
1563 /// assert_eq!(dt.with_minute(60), None);
1564 /// ```
1565 #[inline]
1566 fn with_minute(&self, min: u32) -> Option<NaiveDateTime> {
1567 self.time.with_minute(min).map(|t| NaiveDateTime { time: t, ..*self })
1568 }
1569
1570 /// Makes a new `NaiveDateTime` with the second number changed.
1571 ///
1572 /// As with the [`second`](#method.second) method,
1573 /// the input range is restricted to 0 through 59.
1574 ///
1575 /// See also the [`NaiveTime::with_second`] method.
1576 ///
1577 /// # Errors
1578 ///
1579 /// Returns `None` if the value for `second` is invalid.
1580 ///
1581 /// # Example
1582 ///
1583 /// ```
1584 /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
1585 ///
1586 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 56, 789).unwrap();
1587 /// assert_eq!(dt.with_second(17),
1588 /// Some(NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 17, 789).unwrap()));
1589 /// assert_eq!(dt.with_second(60), None);
1590 /// ```
1591 #[inline]
1592 fn with_second(&self, sec: u32) -> Option<NaiveDateTime> {
1593 self.time.with_second(sec).map(|t| NaiveDateTime { time: t, ..*self })
1594 }
1595
1596 /// Makes a new `NaiveDateTime` with nanoseconds since the whole non-leap second changed.
1597 ///
1598 /// Returns `None` when the resulting `NaiveDateTime` would be invalid.
1599 /// As with the [`NaiveDateTime::nanosecond`] method,
1600 /// the input range can exceed 1,000,000,000 for leap seconds.
1601 ///
1602 /// See also the [`NaiveTime::with_nanosecond`] method.
1603 ///
1604 /// # Errors
1605 ///
1606 /// Returns `None` if `nanosecond >= 2,000,000,000`.
1607 ///
1608 /// # Example
1609 ///
1610 /// ```
1611 /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
1612 ///
1613 /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 59, 789).unwrap();
1614 /// assert_eq!(dt.with_nanosecond(333_333_333),
1615 /// Some(NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_nano_opt(12, 34, 59, 333_333_333).unwrap()));
1616 /// assert_eq!(dt.with_nanosecond(1_333_333_333), // leap second
1617 /// Some(NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_nano_opt(12, 34, 59, 1_333_333_333).unwrap()));
1618 /// assert_eq!(dt.with_nanosecond(2_000_000_000), None);
1619 /// ```
1620 #[inline]
1621 fn with_nanosecond(&self, nano: u32) -> Option<NaiveDateTime> {
1622 self.time.with_nanosecond(nano).map(|t| NaiveDateTime { time: t, ..*self })
1623 }
1624}
1625
1626/// Add `TimeDelta` to `NaiveDateTime`.
1627///
1628/// As a part of Chrono's [leap second handling], the addition assumes that **there is no leap
1629/// second ever**, except when the `NaiveDateTime` itself represents a leap second in which case
1630/// the assumption becomes that **there is exactly a single leap second ever**.
1631///
1632/// # Panics
1633///
1634/// Panics if the resulting date would be out of range.
1635/// Consider using [`NaiveDateTime::checked_add_signed`] to get an `Option` instead.
1636///
1637/// # Example
1638///
1639/// ```
1640/// use chrono::{TimeDelta, NaiveDate};
1641///
1642/// let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
1643///
1644/// let d = from_ymd(2016, 7, 8);
1645/// let hms = |h, m, s| d.and_hms_opt(h, m, s).unwrap();
1646/// assert_eq!(hms(3, 5, 7) + TimeDelta::zero(), hms(3, 5, 7));
1647/// assert_eq!(hms(3, 5, 7) + TimeDelta::seconds(1), hms(3, 5, 8));
1648/// assert_eq!(hms(3, 5, 7) + TimeDelta::seconds(-1), hms(3, 5, 6));
1649/// assert_eq!(hms(3, 5, 7) + TimeDelta::seconds(3600 + 60), hms(4, 6, 7));
1650/// assert_eq!(hms(3, 5, 7) + TimeDelta::seconds(86_400),
1651/// from_ymd(2016, 7, 9).and_hms_opt(3, 5, 7).unwrap());
1652/// assert_eq!(hms(3, 5, 7) + TimeDelta::days(365),
1653/// from_ymd(2017, 7, 8).and_hms_opt(3, 5, 7).unwrap());
1654///
1655/// let hmsm = |h, m, s, milli| d.and_hms_milli_opt(h, m, s, milli).unwrap();
1656/// assert_eq!(hmsm(3, 5, 7, 980) + TimeDelta::milliseconds(450), hmsm(3, 5, 8, 430));
1657/// ```
1658///
1659/// Leap seconds are handled,
1660/// but the addition assumes that it is the only leap second happened.
1661///
1662/// ```
1663/// # use chrono::{TimeDelta, NaiveDate};
1664/// # let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
1665/// # let hmsm = |h, m, s, milli| from_ymd(2016, 7, 8).and_hms_milli_opt(h, m, s, milli).unwrap();
1666/// let leap = hmsm(3, 5, 59, 1_300);
1667/// assert_eq!(leap + TimeDelta::zero(), hmsm(3, 5, 59, 1_300));
1668/// assert_eq!(leap + TimeDelta::milliseconds(-500), hmsm(3, 5, 59, 800));
1669/// assert_eq!(leap + TimeDelta::milliseconds(500), hmsm(3, 5, 59, 1_800));
1670/// assert_eq!(leap + TimeDelta::milliseconds(800), hmsm(3, 6, 0, 100));
1671/// assert_eq!(leap + TimeDelta::seconds(10), hmsm(3, 6, 9, 300));
1672/// assert_eq!(leap + TimeDelta::seconds(-10), hmsm(3, 5, 50, 300));
1673/// assert_eq!(leap + TimeDelta::days(1),
1674/// from_ymd(2016, 7, 9).and_hms_milli_opt(3, 5, 59, 300).unwrap());
1675/// ```
1676///
1677/// [leap second handling]: crate::NaiveTime#leap-second-handling
1678impl Add<TimeDelta> for NaiveDateTime {
1679 type Output = NaiveDateTime;
1680
1681 #[inline]
1682 fn add(self, rhs: TimeDelta) -> NaiveDateTime {
1683 self.checked_add_signed(rhs).expect("`NaiveDateTime + TimeDelta` overflowed")
1684 }
1685}
1686
1687/// Add `std::time::Duration` to `NaiveDateTime`.
1688///
1689/// As a part of Chrono's [leap second handling], the addition assumes that **there is no leap
1690/// second ever**, except when the `NaiveDateTime` itself represents a leap second in which case
1691/// the assumption becomes that **there is exactly a single leap second ever**.
1692///
1693/// # Panics
1694///
1695/// Panics if the resulting date would be out of range.
1696/// Consider using [`NaiveDateTime::checked_add_signed`] to get an `Option` instead.
1697impl Add<Duration> for NaiveDateTime {
1698 type Output = NaiveDateTime;
1699
1700 #[inline]
1701 fn add(self, rhs: Duration) -> NaiveDateTime {
1702 let rhs = TimeDelta::from_std(rhs)
1703 .expect("overflow converting from core::time::Duration to TimeDelta");
1704 self.checked_add_signed(rhs).expect("`NaiveDateTime + TimeDelta` overflowed")
1705 }
1706}
1707
1708/// Add-assign `TimeDelta` to `NaiveDateTime`.
1709///
1710/// As a part of Chrono's [leap second handling], the addition assumes that **there is no leap
1711/// second ever**, except when the `NaiveDateTime` itself represents a leap second in which case
1712/// the assumption becomes that **there is exactly a single leap second ever**.
1713///
1714/// # Panics
1715///
1716/// Panics if the resulting date would be out of range.
1717/// Consider using [`NaiveDateTime::checked_add_signed`] to get an `Option` instead.
1718impl AddAssign<TimeDelta> for NaiveDateTime {
1719 #[inline]
1720 fn add_assign(&mut self, rhs: TimeDelta) {
1721 *self = self.add(rhs);
1722 }
1723}
1724
1725/// Add-assign `std::time::Duration` to `NaiveDateTime`.
1726///
1727/// As a part of Chrono's [leap second handling], the addition assumes that **there is no leap
1728/// second ever**, except when the `NaiveDateTime` itself represents a leap second in which case
1729/// the assumption becomes that **there is exactly a single leap second ever**.
1730///
1731/// # Panics
1732///
1733/// Panics if the resulting date would be out of range.
1734/// Consider using [`NaiveDateTime::checked_add_signed`] to get an `Option` instead.
1735impl AddAssign<Duration> for NaiveDateTime {
1736 #[inline]
1737 fn add_assign(&mut self, rhs: Duration) {
1738 *self = self.add(rhs);
1739 }
1740}
1741
1742/// Add `FixedOffset` to `NaiveDateTime`.
1743///
1744/// # Panics
1745///
1746/// Panics if the resulting date would be out of range.
1747/// Consider using `checked_add_offset` to get an `Option` instead.
1748impl Add<FixedOffset> for NaiveDateTime {
1749 type Output = NaiveDateTime;
1750
1751 #[inline]
1752 fn add(self, rhs: FixedOffset) -> NaiveDateTime {
1753 self.checked_add_offset(rhs).expect("`NaiveDateTime + FixedOffset` out of range")
1754 }
1755}
1756
1757/// Add `Months` to `NaiveDateTime`.
1758///
1759/// The result will be clamped to valid days in the resulting month, see `checked_add_months` for
1760/// details.
1761///
1762/// # Panics
1763///
1764/// Panics if the resulting date would be out of range.
1765/// Consider using `checked_add_months` to get an `Option` instead.
1766///
1767/// # Example
1768///
1769/// ```
1770/// use chrono::{Months, NaiveDate};
1771///
1772/// assert_eq!(
1773/// NaiveDate::from_ymd_opt(2014, 1, 1).unwrap().and_hms_opt(1, 0, 0).unwrap() + Months::new(1),
1774/// NaiveDate::from_ymd_opt(2014, 2, 1).unwrap().and_hms_opt(1, 0, 0).unwrap()
1775/// );
1776/// assert_eq!(
1777/// NaiveDate::from_ymd_opt(2014, 1, 1).unwrap().and_hms_opt(0, 2, 0).unwrap() + Months::new(11),
1778/// NaiveDate::from_ymd_opt(2014, 12, 1).unwrap().and_hms_opt(0, 2, 0).unwrap()
1779/// );
1780/// assert_eq!(
1781/// NaiveDate::from_ymd_opt(2014, 1, 1).unwrap().and_hms_opt(0, 0, 3).unwrap() + Months::new(12),
1782/// NaiveDate::from_ymd_opt(2015, 1, 1).unwrap().and_hms_opt(0, 0, 3).unwrap()
1783/// );
1784/// assert_eq!(
1785/// NaiveDate::from_ymd_opt(2014, 1, 1).unwrap().and_hms_opt(0, 0, 4).unwrap() + Months::new(13),
1786/// NaiveDate::from_ymd_opt(2015, 2, 1).unwrap().and_hms_opt(0, 0, 4).unwrap()
1787/// );
1788/// assert_eq!(
1789/// NaiveDate::from_ymd_opt(2014, 1, 31).unwrap().and_hms_opt(0, 5, 0).unwrap() + Months::new(1),
1790/// NaiveDate::from_ymd_opt(2014, 2, 28).unwrap().and_hms_opt(0, 5, 0).unwrap()
1791/// );
1792/// assert_eq!(
1793/// NaiveDate::from_ymd_opt(2020, 1, 31).unwrap().and_hms_opt(6, 0, 0).unwrap() + Months::new(1),
1794/// NaiveDate::from_ymd_opt(2020, 2, 29).unwrap().and_hms_opt(6, 0, 0).unwrap()
1795/// );
1796/// ```
1797impl Add<Months> for NaiveDateTime {
1798 type Output = NaiveDateTime;
1799
1800 fn add(self, rhs: Months) -> Self::Output {
1801 self.checked_add_months(rhs).expect("`NaiveDateTime + Months` out of range")
1802 }
1803}
1804
1805/// Subtract `TimeDelta` from `NaiveDateTime`.
1806///
1807/// This is the same as the addition with a negated `TimeDelta`.
1808///
1809/// As a part of Chrono's [leap second handling] the subtraction assumes that **there is no leap
1810/// second ever**, except when the `NaiveDateTime` itself represents a leap second in which case
1811/// the assumption becomes that **there is exactly a single leap second ever**.
1812///
1813/// # Panics
1814///
1815/// Panics if the resulting date would be out of range.
1816/// Consider using [`NaiveDateTime::checked_sub_signed`] to get an `Option` instead.
1817///
1818/// # Example
1819///
1820/// ```
1821/// use chrono::{TimeDelta, NaiveDate};
1822///
1823/// let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
1824///
1825/// let d = from_ymd(2016, 7, 8);
1826/// let hms = |h, m, s| d.and_hms_opt(h, m, s).unwrap();
1827/// assert_eq!(hms(3, 5, 7) - TimeDelta::zero(), hms(3, 5, 7));
1828/// assert_eq!(hms(3, 5, 7) - TimeDelta::seconds(1), hms(3, 5, 6));
1829/// assert_eq!(hms(3, 5, 7) - TimeDelta::seconds(-1), hms(3, 5, 8));
1830/// assert_eq!(hms(3, 5, 7) - TimeDelta::seconds(3600 + 60), hms(2, 4, 7));
1831/// assert_eq!(hms(3, 5, 7) - TimeDelta::seconds(86_400),
1832/// from_ymd(2016, 7, 7).and_hms_opt(3, 5, 7).unwrap());
1833/// assert_eq!(hms(3, 5, 7) - TimeDelta::days(365),
1834/// from_ymd(2015, 7, 9).and_hms_opt(3, 5, 7).unwrap());
1835///
1836/// let hmsm = |h, m, s, milli| d.and_hms_milli_opt(h, m, s, milli).unwrap();
1837/// assert_eq!(hmsm(3, 5, 7, 450) - TimeDelta::milliseconds(670), hmsm(3, 5, 6, 780));
1838/// ```
1839///
1840/// Leap seconds are handled,
1841/// but the subtraction assumes that it is the only leap second happened.
1842///
1843/// ```
1844/// # use chrono::{TimeDelta, NaiveDate};
1845/// # let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
1846/// # let hmsm = |h, m, s, milli| from_ymd(2016, 7, 8).and_hms_milli_opt(h, m, s, milli).unwrap();
1847/// let leap = hmsm(3, 5, 59, 1_300);
1848/// assert_eq!(leap - TimeDelta::zero(), hmsm(3, 5, 59, 1_300));
1849/// assert_eq!(leap - TimeDelta::milliseconds(200), hmsm(3, 5, 59, 1_100));
1850/// assert_eq!(leap - TimeDelta::milliseconds(500), hmsm(3, 5, 59, 800));
1851/// assert_eq!(leap - TimeDelta::seconds(60), hmsm(3, 5, 0, 300));
1852/// assert_eq!(leap - TimeDelta::days(1),
1853/// from_ymd(2016, 7, 7).and_hms_milli_opt(3, 6, 0, 300).unwrap());
1854/// ```
1855///
1856/// [leap second handling]: crate::NaiveTime#leap-second-handling
1857impl Sub<TimeDelta> for NaiveDateTime {
1858 type Output = NaiveDateTime;
1859
1860 #[inline]
1861 fn sub(self, rhs: TimeDelta) -> NaiveDateTime {
1862 self.checked_sub_signed(rhs).expect("`NaiveDateTime - TimeDelta` overflowed")
1863 }
1864}
1865
1866/// Subtract `std::time::Duration` from `NaiveDateTime`.
1867///
1868/// As a part of Chrono's [leap second handling] the subtraction assumes that **there is no leap
1869/// second ever**, except when the `NaiveDateTime` itself represents a leap second in which case
1870/// the assumption becomes that **there is exactly a single leap second ever**.
1871///
1872/// # Panics
1873///
1874/// Panics if the resulting date would be out of range.
1875/// Consider using [`NaiveDateTime::checked_sub_signed`] to get an `Option` instead.
1876impl Sub<Duration> for NaiveDateTime {
1877 type Output = NaiveDateTime;
1878
1879 #[inline]
1880 fn sub(self, rhs: Duration) -> NaiveDateTime {
1881 let rhs = TimeDelta::from_std(rhs)
1882 .expect("overflow converting from core::time::Duration to TimeDelta");
1883 self.checked_sub_signed(rhs).expect("`NaiveDateTime - TimeDelta` overflowed")
1884 }
1885}
1886
1887/// Subtract-assign `TimeDelta` from `NaiveDateTime`.
1888///
1889/// This is the same as the addition with a negated `TimeDelta`.
1890///
1891/// As a part of Chrono's [leap second handling], the addition assumes that **there is no leap
1892/// second ever**, except when the `NaiveDateTime` itself represents a leap second in which case
1893/// the assumption becomes that **there is exactly a single leap second ever**.
1894///
1895/// # Panics
1896///
1897/// Panics if the resulting date would be out of range.
1898/// Consider using [`NaiveDateTime::checked_sub_signed`] to get an `Option` instead.
1899impl SubAssign<TimeDelta> for NaiveDateTime {
1900 #[inline]
1901 fn sub_assign(&mut self, rhs: TimeDelta) {
1902 *self = self.sub(rhs);
1903 }
1904}
1905
1906/// Subtract-assign `std::time::Duration` from `NaiveDateTime`.
1907///
1908/// As a part of Chrono's [leap second handling], the addition assumes that **there is no leap
1909/// second ever**, except when the `NaiveDateTime` itself represents a leap second in which case
1910/// the assumption becomes that **there is exactly a single leap second ever**.
1911///
1912/// # Panics
1913///
1914/// Panics if the resulting date would be out of range.
1915/// Consider using [`NaiveDateTime::checked_sub_signed`] to get an `Option` instead.
1916impl SubAssign<Duration> for NaiveDateTime {
1917 #[inline]
1918 fn sub_assign(&mut self, rhs: Duration) {
1919 *self = self.sub(rhs);
1920 }
1921}
1922
1923/// Subtract `FixedOffset` from `NaiveDateTime`.
1924///
1925/// # Panics
1926///
1927/// Panics if the resulting date would be out of range.
1928/// Consider using `checked_sub_offset` to get an `Option` instead.
1929impl Sub<FixedOffset> for NaiveDateTime {
1930 type Output = NaiveDateTime;
1931
1932 #[inline]
1933 fn sub(self, rhs: FixedOffset) -> NaiveDateTime {
1934 self.checked_sub_offset(rhs).expect("`NaiveDateTime - FixedOffset` out of range")
1935 }
1936}
1937
1938/// Subtract `Months` from `NaiveDateTime`.
1939///
1940/// The result will be clamped to valid days in the resulting month, see
1941/// [`NaiveDateTime::checked_sub_months`] for details.
1942///
1943/// # Panics
1944///
1945/// Panics if the resulting date would be out of range.
1946/// Consider using [`NaiveDateTime::checked_sub_months`] to get an `Option` instead.
1947///
1948/// # Example
1949///
1950/// ```
1951/// use chrono::{Months, NaiveDate};
1952///
1953/// assert_eq!(
1954/// NaiveDate::from_ymd_opt(2014, 01, 01).unwrap().and_hms_opt(01, 00, 00).unwrap() - Months::new(11),
1955/// NaiveDate::from_ymd_opt(2013, 02, 01).unwrap().and_hms_opt(01, 00, 00).unwrap()
1956/// );
1957/// assert_eq!(
1958/// NaiveDate::from_ymd_opt(2014, 01, 01).unwrap().and_hms_opt(00, 02, 00).unwrap() - Months::new(12),
1959/// NaiveDate::from_ymd_opt(2013, 01, 01).unwrap().and_hms_opt(00, 02, 00).unwrap()
1960/// );
1961/// assert_eq!(
1962/// NaiveDate::from_ymd_opt(2014, 01, 01).unwrap().and_hms_opt(00, 00, 03).unwrap() - Months::new(13),
1963/// NaiveDate::from_ymd_opt(2012, 12, 01).unwrap().and_hms_opt(00, 00, 03).unwrap()
1964/// );
1965/// ```
1966impl Sub<Months> for NaiveDateTime {
1967 type Output = NaiveDateTime;
1968
1969 fn sub(self, rhs: Months) -> Self::Output {
1970 self.checked_sub_months(rhs).expect("`NaiveDateTime - Months` out of range")
1971 }
1972}
1973
1974/// Subtracts another `NaiveDateTime` from the current date and time.
1975/// This does not overflow or underflow at all.
1976///
1977/// As a part of Chrono's [leap second handling](./struct.NaiveTime.html#leap-second-handling),
1978/// the subtraction assumes that **there is no leap second ever**,
1979/// except when any of the `NaiveDateTime`s themselves represents a leap second
1980/// in which case the assumption becomes that
1981/// **there are exactly one (or two) leap second(s) ever**.
1982///
1983/// The implementation is a wrapper around [`NaiveDateTime::signed_duration_since`].
1984///
1985/// # Example
1986///
1987/// ```
1988/// use chrono::{TimeDelta, NaiveDate};
1989///
1990/// let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
1991///
1992/// let d = from_ymd(2016, 7, 8);
1993/// assert_eq!(d.and_hms_opt(3, 5, 7).unwrap() - d.and_hms_opt(2, 4, 6).unwrap(), TimeDelta::seconds(3600 + 60 + 1));
1994///
1995/// // July 8 is 190th day in the year 2016
1996/// let d0 = from_ymd(2016, 1, 1);
1997/// assert_eq!(d.and_hms_milli_opt(0, 7, 6, 500).unwrap() - d0.and_hms_opt(0, 0, 0).unwrap(),
1998/// TimeDelta::seconds(189 * 86_400 + 7 * 60 + 6) + TimeDelta::milliseconds(500));
1999/// ```
2000///
2001/// Leap seconds are handled, but the subtraction assumes that no other leap
2002/// seconds happened.
2003///
2004/// ```
2005/// # use chrono::{TimeDelta, NaiveDate};
2006/// # let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
2007/// let leap = from_ymd(2015, 6, 30).and_hms_milli_opt(23, 59, 59, 1_500).unwrap();
2008/// assert_eq!(leap - from_ymd(2015, 6, 30).and_hms_opt(23, 0, 0).unwrap(),
2009/// TimeDelta::seconds(3600) + TimeDelta::milliseconds(500));
2010/// assert_eq!(from_ymd(2015, 7, 1).and_hms_opt(1, 0, 0).unwrap() - leap,
2011/// TimeDelta::seconds(3600) - TimeDelta::milliseconds(500));
2012/// ```
2013impl Sub<NaiveDateTime> for NaiveDateTime {
2014 type Output = TimeDelta;
2015
2016 #[inline]
2017 fn sub(self, rhs: NaiveDateTime) -> TimeDelta {
2018 self.signed_duration_since(rhs)
2019 }
2020}
2021
2022/// Add `Days` to `NaiveDateTime`.
2023///
2024/// # Panics
2025///
2026/// Panics if the resulting date would be out of range.
2027/// Consider using `checked_add_days` to get an `Option` instead.
2028impl Add<Days> for NaiveDateTime {
2029 type Output = NaiveDateTime;
2030
2031 fn add(self, days: Days) -> Self::Output {
2032 self.checked_add_days(days).expect("`NaiveDateTime + Days` out of range")
2033 }
2034}
2035
2036/// Subtract `Days` from `NaiveDateTime`.
2037///
2038/// # Panics
2039///
2040/// Panics if the resulting date would be out of range.
2041/// Consider using `checked_sub_days` to get an `Option` instead.
2042impl Sub<Days> for NaiveDateTime {
2043 type Output = NaiveDateTime;
2044
2045 fn sub(self, days: Days) -> Self::Output {
2046 self.checked_sub_days(days).expect("`NaiveDateTime - Days` out of range")
2047 }
2048}
2049
2050/// The `Debug` output of the naive date and time `dt` is the same as
2051/// [`dt.format("%Y-%m-%dT%H:%M:%S%.f")`](crate::format::strftime).
2052///
2053/// The string printed can be readily parsed via the `parse` method on `str`.
2054///
2055/// It should be noted that, for leap seconds not on the minute boundary,
2056/// it may print a representation not distinguishable from non-leap seconds.
2057/// This doesn't matter in practice, since such leap seconds never happened.
2058/// (By the time of the first leap second on 1972-06-30,
2059/// every time zone offset around the world has standardized to the 5-minute alignment.)
2060///
2061/// # Example
2062///
2063/// ```
2064/// use chrono::NaiveDate;
2065///
2066/// let dt = NaiveDate::from_ymd_opt(2016, 11, 15).unwrap().and_hms_opt(7, 39, 24).unwrap();
2067/// assert_eq!(format!("{:?}", dt), "2016-11-15T07:39:24");
2068/// ```
2069///
2070/// Leap seconds may also be used.
2071///
2072/// ```
2073/// # use chrono::NaiveDate;
2074/// let dt = NaiveDate::from_ymd_opt(2015, 6, 30).unwrap().and_hms_milli_opt(23, 59, 59, 1_500).unwrap();
2075/// assert_eq!(format!("{:?}", dt), "2015-06-30T23:59:60.500");
2076/// ```
2077impl fmt::Debug for NaiveDateTime {
2078 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2079 self.date.fmt(f)?;
2080 f.write_char('T')?;
2081 self.time.fmt(f)
2082 }
2083}
2084
2085/// The `Display` output of the naive date and time `dt` is the same as
2086/// [`dt.format("%Y-%m-%d %H:%M:%S%.f")`](crate::format::strftime).
2087///
2088/// It should be noted that, for leap seconds not on the minute boundary,
2089/// it may print a representation not distinguishable from non-leap seconds.
2090/// This doesn't matter in practice, since such leap seconds never happened.
2091/// (By the time of the first leap second on 1972-06-30,
2092/// every time zone offset around the world has standardized to the 5-minute alignment.)
2093///
2094/// # Example
2095///
2096/// ```
2097/// use chrono::NaiveDate;
2098///
2099/// let dt = NaiveDate::from_ymd_opt(2016, 11, 15).unwrap().and_hms_opt(7, 39, 24).unwrap();
2100/// assert_eq!(format!("{}", dt), "2016-11-15 07:39:24");
2101/// ```
2102///
2103/// Leap seconds may also be used.
2104///
2105/// ```
2106/// # use chrono::NaiveDate;
2107/// let dt = NaiveDate::from_ymd_opt(2015, 6, 30).unwrap().and_hms_milli_opt(23, 59, 59, 1_500).unwrap();
2108/// assert_eq!(format!("{}", dt), "2015-06-30 23:59:60.500");
2109/// ```
2110impl fmt::Display for NaiveDateTime {
2111 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2112 self.date.fmt(f)?;
2113 f.write_char(' ')?;
2114 self.time.fmt(f)
2115 }
2116}
2117
2118/// Parsing a `str` into a `NaiveDateTime` uses the same format,
2119/// [`%Y-%m-%dT%H:%M:%S%.f`](crate::format::strftime), as in `Debug`.
2120///
2121/// # Example
2122///
2123/// ```
2124/// use chrono::{NaiveDateTime, NaiveDate};
2125///
2126/// let dt = NaiveDate::from_ymd_opt(2015, 9, 18).unwrap().and_hms_opt(23, 56, 4).unwrap();
2127/// assert_eq!("2015-09-18T23:56:04".parse::<NaiveDateTime>(), Ok(dt));
2128///
2129/// let dt = NaiveDate::from_ymd_opt(12345, 6, 7).unwrap().and_hms_milli_opt(7, 59, 59, 1_500).unwrap(); // leap second
2130/// assert_eq!("+12345-6-7T7:59:60.5".parse::<NaiveDateTime>(), Ok(dt));
2131///
2132/// assert!("foo".parse::<NaiveDateTime>().is_err());
2133/// ```
2134impl str::FromStr for NaiveDateTime {
2135 type Err = ParseError;
2136
2137 fn from_str(s: &str) -> ParseResult<NaiveDateTime> {
2138 const ITEMS: &[Item<'static>] = &[
2139 Item::Numeric(Numeric::Year, Pad::Zero),
2140 Item::Space(""),
2141 Item::Literal("-"),
2142 Item::Numeric(Numeric::Month, Pad::Zero),
2143 Item::Space(""),
2144 Item::Literal("-"),
2145 Item::Numeric(Numeric::Day, Pad::Zero),
2146 Item::Space(""),
2147 Item::Literal("T"), // XXX shouldn't this be case-insensitive?
2148 Item::Numeric(Numeric::Hour, Pad::Zero),
2149 Item::Space(""),
2150 Item::Literal(":"),
2151 Item::Numeric(Numeric::Minute, Pad::Zero),
2152 Item::Space(""),
2153 Item::Literal(":"),
2154 Item::Numeric(Numeric::Second, Pad::Zero),
2155 Item::Fixed(Fixed::Nanosecond),
2156 Item::Space(""),
2157 ];
2158
2159 let mut parsed = Parsed::new();
2160 parse(&mut parsed, s, ITEMS.iter())?;
2161 parsed.to_naive_datetime_with_offset(0)
2162 }
2163}
2164
2165/// The default value for a NaiveDateTime is one with epoch 0
2166/// that is, 1st of January 1970 at 00:00:00.
2167///
2168/// # Example
2169///
2170/// ```rust
2171/// use chrono::NaiveDateTime;
2172///
2173/// let default_date = NaiveDateTime::default();
2174/// assert_eq!(Some(default_date), NaiveDateTime::from_timestamp_opt(0, 0));
2175/// ```
2176impl Default for NaiveDateTime {
2177 fn default() -> Self {
2178 NaiveDateTime::from_timestamp_opt(0, 0).unwrap()
2179 }
2180}
2181
2182#[cfg(all(test, any(feature = "rustc-serialize", feature = "serde")))]
2183fn test_encodable_json<F, E>(to_string: F)
2184where
2185 F: Fn(&NaiveDateTime) -> Result<String, E>,
2186 E: ::std::fmt::Debug,
2187{
2188 assert_eq!(
2189 to_string(
2190 &NaiveDate::from_ymd_opt(2016, 7, 8).unwrap().and_hms_milli_opt(9, 10, 48, 90).unwrap()
2191 )
2192 .ok(),
2193 Some(r#""2016-07-08T09:10:48.090""#.into())
2194 );
2195 assert_eq!(
2196 to_string(&NaiveDate::from_ymd_opt(2014, 7, 24).unwrap().and_hms_opt(12, 34, 6).unwrap())
2197 .ok(),
2198 Some(r#""2014-07-24T12:34:06""#.into())
2199 );
2200 assert_eq!(
2201 to_string(
2202 &NaiveDate::from_ymd_opt(0, 1, 1).unwrap().and_hms_milli_opt(0, 0, 59, 1_000).unwrap()
2203 )
2204 .ok(),
2205 Some(r#""0000-01-01T00:00:60""#.into())
2206 );
2207 assert_eq!(
2208 to_string(
2209 &NaiveDate::from_ymd_opt(-1, 12, 31).unwrap().and_hms_nano_opt(23, 59, 59, 7).unwrap()
2210 )
2211 .ok(),
2212 Some(r#""-0001-12-31T23:59:59.000000007""#.into())
2213 );
2214 assert_eq!(
2215 to_string(&NaiveDate::MIN.and_hms_opt(0, 0, 0).unwrap()).ok(),
2216 Some(r#""-262143-01-01T00:00:00""#.into())
2217 );
2218 assert_eq!(
2219 to_string(&NaiveDate::MAX.and_hms_nano_opt(23, 59, 59, 1_999_999_999).unwrap()).ok(),
2220 Some(r#""+262142-12-31T23:59:60.999999999""#.into())
2221 );
2222}
2223
2224#[cfg(all(test, any(feature = "rustc-serialize", feature = "serde")))]
2225fn test_decodable_json<F, E>(from_str: F)
2226where
2227 F: Fn(&str) -> Result<NaiveDateTime, E>,
2228 E: ::std::fmt::Debug,
2229{
2230 assert_eq!(
2231 from_str(r#""2016-07-08T09:10:48.090""#).ok(),
2232 Some(
2233 NaiveDate::from_ymd_opt(2016, 7, 8).unwrap().and_hms_milli_opt(9, 10, 48, 90).unwrap()
2234 )
2235 );
2236 assert_eq!(
2237 from_str(r#""2016-7-8T9:10:48.09""#).ok(),
2238 Some(
2239 NaiveDate::from_ymd_opt(2016, 7, 8).unwrap().and_hms_milli_opt(9, 10, 48, 90).unwrap()
2240 )
2241 );
2242 assert_eq!(
2243 from_str(r#""2014-07-24T12:34:06""#).ok(),
2244 Some(NaiveDate::from_ymd_opt(2014, 7, 24).unwrap().and_hms_opt(12, 34, 6).unwrap())
2245 );
2246 assert_eq!(
2247 from_str(r#""0000-01-01T00:00:60""#).ok(),
2248 Some(NaiveDate::from_ymd_opt(0, 1, 1).unwrap().and_hms_milli_opt(0, 0, 59, 1_000).unwrap())
2249 );
2250 assert_eq!(
2251 from_str(r#""0-1-1T0:0:60""#).ok(),
2252 Some(NaiveDate::from_ymd_opt(0, 1, 1).unwrap().and_hms_milli_opt(0, 0, 59, 1_000).unwrap())
2253 );
2254 assert_eq!(
2255 from_str(r#""-0001-12-31T23:59:59.000000007""#).ok(),
2256 Some(NaiveDate::from_ymd_opt(-1, 12, 31).unwrap().and_hms_nano_opt(23, 59, 59, 7).unwrap())
2257 );
2258 assert_eq!(
2259 from_str(r#""-262143-01-01T00:00:00""#).ok(),
2260 Some(NaiveDate::MIN.and_hms_opt(0, 0, 0).unwrap())
2261 );
2262 assert_eq!(
2263 from_str(r#""+262142-12-31T23:59:60.999999999""#).ok(),
2264 Some(NaiveDate::MAX.and_hms_nano_opt(23, 59, 59, 1_999_999_999).unwrap())
2265 );
2266 assert_eq!(
2267 from_str(r#""+262142-12-31T23:59:60.9999999999997""#).ok(), // excess digits are ignored
2268 Some(NaiveDate::MAX.and_hms_nano_opt(23, 59, 59, 1_999_999_999).unwrap())
2269 );
2270
2271 // bad formats
2272 assert!(from_str(r#""""#).is_err());
2273 assert!(from_str(r#""2016-07-08""#).is_err());
2274 assert!(from_str(r#""09:10:48.090""#).is_err());
2275 assert!(from_str(r#""20160708T091048.090""#).is_err());
2276 assert!(from_str(r#""2000-00-00T00:00:00""#).is_err());
2277 assert!(from_str(r#""2000-02-30T00:00:00""#).is_err());
2278 assert!(from_str(r#""2001-02-29T00:00:00""#).is_err());
2279 assert!(from_str(r#""2002-02-28T24:00:00""#).is_err());
2280 assert!(from_str(r#""2002-02-28T23:60:00""#).is_err());
2281 assert!(from_str(r#""2002-02-28T23:59:61""#).is_err());
2282 assert!(from_str(r#""2016-07-08T09:10:48,090""#).is_err());
2283 assert!(from_str(r#""2016-07-08 09:10:48.090""#).is_err());
2284 assert!(from_str(r#""2016-007-08T09:10:48.090""#).is_err());
2285 assert!(from_str(r#""yyyy-mm-ddThh:mm:ss.fffffffff""#).is_err());
2286 assert!(from_str(r#"20160708000000"#).is_err());
2287 assert!(from_str(r#"{}"#).is_err());
2288 // pre-0.3.0 rustc-serialize format is now invalid
2289 assert!(from_str(r#"{"date":{"ymdf":20},"time":{"secs":0,"frac":0}}"#).is_err());
2290 assert!(from_str(r#"null"#).is_err());
2291}
2292
2293#[cfg(all(test, feature = "rustc-serialize"))]
2294fn test_decodable_json_timestamp<F, E>(from_str: F)
2295where
2296 F: Fn(&str) -> Result<rustc_serialize::TsSeconds, E>,
2297 E: ::std::fmt::Debug,
2298{
2299 assert_eq!(
2300 *from_str("0").unwrap(),
2301 NaiveDate::from_ymd_opt(1970, 1, 1).unwrap().and_hms_opt(0, 0, 0).unwrap(),
2302 "should parse integers as timestamps"
2303 );
2304 assert_eq!(
2305 *from_str("-1").unwrap(),
2306 NaiveDate::from_ymd_opt(1969, 12, 31).unwrap().and_hms_opt(23, 59, 59).unwrap(),
2307 "should parse integers as timestamps"
2308 );
2309}