Coverage Report

Created: 2025-11-24 06:48

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