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}