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::{Fixed, Item, Numeric, Pad};
19use crate::format::{ParseError, ParseResult, Parsed, StrftimeItems, parse, parse_and_remainder};
20use crate::naive::{Days, IsoWeek, NaiveDate, NaiveTime};
21use crate::offset::Utc;
22use crate::time_delta::NANOS_PER_SEC;
23use 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")]
30pub(crate) mod serde;
31
32#[cfg(test)]
33mod tests;
34
35/// The minimum possible `NaiveDateTime`.
36#[deprecated(since = "0.4.20", note = "Use NaiveDateTime::MIN instead")]
37pub const MIN_DATETIME: NaiveDateTime = NaiveDateTime::MIN;
38/// The maximum possible `NaiveDateTime`.
39#[deprecated(since = "0.4.20", note = "Use NaiveDateTime::MAX instead")]
40pub 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))]
76pub struct NaiveDateTime {
77 date: NaiveDate,
78 time: NaiveTime,
79}
80
81impl 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 pub const fn new(date: NaiveDate, time: NaiveTime) -> NaiveDateTime {
100 NaiveDateTime { date, time }
101 }
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 pub fn parse_from_str(s: &str, fmt: &str) -> ParseResult<NaiveDateTime> {
286 let mut parsed = Parsed::new();
287 parse(&mut parsed, s, StrftimeItems::new(fmt))?;
288 parsed.to_naive_datetime_with_offset(0) // no offset adjustment
289 }
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 pub fn parse_and_remainder<'a>(s: &'a str, fmt: &str) -> ParseResult<(NaiveDateTime, &'a str)> {
314 let mut parsed = Parsed::new();
315 let remainder = parse_and_remainder(&mut parsed, s, StrftimeItems::new(fmt))?;
316 parsed.to_naive_datetime_with_offset(0).map(|d| (d, remainder)) // no offset adjustment
317 }
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 pub const fn date(&self) -> NaiveDate {
331 self.date
332 }
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 pub const fn time(&self) -> NaiveTime {
346 self.time
347 }
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 pub const fn timestamp_subsec_nanos(&self) -> u32 {
449 self.and_utc().timestamp_subsec_nanos()
450 }
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 pub const fn checked_add_signed(self, rhs: TimeDelta) -> Option<NaiveDateTime> {
530 let (time, remainder) = self.time.overflowing_add_signed(rhs);
531 let remainder = try_opt!(TimeDelta::try_seconds(remainder));
532 let date = try_opt!(self.date.checked_add_signed(remainder));
533 Some(NaiveDateTime { date, time })
534 }
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 pub const fn checked_add_months(self, rhs: Months) -> Option<NaiveDateTime> {
569 Some(Self { date: try_opt!(self.date.checked_add_months(rhs)), time: self.time })
570 }
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 pub const fn checked_add_offset(self, rhs: FixedOffset) -> Option<NaiveDateTime> {
579 let (time, days) = self.time.overflowing_add_offset(rhs);
580 let date = match days {
581 -1 => try_opt!(self.date.pred_opt()),
582 1 => try_opt!(self.date.succ_opt()),
583 _ => self.date,
584 };
585 Some(NaiveDateTime { date, time })
586 }
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 pub const fn checked_sub_offset(self, rhs: FixedOffset) -> Option<NaiveDateTime> {
594 let (time, days) = self.time.overflowing_sub_offset(rhs);
595 let date = match days {
596 -1 => try_opt!(self.date.pred_opt()),
597 1 => try_opt!(self.date.succ_opt()),
598 _ => self.date,
599 };
600 Some(NaiveDateTime { date, time })
601 }
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 pub(crate) fn overflowing_add_offset(self, rhs: FixedOffset) -> NaiveDateTime {
610 let (time, days) = self.time.overflowing_add_offset(rhs);
611 let date = match days {
612 -1 => self.date.pred_opt().unwrap_or(NaiveDate::BEFORE_MIN),
613 1 => self.date.succ_opt().unwrap_or(NaiveDate::AFTER_MAX),
614 _ => self.date,
615 };
616 NaiveDateTime { date, time }
617 }
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 pub const fn checked_sub_signed(self, rhs: TimeDelta) -> Option<NaiveDateTime> {
710 let (time, remainder) = self.time.overflowing_sub_signed(rhs);
711 let remainder = try_opt!(TimeDelta::try_seconds(remainder));
712 let date = try_opt!(self.date.checked_sub_signed(remainder));
713 Some(NaiveDateTime { date, time })
714 }
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 pub const fn checked_sub_months(self, rhs: Months) -> Option<NaiveDateTime> {
749 Some(Self { date: try_opt!(self.date.checked_sub_months(rhs)), time: self.time })
750 }
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 pub const fn checked_add_days(self, days: Days) -> Option<Self> {
757 Some(Self { date: try_opt!(self.date.checked_add_days(days)), ..self })
758 }
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 pub const fn checked_sub_days(self, days: Days) -> Option<Self> {
765 Some(Self { date: try_opt!(self.date.checked_sub_days(days)), ..self })
766 }
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 pub const fn signed_duration_since(self, rhs: NaiveDateTime) -> TimeDelta {
819 expect(
820 self.date
821 .signed_duration_since(rhs.date)
822 .checked_add(&self.time.signed_duration_since(rhs.time)),
823 "always in range",
824 )
825 }
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 pub fn and_local_timezone<Tz: TimeZone>(&self, tz: Tz) -> MappedLocalTime<DateTime<Tz>> {
923 tz.from_local_datetime(self)
924 }
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 pub const fn and_utc(&self) -> DateTime<Utc> {
938 DateTime::from_naive_utc_and_offset(*self, Utc)
939 }
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 Unix Epoch, 1970-01-01 00:00:00.
948 pub const UNIX_EPOCH: Self =
949 expect(NaiveDate::from_ymd_opt(1970, 1, 1), "").and_time(NaiveTime::MIN);
950}
951
952impl From<NaiveDate> for NaiveDateTime {
953 /// Converts a `NaiveDate` to a `NaiveDateTime` of the same date but at midnight.
954 ///
955 /// # Example
956 ///
957 /// ```
958 /// use chrono::{NaiveDate, NaiveDateTime};
959 ///
960 /// let nd = NaiveDate::from_ymd_opt(2016, 5, 28).unwrap();
961 /// let ndt = NaiveDate::from_ymd_opt(2016, 5, 28).unwrap().and_hms_opt(0, 0, 0).unwrap();
962 /// assert_eq!(ndt, NaiveDateTime::from(nd));
963 fn from(date: NaiveDate) -> Self {
964 date.and_hms_opt(0, 0, 0).unwrap()
965 }
966}
967
968impl Datelike for NaiveDateTime {
969 /// Returns the year number in the [calendar date](./struct.NaiveDate.html#calendar-date).
970 ///
971 /// See also the [`NaiveDate::year`](./struct.NaiveDate.html#method.year) method.
972 ///
973 /// # Example
974 ///
975 /// ```
976 /// use chrono::{Datelike, NaiveDate, NaiveDateTime};
977 ///
978 /// let dt: NaiveDateTime =
979 /// NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
980 /// assert_eq!(dt.year(), 2015);
981 /// ```
982 #[inline]
983 fn year(&self) -> i32 {
984 self.date.year()
985 }
986
987 /// Returns the month number starting from 1.
988 ///
989 /// The return value ranges from 1 to 12.
990 ///
991 /// See also the [`NaiveDate::month`](./struct.NaiveDate.html#method.month) method.
992 ///
993 /// # Example
994 ///
995 /// ```
996 /// use chrono::{Datelike, NaiveDate, NaiveDateTime};
997 ///
998 /// let dt: NaiveDateTime =
999 /// NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
1000 /// assert_eq!(dt.month(), 9);
1001 /// ```
1002 #[inline]
1003 fn month(&self) -> u32 {
1004 self.date.month()
1005 }
1006
1007 /// Returns the month number starting from 0.
1008 ///
1009 /// The return value ranges from 0 to 11.
1010 ///
1011 /// See also the [`NaiveDate::month0`] method.
1012 ///
1013 /// # Example
1014 ///
1015 /// ```
1016 /// use chrono::{Datelike, NaiveDate, NaiveDateTime};
1017 ///
1018 /// let dt: NaiveDateTime =
1019 /// NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
1020 /// assert_eq!(dt.month0(), 8);
1021 /// ```
1022 #[inline]
1023 fn month0(&self) -> u32 {
1024 self.date.month0()
1025 }
1026
1027 /// Returns the day of month starting from 1.
1028 ///
1029 /// The return value ranges from 1 to 31. (The last day of month differs by months.)
1030 ///
1031 /// See also the [`NaiveDate::day`](./struct.NaiveDate.html#method.day) method.
1032 ///
1033 /// # Example
1034 ///
1035 /// ```
1036 /// use chrono::{Datelike, NaiveDate, NaiveDateTime};
1037 ///
1038 /// let dt: NaiveDateTime =
1039 /// NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
1040 /// assert_eq!(dt.day(), 25);
1041 /// ```
1042 #[inline]
1043 fn day(&self) -> u32 {
1044 self.date.day()
1045 }
1046
1047 /// Returns the day of month starting from 0.
1048 ///
1049 /// The return value ranges from 0 to 30. (The last day of month differs by months.)
1050 ///
1051 /// See also the [`NaiveDate::day0`] method.
1052 ///
1053 /// # Example
1054 ///
1055 /// ```
1056 /// use chrono::{Datelike, NaiveDate, NaiveDateTime};
1057 ///
1058 /// let dt: NaiveDateTime =
1059 /// NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
1060 /// assert_eq!(dt.day0(), 24);
1061 /// ```
1062 #[inline]
1063 fn day0(&self) -> u32 {
1064 self.date.day0()
1065 }
1066
1067 /// Returns the day of year starting from 1.
1068 ///
1069 /// The return value ranges from 1 to 366. (The last day of year differs by years.)
1070 ///
1071 /// See also the [`NaiveDate::ordinal`](./struct.NaiveDate.html#method.ordinal) method.
1072 ///
1073 /// # Example
1074 ///
1075 /// ```
1076 /// use chrono::{Datelike, NaiveDate, NaiveDateTime};
1077 ///
1078 /// let dt: NaiveDateTime =
1079 /// NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
1080 /// assert_eq!(dt.ordinal(), 268);
1081 /// ```
1082 #[inline]
1083 fn ordinal(&self) -> u32 {
1084 self.date.ordinal()
1085 }
1086
1087 /// Returns the day of year starting from 0.
1088 ///
1089 /// The return value ranges from 0 to 365. (The last day of year differs by years.)
1090 ///
1091 /// See also the [`NaiveDate::ordinal0`] method.
1092 ///
1093 /// # Example
1094 ///
1095 /// ```
1096 /// use chrono::{Datelike, NaiveDate, NaiveDateTime};
1097 ///
1098 /// let dt: NaiveDateTime =
1099 /// NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
1100 /// assert_eq!(dt.ordinal0(), 267);
1101 /// ```
1102 #[inline]
1103 fn ordinal0(&self) -> u32 {
1104 self.date.ordinal0()
1105 }
1106
1107 /// Returns the day of week.
1108 ///
1109 /// See also the [`NaiveDate::weekday`](./struct.NaiveDate.html#method.weekday) method.
1110 ///
1111 /// # Example
1112 ///
1113 /// ```
1114 /// use chrono::{Datelike, NaiveDate, NaiveDateTime, Weekday};
1115 ///
1116 /// let dt: NaiveDateTime =
1117 /// NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
1118 /// assert_eq!(dt.weekday(), Weekday::Fri);
1119 /// ```
1120 #[inline]
1121 fn weekday(&self) -> Weekday {
1122 self.date.weekday()
1123 }
1124
1125 #[inline]
1126 fn iso_week(&self) -> IsoWeek {
1127 self.date.iso_week()
1128 }
1129
1130 /// Makes a new `NaiveDateTime` with the year number changed, while keeping the same month and
1131 /// day.
1132 ///
1133 /// See also the [`NaiveDate::with_year`] method.
1134 ///
1135 /// # Errors
1136 ///
1137 /// Returns `None` if:
1138 /// - The resulting date does not exist (February 29 in a non-leap year).
1139 /// - The year is out of range for a `NaiveDate`.
1140 ///
1141 /// # Example
1142 ///
1143 /// ```
1144 /// use chrono::{Datelike, NaiveDate, NaiveDateTime};
1145 ///
1146 /// let dt: NaiveDateTime =
1147 /// NaiveDate::from_ymd_opt(2015, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap();
1148 /// assert_eq!(
1149 /// dt.with_year(2016),
1150 /// Some(NaiveDate::from_ymd_opt(2016, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap())
1151 /// );
1152 /// assert_eq!(
1153 /// dt.with_year(-308),
1154 /// Some(NaiveDate::from_ymd_opt(-308, 9, 25).unwrap().and_hms_opt(12, 34, 56).unwrap())
1155 /// );
1156 /// ```
1157 #[inline]
1158 fn with_year(&self, year: i32) -> Option<NaiveDateTime> {
1159 self.date.with_year(year).map(|d| NaiveDateTime { date: d, ..*self })
1160 }
1161
1162 /// Makes a new `NaiveDateTime` with the month number (starting from 1) changed.
1163 ///
1164 /// Don't combine multiple `Datelike::with_*` methods. The intermediate value may not exist.
1165 ///
1166 /// See also the [`NaiveDate::with_month`] method.
1167 ///
1168 /// # Errors
1169 ///
1170 /// Returns `None` if:
1171 /// - The resulting date does not exist (for example `month(4)` when day of the month is 31).
1172 /// - The value for `month` is invalid.
1173 ///
1174 /// # Example
1175 ///
1176 /// ```
1177 /// use chrono::{Datelike, NaiveDate, NaiveDateTime};
1178 ///
1179 /// let dt: NaiveDateTime =
1180 /// NaiveDate::from_ymd_opt(2015, 9, 30).unwrap().and_hms_opt(12, 34, 56).unwrap();
1181 /// assert_eq!(
1182 /// dt.with_month(10),
1183 /// Some(NaiveDate::from_ymd_opt(2015, 10, 30).unwrap().and_hms_opt(12, 34, 56).unwrap())
1184 /// );
1185 /// assert_eq!(dt.with_month(13), None); // No month 13
1186 /// assert_eq!(dt.with_month(2), None); // No February 30
1187 /// ```
1188 #[inline]
1189 fn with_month(&self, month: u32) -> Option<NaiveDateTime> {
1190 self.date.with_month(month).map(|d| NaiveDateTime { date: d, ..*self })
1191 }
1192
1193 /// Makes a new `NaiveDateTime` with the month number (starting from 0) changed.
1194 ///
1195 /// See also the [`NaiveDate::with_month0`] method.
1196 ///
1197 /// # Errors
1198 ///
1199 /// Returns `None` if:
1200 /// - The resulting date does not exist (for example `month0(3)` when day of the month is 31).
1201 /// - The value for `month0` is invalid.
1202 ///
1203 /// # Example
1204 ///
1205 /// ```
1206 /// use chrono::{Datelike, NaiveDate, NaiveDateTime};
1207 ///
1208 /// let dt: NaiveDateTime =
1209 /// NaiveDate::from_ymd_opt(2015, 9, 30).unwrap().and_hms_opt(12, 34, 56).unwrap();
1210 /// assert_eq!(
1211 /// dt.with_month0(9),
1212 /// Some(NaiveDate::from_ymd_opt(2015, 10, 30).unwrap().and_hms_opt(12, 34, 56).unwrap())
1213 /// );
1214 /// assert_eq!(dt.with_month0(12), None); // No month 13
1215 /// assert_eq!(dt.with_month0(1), None); // No February 30
1216 /// ```
1217 #[inline]
1218 fn with_month0(&self, month0: u32) -> Option<NaiveDateTime> {
1219 self.date.with_month0(month0).map(|d| NaiveDateTime { date: d, ..*self })
1220 }
1221
1222 /// Makes a new `NaiveDateTime` with the day of month (starting from 1) changed.
1223 ///
1224 /// See also the [`NaiveDate::with_day`] method.
1225 ///
1226 /// # Errors
1227 ///
1228 /// Returns `None` if:
1229 /// - The resulting date does not exist (for example `day(31)` in April).
1230 /// - The value for `day` is invalid.
1231 ///
1232 /// # Example
1233 ///
1234 /// ```
1235 /// use chrono::{Datelike, NaiveDate, NaiveDateTime};
1236 ///
1237 /// let dt: NaiveDateTime =
1238 /// NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_opt(12, 34, 56).unwrap();
1239 /// assert_eq!(
1240 /// dt.with_day(30),
1241 /// Some(NaiveDate::from_ymd_opt(2015, 9, 30).unwrap().and_hms_opt(12, 34, 56).unwrap())
1242 /// );
1243 /// assert_eq!(dt.with_day(31), None); // no September 31
1244 /// ```
1245 #[inline]
1246 fn with_day(&self, day: u32) -> Option<NaiveDateTime> {
1247 self.date.with_day(day).map(|d| NaiveDateTime { date: d, ..*self })
1248 }
1249
1250 /// Makes a new `NaiveDateTime` with the day of month (starting from 0) changed.
1251 ///
1252 /// See also the [`NaiveDate::with_day0`] method.
1253 ///
1254 /// # Errors
1255 ///
1256 /// Returns `None` if:
1257 /// - The resulting date does not exist (for example `day(30)` in April).
1258 /// - The value for `day0` is invalid.
1259 ///
1260 /// # Example
1261 ///
1262 /// ```
1263 /// use chrono::{Datelike, NaiveDate, NaiveDateTime};
1264 ///
1265 /// let dt: NaiveDateTime =
1266 /// NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_opt(12, 34, 56).unwrap();
1267 /// assert_eq!(
1268 /// dt.with_day0(29),
1269 /// Some(NaiveDate::from_ymd_opt(2015, 9, 30).unwrap().and_hms_opt(12, 34, 56).unwrap())
1270 /// );
1271 /// assert_eq!(dt.with_day0(30), None); // no September 31
1272 /// ```
1273 #[inline]
1274 fn with_day0(&self, day0: u32) -> Option<NaiveDateTime> {
1275 self.date.with_day0(day0).map(|d| NaiveDateTime { date: d, ..*self })
1276 }
1277
1278 /// Makes a new `NaiveDateTime` with the day of year (starting from 1) changed.
1279 ///
1280 /// See also the [`NaiveDate::with_ordinal`] method.
1281 ///
1282 /// # Errors
1283 ///
1284 /// Returns `None` if:
1285 /// - The resulting date does not exist (`with_ordinal(366)` in a non-leap year).
1286 /// - The value for `ordinal` is invalid.
1287 ///
1288 /// # Example
1289 ///
1290 /// ```
1291 /// use chrono::{Datelike, NaiveDate, NaiveDateTime};
1292 ///
1293 /// let dt: NaiveDateTime =
1294 /// NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_opt(12, 34, 56).unwrap();
1295 /// assert_eq!(
1296 /// dt.with_ordinal(60),
1297 /// Some(NaiveDate::from_ymd_opt(2015, 3, 1).unwrap().and_hms_opt(12, 34, 56).unwrap())
1298 /// );
1299 /// assert_eq!(dt.with_ordinal(366), None); // 2015 had only 365 days
1300 ///
1301 /// let dt: NaiveDateTime =
1302 /// NaiveDate::from_ymd_opt(2016, 9, 8).unwrap().and_hms_opt(12, 34, 56).unwrap();
1303 /// assert_eq!(
1304 /// dt.with_ordinal(60),
1305 /// Some(NaiveDate::from_ymd_opt(2016, 2, 29).unwrap().and_hms_opt(12, 34, 56).unwrap())
1306 /// );
1307 /// assert_eq!(
1308 /// dt.with_ordinal(366),
1309 /// Some(NaiveDate::from_ymd_opt(2016, 12, 31).unwrap().and_hms_opt(12, 34, 56).unwrap())
1310 /// );
1311 /// ```
1312 #[inline]
1313 fn with_ordinal(&self, ordinal: u32) -> Option<NaiveDateTime> {
1314 self.date.with_ordinal(ordinal).map(|d| NaiveDateTime { date: d, ..*self })
1315 }
1316
1317 /// Makes a new `NaiveDateTime` with the day of year (starting from 0) changed.
1318 ///
1319 /// See also the [`NaiveDate::with_ordinal0`] method.
1320 ///
1321 /// # Errors
1322 ///
1323 /// Returns `None` if:
1324 /// - The resulting date does not exist (`with_ordinal0(365)` in a non-leap year).
1325 /// - The value for `ordinal0` is invalid.
1326 ///
1327 /// # Example
1328 ///
1329 /// ```
1330 /// use chrono::{Datelike, NaiveDate, NaiveDateTime};
1331 ///
1332 /// let dt: NaiveDateTime =
1333 /// NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_opt(12, 34, 56).unwrap();
1334 /// assert_eq!(
1335 /// dt.with_ordinal0(59),
1336 /// Some(NaiveDate::from_ymd_opt(2015, 3, 1).unwrap().and_hms_opt(12, 34, 56).unwrap())
1337 /// );
1338 /// assert_eq!(dt.with_ordinal0(365), None); // 2015 had only 365 days
1339 ///
1340 /// let dt: NaiveDateTime =
1341 /// NaiveDate::from_ymd_opt(2016, 9, 8).unwrap().and_hms_opt(12, 34, 56).unwrap();
1342 /// assert_eq!(
1343 /// dt.with_ordinal0(59),
1344 /// Some(NaiveDate::from_ymd_opt(2016, 2, 29).unwrap().and_hms_opt(12, 34, 56).unwrap())
1345 /// );
1346 /// assert_eq!(
1347 /// dt.with_ordinal0(365),
1348 /// Some(NaiveDate::from_ymd_opt(2016, 12, 31).unwrap().and_hms_opt(12, 34, 56).unwrap())
1349 /// );
1350 /// ```
1351 #[inline]
1352 fn with_ordinal0(&self, ordinal0: u32) -> Option<NaiveDateTime> {
1353 self.date.with_ordinal0(ordinal0).map(|d| NaiveDateTime { date: d, ..*self })
1354 }
1355}
1356
1357impl Timelike for NaiveDateTime {
1358 /// Returns the hour number from 0 to 23.
1359 ///
1360 /// See also the [`NaiveTime::hour`] method.
1361 ///
1362 /// # Example
1363 ///
1364 /// ```
1365 /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
1366 ///
1367 /// let dt: NaiveDateTime =
1368 /// NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 56, 789).unwrap();
1369 /// assert_eq!(dt.hour(), 12);
1370 /// ```
1371 #[inline]
1372 fn hour(&self) -> u32 {
1373 self.time.hour()
1374 }
1375
1376 /// Returns the minute number from 0 to 59.
1377 ///
1378 /// See also the [`NaiveTime::minute`] method.
1379 ///
1380 /// # Example
1381 ///
1382 /// ```
1383 /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
1384 ///
1385 /// let dt: NaiveDateTime =
1386 /// NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 56, 789).unwrap();
1387 /// assert_eq!(dt.minute(), 34);
1388 /// ```
1389 #[inline]
1390 fn minute(&self) -> u32 {
1391 self.time.minute()
1392 }
1393
1394 /// Returns the second number from 0 to 59.
1395 ///
1396 /// See also the [`NaiveTime::second`] method.
1397 ///
1398 /// # Example
1399 ///
1400 /// ```
1401 /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
1402 ///
1403 /// let dt: NaiveDateTime =
1404 /// NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 56, 789).unwrap();
1405 /// assert_eq!(dt.second(), 56);
1406 /// ```
1407 #[inline]
1408 fn second(&self) -> u32 {
1409 self.time.second()
1410 }
1411
1412 /// Returns the number of nanoseconds since the whole non-leap second.
1413 /// The range from 1,000,000,000 to 1,999,999,999 represents
1414 /// the [leap second](./struct.NaiveTime.html#leap-second-handling).
1415 ///
1416 /// See also the [`NaiveTime#method.nanosecond`] method.
1417 ///
1418 /// # Example
1419 ///
1420 /// ```
1421 /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
1422 ///
1423 /// let dt: NaiveDateTime =
1424 /// NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 56, 789).unwrap();
1425 /// assert_eq!(dt.nanosecond(), 789_000_000);
1426 /// ```
1427 #[inline]
1428 fn nanosecond(&self) -> u32 {
1429 self.time.nanosecond()
1430 }
1431
1432 /// Makes a new `NaiveDateTime` with the hour number changed.
1433 ///
1434 /// See also the [`NaiveTime::with_hour`] method.
1435 ///
1436 /// # Errors
1437 ///
1438 /// Returns `None` if the value for `hour` is invalid.
1439 ///
1440 /// # Example
1441 ///
1442 /// ```
1443 /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
1444 ///
1445 /// let dt: NaiveDateTime =
1446 /// NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 56, 789).unwrap();
1447 /// assert_eq!(
1448 /// dt.with_hour(7),
1449 /// Some(
1450 /// NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(7, 34, 56, 789).unwrap()
1451 /// )
1452 /// );
1453 /// assert_eq!(dt.with_hour(24), None);
1454 /// ```
1455 #[inline]
1456 fn with_hour(&self, hour: u32) -> Option<NaiveDateTime> {
1457 self.time.with_hour(hour).map(|t| NaiveDateTime { time: t, ..*self })
1458 }
1459
1460 /// Makes a new `NaiveDateTime` with the minute number changed.
1461 ///
1462 /// See also the [`NaiveTime::with_minute`] method.
1463 ///
1464 /// # Errors
1465 ///
1466 /// Returns `None` if the value for `minute` is invalid.
1467 ///
1468 /// # Example
1469 ///
1470 /// ```
1471 /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
1472 ///
1473 /// let dt: NaiveDateTime =
1474 /// NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 56, 789).unwrap();
1475 /// assert_eq!(
1476 /// dt.with_minute(45),
1477 /// Some(
1478 /// NaiveDate::from_ymd_opt(2015, 9, 8)
1479 /// .unwrap()
1480 /// .and_hms_milli_opt(12, 45, 56, 789)
1481 /// .unwrap()
1482 /// )
1483 /// );
1484 /// assert_eq!(dt.with_minute(60), None);
1485 /// ```
1486 #[inline]
1487 fn with_minute(&self, min: u32) -> Option<NaiveDateTime> {
1488 self.time.with_minute(min).map(|t| NaiveDateTime { time: t, ..*self })
1489 }
1490
1491 /// Makes a new `NaiveDateTime` with the second number changed.
1492 ///
1493 /// As with the [`second`](#method.second) method,
1494 /// the input range is restricted to 0 through 59.
1495 ///
1496 /// See also the [`NaiveTime::with_second`] method.
1497 ///
1498 /// # Errors
1499 ///
1500 /// Returns `None` if the value for `second` is invalid.
1501 ///
1502 /// # Example
1503 ///
1504 /// ```
1505 /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
1506 ///
1507 /// let dt: NaiveDateTime =
1508 /// NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 56, 789).unwrap();
1509 /// assert_eq!(
1510 /// dt.with_second(17),
1511 /// Some(
1512 /// NaiveDate::from_ymd_opt(2015, 9, 8)
1513 /// .unwrap()
1514 /// .and_hms_milli_opt(12, 34, 17, 789)
1515 /// .unwrap()
1516 /// )
1517 /// );
1518 /// assert_eq!(dt.with_second(60), None);
1519 /// ```
1520 #[inline]
1521 fn with_second(&self, sec: u32) -> Option<NaiveDateTime> {
1522 self.time.with_second(sec).map(|t| NaiveDateTime { time: t, ..*self })
1523 }
1524
1525 /// Makes a new `NaiveDateTime` with nanoseconds since the whole non-leap second changed.
1526 ///
1527 /// Returns `None` when the resulting `NaiveDateTime` would be invalid.
1528 /// As with the [`NaiveDateTime::nanosecond`] method,
1529 /// the input range can exceed 1,000,000,000 for leap seconds.
1530 ///
1531 /// See also the [`NaiveTime::with_nanosecond`] method.
1532 ///
1533 /// # Errors
1534 ///
1535 /// Returns `None` if `nanosecond >= 2,000,000,000`.
1536 ///
1537 /// # Example
1538 ///
1539 /// ```
1540 /// use chrono::{NaiveDate, NaiveDateTime, Timelike};
1541 ///
1542 /// let dt: NaiveDateTime =
1543 /// NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 59, 789).unwrap();
1544 /// assert_eq!(
1545 /// dt.with_nanosecond(333_333_333),
1546 /// Some(
1547 /// NaiveDate::from_ymd_opt(2015, 9, 8)
1548 /// .unwrap()
1549 /// .and_hms_nano_opt(12, 34, 59, 333_333_333)
1550 /// .unwrap()
1551 /// )
1552 /// );
1553 /// assert_eq!(
1554 /// dt.with_nanosecond(1_333_333_333), // leap second
1555 /// Some(
1556 /// NaiveDate::from_ymd_opt(2015, 9, 8)
1557 /// .unwrap()
1558 /// .and_hms_nano_opt(12, 34, 59, 1_333_333_333)
1559 /// .unwrap()
1560 /// )
1561 /// );
1562 /// assert_eq!(dt.with_nanosecond(2_000_000_000), None);
1563 /// ```
1564 #[inline]
1565 fn with_nanosecond(&self, nano: u32) -> Option<NaiveDateTime> {
1566 self.time.with_nanosecond(nano).map(|t| NaiveDateTime { time: t, ..*self })
1567 }
1568}
1569
1570/// Add `TimeDelta` to `NaiveDateTime`.
1571///
1572/// As a part of Chrono's [leap second handling], the addition assumes that **there is no leap
1573/// second ever**, except when the `NaiveDateTime` itself represents a leap second in which case
1574/// the assumption becomes that **there is exactly a single leap second ever**.
1575///
1576/// # Panics
1577///
1578/// Panics if the resulting date would be out of range.
1579/// Consider using [`NaiveDateTime::checked_add_signed`] to get an `Option` instead.
1580///
1581/// # Example
1582///
1583/// ```
1584/// use chrono::{NaiveDate, TimeDelta};
1585///
1586/// let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
1587///
1588/// let d = from_ymd(2016, 7, 8);
1589/// let hms = |h, m, s| d.and_hms_opt(h, m, s).unwrap();
1590/// assert_eq!(hms(3, 5, 7) + TimeDelta::zero(), hms(3, 5, 7));
1591/// assert_eq!(hms(3, 5, 7) + TimeDelta::try_seconds(1).unwrap(), hms(3, 5, 8));
1592/// assert_eq!(hms(3, 5, 7) + TimeDelta::try_seconds(-1).unwrap(), hms(3, 5, 6));
1593/// assert_eq!(hms(3, 5, 7) + TimeDelta::try_seconds(3600 + 60).unwrap(), hms(4, 6, 7));
1594/// assert_eq!(
1595/// hms(3, 5, 7) + TimeDelta::try_seconds(86_400).unwrap(),
1596/// from_ymd(2016, 7, 9).and_hms_opt(3, 5, 7).unwrap()
1597/// );
1598/// assert_eq!(
1599/// hms(3, 5, 7) + TimeDelta::try_days(365).unwrap(),
1600/// from_ymd(2017, 7, 8).and_hms_opt(3, 5, 7).unwrap()
1601/// );
1602///
1603/// let hmsm = |h, m, s, milli| d.and_hms_milli_opt(h, m, s, milli).unwrap();
1604/// assert_eq!(hmsm(3, 5, 7, 980) + TimeDelta::try_milliseconds(450).unwrap(), hmsm(3, 5, 8, 430));
1605/// ```
1606///
1607/// Leap seconds are handled,
1608/// but the addition assumes that it is the only leap second happened.
1609///
1610/// ```
1611/// # use chrono::{TimeDelta, NaiveDate};
1612/// # let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
1613/// # let hmsm = |h, m, s, milli| from_ymd(2016, 7, 8).and_hms_milli_opt(h, m, s, milli).unwrap();
1614/// let leap = hmsm(3, 5, 59, 1_300);
1615/// assert_eq!(leap + TimeDelta::zero(), hmsm(3, 5, 59, 1_300));
1616/// assert_eq!(leap + TimeDelta::try_milliseconds(-500).unwrap(), hmsm(3, 5, 59, 800));
1617/// assert_eq!(leap + TimeDelta::try_milliseconds(500).unwrap(), hmsm(3, 5, 59, 1_800));
1618/// assert_eq!(leap + TimeDelta::try_milliseconds(800).unwrap(), hmsm(3, 6, 0, 100));
1619/// assert_eq!(leap + TimeDelta::try_seconds(10).unwrap(), hmsm(3, 6, 9, 300));
1620/// assert_eq!(leap + TimeDelta::try_seconds(-10).unwrap(), hmsm(3, 5, 50, 300));
1621/// assert_eq!(leap + TimeDelta::try_days(1).unwrap(),
1622/// from_ymd(2016, 7, 9).and_hms_milli_opt(3, 5, 59, 300).unwrap());
1623/// ```
1624///
1625/// [leap second handling]: crate::NaiveTime#leap-second-handling
1626impl Add<TimeDelta> for NaiveDateTime {
1627 type Output = NaiveDateTime;
1628
1629 #[inline]
1630 fn add(self, rhs: TimeDelta) -> NaiveDateTime {
1631 self.checked_add_signed(rhs).expect("`NaiveDateTime + TimeDelta` overflowed")
1632 }
1633}
1634
1635/// Add `std::time::Duration` to `NaiveDateTime`.
1636///
1637/// As a part of Chrono's [leap second handling], the addition assumes that **there is no leap
1638/// second ever**, except when the `NaiveDateTime` itself represents a leap second in which case
1639/// the assumption becomes that **there is exactly a single leap second ever**.
1640///
1641/// # Panics
1642///
1643/// Panics if the resulting date would be out of range.
1644/// Consider using [`NaiveDateTime::checked_add_signed`] to get an `Option` instead.
1645impl Add<Duration> for NaiveDateTime {
1646 type Output = NaiveDateTime;
1647
1648 #[inline]
1649 fn add(self, rhs: Duration) -> NaiveDateTime {
1650 let rhs = TimeDelta::from_std(rhs)
1651 .expect("overflow converting from core::time::Duration to TimeDelta");
1652 self.checked_add_signed(rhs).expect("`NaiveDateTime + TimeDelta` overflowed")
1653 }
1654}
1655
1656/// Add-assign `TimeDelta` to `NaiveDateTime`.
1657///
1658/// As a part of Chrono's [leap second handling], the addition assumes that **there is no leap
1659/// second ever**, except when the `NaiveDateTime` itself represents a leap second in which case
1660/// the assumption becomes that **there is exactly a single leap second ever**.
1661///
1662/// # Panics
1663///
1664/// Panics if the resulting date would be out of range.
1665/// Consider using [`NaiveDateTime::checked_add_signed`] to get an `Option` instead.
1666impl AddAssign<TimeDelta> for NaiveDateTime {
1667 #[inline]
1668 fn add_assign(&mut self, rhs: TimeDelta) {
1669 *self = self.add(rhs);
1670 }
1671}
1672
1673/// Add-assign `std::time::Duration` to `NaiveDateTime`.
1674///
1675/// As a part of Chrono's [leap second handling], the addition assumes that **there is no leap
1676/// second ever**, except when the `NaiveDateTime` itself represents a leap second in which case
1677/// the assumption becomes that **there is exactly a single leap second ever**.
1678///
1679/// # Panics
1680///
1681/// Panics if the resulting date would be out of range.
1682/// Consider using [`NaiveDateTime::checked_add_signed`] to get an `Option` instead.
1683impl AddAssign<Duration> for NaiveDateTime {
1684 #[inline]
1685 fn add_assign(&mut self, rhs: Duration) {
1686 *self = self.add(rhs);
1687 }
1688}
1689
1690/// Add `FixedOffset` to `NaiveDateTime`.
1691///
1692/// # Panics
1693///
1694/// Panics if the resulting date would be out of range.
1695/// Consider using `checked_add_offset` to get an `Option` instead.
1696impl Add<FixedOffset> for NaiveDateTime {
1697 type Output = NaiveDateTime;
1698
1699 #[inline]
1700 fn add(self, rhs: FixedOffset) -> NaiveDateTime {
1701 self.checked_add_offset(rhs).expect("`NaiveDateTime + FixedOffset` out of range")
1702 }
1703}
1704
1705/// Add `Months` to `NaiveDateTime`.
1706///
1707/// The result will be clamped to valid days in the resulting month, see `checked_add_months` for
1708/// details.
1709///
1710/// # Panics
1711///
1712/// Panics if the resulting date would be out of range.
1713/// Consider using `checked_add_months` to get an `Option` instead.
1714///
1715/// # Example
1716///
1717/// ```
1718/// use chrono::{Months, NaiveDate};
1719///
1720/// assert_eq!(
1721/// NaiveDate::from_ymd_opt(2014, 1, 1).unwrap().and_hms_opt(1, 0, 0).unwrap() + Months::new(1),
1722/// NaiveDate::from_ymd_opt(2014, 2, 1).unwrap().and_hms_opt(1, 0, 0).unwrap()
1723/// );
1724/// assert_eq!(
1725/// NaiveDate::from_ymd_opt(2014, 1, 1).unwrap().and_hms_opt(0, 2, 0).unwrap()
1726/// + Months::new(11),
1727/// NaiveDate::from_ymd_opt(2014, 12, 1).unwrap().and_hms_opt(0, 2, 0).unwrap()
1728/// );
1729/// assert_eq!(
1730/// NaiveDate::from_ymd_opt(2014, 1, 1).unwrap().and_hms_opt(0, 0, 3).unwrap()
1731/// + Months::new(12),
1732/// NaiveDate::from_ymd_opt(2015, 1, 1).unwrap().and_hms_opt(0, 0, 3).unwrap()
1733/// );
1734/// assert_eq!(
1735/// NaiveDate::from_ymd_opt(2014, 1, 1).unwrap().and_hms_opt(0, 0, 4).unwrap()
1736/// + Months::new(13),
1737/// NaiveDate::from_ymd_opt(2015, 2, 1).unwrap().and_hms_opt(0, 0, 4).unwrap()
1738/// );
1739/// assert_eq!(
1740/// NaiveDate::from_ymd_opt(2014, 1, 31).unwrap().and_hms_opt(0, 5, 0).unwrap()
1741/// + Months::new(1),
1742/// NaiveDate::from_ymd_opt(2014, 2, 28).unwrap().and_hms_opt(0, 5, 0).unwrap()
1743/// );
1744/// assert_eq!(
1745/// NaiveDate::from_ymd_opt(2020, 1, 31).unwrap().and_hms_opt(6, 0, 0).unwrap()
1746/// + Months::new(1),
1747/// NaiveDate::from_ymd_opt(2020, 2, 29).unwrap().and_hms_opt(6, 0, 0).unwrap()
1748/// );
1749/// ```
1750impl Add<Months> for NaiveDateTime {
1751 type Output = NaiveDateTime;
1752
1753 fn add(self, rhs: Months) -> Self::Output {
1754 self.checked_add_months(rhs).expect("`NaiveDateTime + Months` out of range")
1755 }
1756}
1757
1758/// Subtract `TimeDelta` from `NaiveDateTime`.
1759///
1760/// This is the same as the addition with a negated `TimeDelta`.
1761///
1762/// As a part of Chrono's [leap second handling] the subtraction assumes that **there is no leap
1763/// second ever**, except when the `NaiveDateTime` itself represents a leap second in which case
1764/// the assumption becomes that **there is exactly a single leap second ever**.
1765///
1766/// # Panics
1767///
1768/// Panics if the resulting date would be out of range.
1769/// Consider using [`NaiveDateTime::checked_sub_signed`] to get an `Option` instead.
1770///
1771/// # Example
1772///
1773/// ```
1774/// use chrono::{NaiveDate, TimeDelta};
1775///
1776/// let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
1777///
1778/// let d = from_ymd(2016, 7, 8);
1779/// let hms = |h, m, s| d.and_hms_opt(h, m, s).unwrap();
1780/// assert_eq!(hms(3, 5, 7) - TimeDelta::zero(), hms(3, 5, 7));
1781/// assert_eq!(hms(3, 5, 7) - TimeDelta::try_seconds(1).unwrap(), hms(3, 5, 6));
1782/// assert_eq!(hms(3, 5, 7) - TimeDelta::try_seconds(-1).unwrap(), hms(3, 5, 8));
1783/// assert_eq!(hms(3, 5, 7) - TimeDelta::try_seconds(3600 + 60).unwrap(), hms(2, 4, 7));
1784/// assert_eq!(
1785/// hms(3, 5, 7) - TimeDelta::try_seconds(86_400).unwrap(),
1786/// from_ymd(2016, 7, 7).and_hms_opt(3, 5, 7).unwrap()
1787/// );
1788/// assert_eq!(
1789/// hms(3, 5, 7) - TimeDelta::try_days(365).unwrap(),
1790/// from_ymd(2015, 7, 9).and_hms_opt(3, 5, 7).unwrap()
1791/// );
1792///
1793/// let hmsm = |h, m, s, milli| d.and_hms_milli_opt(h, m, s, milli).unwrap();
1794/// assert_eq!(hmsm(3, 5, 7, 450) - TimeDelta::try_milliseconds(670).unwrap(), hmsm(3, 5, 6, 780));
1795/// ```
1796///
1797/// Leap seconds are handled,
1798/// but the subtraction assumes that it is the only leap second happened.
1799///
1800/// ```
1801/// # use chrono::{TimeDelta, NaiveDate};
1802/// # let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
1803/// # let hmsm = |h, m, s, milli| from_ymd(2016, 7, 8).and_hms_milli_opt(h, m, s, milli).unwrap();
1804/// let leap = hmsm(3, 5, 59, 1_300);
1805/// assert_eq!(leap - TimeDelta::zero(), hmsm(3, 5, 59, 1_300));
1806/// assert_eq!(leap - TimeDelta::try_milliseconds(200).unwrap(), hmsm(3, 5, 59, 1_100));
1807/// assert_eq!(leap - TimeDelta::try_milliseconds(500).unwrap(), hmsm(3, 5, 59, 800));
1808/// assert_eq!(leap - TimeDelta::try_seconds(60).unwrap(), hmsm(3, 5, 0, 300));
1809/// assert_eq!(leap - TimeDelta::try_days(1).unwrap(),
1810/// from_ymd(2016, 7, 7).and_hms_milli_opt(3, 6, 0, 300).unwrap());
1811/// ```
1812///
1813/// [leap second handling]: crate::NaiveTime#leap-second-handling
1814impl Sub<TimeDelta> for NaiveDateTime {
1815 type Output = NaiveDateTime;
1816
1817 #[inline]
1818 fn sub(self, rhs: TimeDelta) -> NaiveDateTime {
1819 self.checked_sub_signed(rhs).expect("`NaiveDateTime - TimeDelta` overflowed")
1820 }
1821}
1822
1823/// Subtract `std::time::Duration` from `NaiveDateTime`.
1824///
1825/// As a part of Chrono's [leap second handling] the subtraction assumes that **there is no leap
1826/// second ever**, except when the `NaiveDateTime` itself represents a leap second in which case
1827/// the assumption becomes that **there is exactly a single leap second ever**.
1828///
1829/// # Panics
1830///
1831/// Panics if the resulting date would be out of range.
1832/// Consider using [`NaiveDateTime::checked_sub_signed`] to get an `Option` instead.
1833impl Sub<Duration> for NaiveDateTime {
1834 type Output = NaiveDateTime;
1835
1836 #[inline]
1837 fn sub(self, rhs: Duration) -> NaiveDateTime {
1838 let rhs = TimeDelta::from_std(rhs)
1839 .expect("overflow converting from core::time::Duration to TimeDelta");
1840 self.checked_sub_signed(rhs).expect("`NaiveDateTime - TimeDelta` overflowed")
1841 }
1842}
1843
1844/// Subtract-assign `TimeDelta` from `NaiveDateTime`.
1845///
1846/// This is the same as the addition with a negated `TimeDelta`.
1847///
1848/// As a part of Chrono's [leap second handling], the addition assumes that **there is no leap
1849/// second ever**, except when the `NaiveDateTime` itself represents a leap second in which case
1850/// the assumption becomes that **there is exactly a single leap second ever**.
1851///
1852/// # Panics
1853///
1854/// Panics if the resulting date would be out of range.
1855/// Consider using [`NaiveDateTime::checked_sub_signed`] to get an `Option` instead.
1856impl SubAssign<TimeDelta> for NaiveDateTime {
1857 #[inline]
1858 fn sub_assign(&mut self, rhs: TimeDelta) {
1859 *self = self.sub(rhs);
1860 }
1861}
1862
1863/// Subtract-assign `std::time::Duration` from `NaiveDateTime`.
1864///
1865/// As a part of Chrono's [leap second handling], the addition assumes that **there is no leap
1866/// second ever**, except when the `NaiveDateTime` itself represents a leap second in which case
1867/// the assumption becomes that **there is exactly a single leap second ever**.
1868///
1869/// # Panics
1870///
1871/// Panics if the resulting date would be out of range.
1872/// Consider using [`NaiveDateTime::checked_sub_signed`] to get an `Option` instead.
1873impl SubAssign<Duration> for NaiveDateTime {
1874 #[inline]
1875 fn sub_assign(&mut self, rhs: Duration) {
1876 *self = self.sub(rhs);
1877 }
1878}
1879
1880/// Subtract `FixedOffset` from `NaiveDateTime`.
1881///
1882/// # Panics
1883///
1884/// Panics if the resulting date would be out of range.
1885/// Consider using `checked_sub_offset` to get an `Option` instead.
1886impl Sub<FixedOffset> for NaiveDateTime {
1887 type Output = NaiveDateTime;
1888
1889 #[inline]
1890 fn sub(self, rhs: FixedOffset) -> NaiveDateTime {
1891 self.checked_sub_offset(rhs).expect("`NaiveDateTime - FixedOffset` out of range")
1892 }
1893}
1894
1895/// Subtract `Months` from `NaiveDateTime`.
1896///
1897/// The result will be clamped to valid days in the resulting month, see
1898/// [`NaiveDateTime::checked_sub_months`] for details.
1899///
1900/// # Panics
1901///
1902/// Panics if the resulting date would be out of range.
1903/// Consider using [`NaiveDateTime::checked_sub_months`] to get an `Option` instead.
1904///
1905/// # Example
1906///
1907/// ```
1908/// use chrono::{Months, NaiveDate};
1909///
1910/// assert_eq!(
1911/// NaiveDate::from_ymd_opt(2014, 01, 01).unwrap().and_hms_opt(01, 00, 00).unwrap()
1912/// - Months::new(11),
1913/// NaiveDate::from_ymd_opt(2013, 02, 01).unwrap().and_hms_opt(01, 00, 00).unwrap()
1914/// );
1915/// assert_eq!(
1916/// NaiveDate::from_ymd_opt(2014, 01, 01).unwrap().and_hms_opt(00, 02, 00).unwrap()
1917/// - Months::new(12),
1918/// NaiveDate::from_ymd_opt(2013, 01, 01).unwrap().and_hms_opt(00, 02, 00).unwrap()
1919/// );
1920/// assert_eq!(
1921/// NaiveDate::from_ymd_opt(2014, 01, 01).unwrap().and_hms_opt(00, 00, 03).unwrap()
1922/// - Months::new(13),
1923/// NaiveDate::from_ymd_opt(2012, 12, 01).unwrap().and_hms_opt(00, 00, 03).unwrap()
1924/// );
1925/// ```
1926impl Sub<Months> for NaiveDateTime {
1927 type Output = NaiveDateTime;
1928
1929 fn sub(self, rhs: Months) -> Self::Output {
1930 self.checked_sub_months(rhs).expect("`NaiveDateTime - Months` out of range")
1931 }
1932}
1933
1934/// Subtracts another `NaiveDateTime` from the current date and time.
1935/// This does not overflow or underflow at all.
1936///
1937/// As a part of Chrono's [leap second handling](./struct.NaiveTime.html#leap-second-handling),
1938/// the subtraction assumes that **there is no leap second ever**,
1939/// except when any of the `NaiveDateTime`s themselves represents a leap second
1940/// in which case the assumption becomes that
1941/// **there are exactly one (or two) leap second(s) ever**.
1942///
1943/// The implementation is a wrapper around [`NaiveDateTime::signed_duration_since`].
1944///
1945/// # Example
1946///
1947/// ```
1948/// use chrono::{NaiveDate, TimeDelta};
1949///
1950/// let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
1951///
1952/// let d = from_ymd(2016, 7, 8);
1953/// assert_eq!(
1954/// d.and_hms_opt(3, 5, 7).unwrap() - d.and_hms_opt(2, 4, 6).unwrap(),
1955/// TimeDelta::try_seconds(3600 + 60 + 1).unwrap()
1956/// );
1957///
1958/// // July 8 is 190th day in the year 2016
1959/// let d0 = from_ymd(2016, 1, 1);
1960/// assert_eq!(
1961/// d.and_hms_milli_opt(0, 7, 6, 500).unwrap() - d0.and_hms_opt(0, 0, 0).unwrap(),
1962/// TimeDelta::try_seconds(189 * 86_400 + 7 * 60 + 6).unwrap()
1963/// + TimeDelta::try_milliseconds(500).unwrap()
1964/// );
1965/// ```
1966///
1967/// Leap seconds are handled, but the subtraction assumes that no other leap
1968/// seconds happened.
1969///
1970/// ```
1971/// # use chrono::{TimeDelta, NaiveDate};
1972/// # let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
1973/// let leap = from_ymd(2015, 6, 30).and_hms_milli_opt(23, 59, 59, 1_500).unwrap();
1974/// assert_eq!(
1975/// leap - from_ymd(2015, 6, 30).and_hms_opt(23, 0, 0).unwrap(),
1976/// TimeDelta::try_seconds(3600).unwrap() + TimeDelta::try_milliseconds(500).unwrap()
1977/// );
1978/// assert_eq!(
1979/// from_ymd(2015, 7, 1).and_hms_opt(1, 0, 0).unwrap() - leap,
1980/// TimeDelta::try_seconds(3600).unwrap() - TimeDelta::try_milliseconds(500).unwrap()
1981/// );
1982/// ```
1983impl Sub<NaiveDateTime> for NaiveDateTime {
1984 type Output = TimeDelta;
1985
1986 #[inline]
1987 fn sub(self, rhs: NaiveDateTime) -> TimeDelta {
1988 self.signed_duration_since(rhs)
1989 }
1990}
1991
1992/// Add `Days` to `NaiveDateTime`.
1993///
1994/// # Panics
1995///
1996/// Panics if the resulting date would be out of range.
1997/// Consider using `checked_add_days` to get an `Option` instead.
1998impl Add<Days> for NaiveDateTime {
1999 type Output = NaiveDateTime;
2000
2001 fn add(self, days: Days) -> Self::Output {
2002 self.checked_add_days(days).expect("`NaiveDateTime + Days` out of range")
2003 }
2004}
2005
2006/// Subtract `Days` from `NaiveDateTime`.
2007///
2008/// # Panics
2009///
2010/// Panics if the resulting date would be out of range.
2011/// Consider using `checked_sub_days` to get an `Option` instead.
2012impl Sub<Days> for NaiveDateTime {
2013 type Output = NaiveDateTime;
2014
2015 fn sub(self, days: Days) -> Self::Output {
2016 self.checked_sub_days(days).expect("`NaiveDateTime - Days` out of range")
2017 }
2018}
2019
2020/// The `Debug` output of the naive date and time `dt` is the same as
2021/// [`dt.format("%Y-%m-%dT%H:%M:%S%.f")`](crate::format::strftime).
2022///
2023/// The string printed can be readily parsed via the `parse` method on `str`.
2024///
2025/// It should be noted that, for leap seconds not on the minute boundary,
2026/// it may print a representation not distinguishable from non-leap seconds.
2027/// This doesn't matter in practice, since such leap seconds never happened.
2028/// (By the time of the first leap second on 1972-06-30,
2029/// every time zone offset around the world has standardized to the 5-minute alignment.)
2030///
2031/// # Example
2032///
2033/// ```
2034/// use chrono::NaiveDate;
2035///
2036/// let dt = NaiveDate::from_ymd_opt(2016, 11, 15).unwrap().and_hms_opt(7, 39, 24).unwrap();
2037/// assert_eq!(format!("{:?}", dt), "2016-11-15T07:39:24");
2038/// ```
2039///
2040/// Leap seconds may also be used.
2041///
2042/// ```
2043/// # use chrono::NaiveDate;
2044/// let dt =
2045/// NaiveDate::from_ymd_opt(2015, 6, 30).unwrap().and_hms_milli_opt(23, 59, 59, 1_500).unwrap();
2046/// assert_eq!(format!("{:?}", dt), "2015-06-30T23:59:60.500");
2047/// ```
2048impl fmt::Debug for NaiveDateTime {
2049 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2050 self.date.fmt(f)?;
2051 f.write_char('T')?;
2052 self.time.fmt(f)
2053 }
2054}
2055
2056/// The `Display` output of the naive date and time `dt` is the same as
2057/// [`dt.format("%Y-%m-%d %H:%M:%S%.f")`](crate::format::strftime).
2058///
2059/// It should be noted that, for leap seconds not on the minute boundary,
2060/// it may print a representation not distinguishable from non-leap seconds.
2061/// This doesn't matter in practice, since such leap seconds never happened.
2062/// (By the time of the first leap second on 1972-06-30,
2063/// every time zone offset around the world has standardized to the 5-minute alignment.)
2064///
2065/// # Example
2066///
2067/// ```
2068/// use chrono::NaiveDate;
2069///
2070/// let dt = NaiveDate::from_ymd_opt(2016, 11, 15).unwrap().and_hms_opt(7, 39, 24).unwrap();
2071/// assert_eq!(format!("{}", dt), "2016-11-15 07:39:24");
2072/// ```
2073///
2074/// Leap seconds may also be used.
2075///
2076/// ```
2077/// # use chrono::NaiveDate;
2078/// let dt =
2079/// NaiveDate::from_ymd_opt(2015, 6, 30).unwrap().and_hms_milli_opt(23, 59, 59, 1_500).unwrap();
2080/// assert_eq!(format!("{}", dt), "2015-06-30 23:59:60.500");
2081/// ```
2082impl fmt::Display for NaiveDateTime {
2083 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2084 self.date.fmt(f)?;
2085 f.write_char(' ')?;
2086 self.time.fmt(f)
2087 }
2088}
2089
2090/// Parsing a `str` into a `NaiveDateTime` uses the same format,
2091/// [`%Y-%m-%dT%H:%M:%S%.f`](crate::format::strftime), as in `Debug`.
2092///
2093/// # Example
2094///
2095/// ```
2096/// use chrono::{NaiveDateTime, NaiveDate};
2097///
2098/// let dt = NaiveDate::from_ymd_opt(2015, 9, 18).unwrap().and_hms_opt(23, 56, 4).unwrap();
2099/// assert_eq!("2015-09-18T23:56:04".parse::<NaiveDateTime>(), Ok(dt));
2100///
2101/// let dt = NaiveDate::from_ymd_opt(12345, 6, 7).unwrap().and_hms_milli_opt(7, 59, 59, 1_500).unwrap(); // leap second
2102/// assert_eq!("+12345-6-7T7:59:60.5".parse::<NaiveDateTime>(), Ok(dt));
2103///
2104/// assert!("foo".parse::<NaiveDateTime>().is_err());
2105/// ```
2106impl str::FromStr for NaiveDateTime {
2107 type Err = ParseError;
2108
2109 fn from_str(s: &str) -> ParseResult<NaiveDateTime> {
2110 const ITEMS: &[Item<'static>] = &[
2111 Item::Numeric(Numeric::Year, Pad::Zero),
2112 Item::Space(""),
2113 Item::Literal("-"),
2114 Item::Numeric(Numeric::Month, Pad::Zero),
2115 Item::Space(""),
2116 Item::Literal("-"),
2117 Item::Numeric(Numeric::Day, Pad::Zero),
2118 Item::Space(""),
2119 Item::Literal("T"), // XXX shouldn't this be case-insensitive?
2120 Item::Numeric(Numeric::Hour, Pad::Zero),
2121 Item::Space(""),
2122 Item::Literal(":"),
2123 Item::Numeric(Numeric::Minute, Pad::Zero),
2124 Item::Space(""),
2125 Item::Literal(":"),
2126 Item::Numeric(Numeric::Second, Pad::Zero),
2127 Item::Fixed(Fixed::Nanosecond),
2128 Item::Space(""),
2129 ];
2130
2131 let mut parsed = Parsed::new();
2132 parse(&mut parsed, s, ITEMS.iter())?;
2133 parsed.to_naive_datetime_with_offset(0)
2134 }
2135}
2136
2137/// The default value for a NaiveDateTime is one with epoch 0
2138/// that is, 1st of January 1970 at 00:00:00.
2139///
2140/// # Example
2141///
2142/// ```rust
2143/// use chrono::NaiveDateTime;
2144///
2145/// assert_eq!(NaiveDateTime::default(), NaiveDateTime::UNIX_EPOCH);
2146/// ```
2147impl Default for NaiveDateTime {
2148 fn default() -> Self {
2149 Self::UNIX_EPOCH
2150 }
2151}