Skip to content

Commit 7613e6b

Browse files
authored
feat: Add support for time::PrimitiveDateTime (#322)
Mark `TryFrom<OffsetDateTime> for DateTime` and `TryFrom<DateTime> for OffsetDateTime` as deprecated.
1 parent a7b80cf commit 7613e6b

File tree

1 file changed

+85
-8
lines changed

1 file changed

+85
-8
lines changed

src/types.rs

Lines changed: 85 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ impl DateTime {
137137
/// Returns the current time if possible, otherwise the default of 1980-01-01.
138138
#[cfg(feature = "time")]
139139
pub fn default_for_write() -> Self {
140-
OffsetDateTime::now_utc()
140+
let now = OffsetDateTime::now_utc();
141+
PrimitiveDateTime::new(now.date(), now.time())
141142
.try_into()
142143
.unwrap_or_else(|_| DateTime::default())
143144
}
@@ -437,7 +438,21 @@ impl DateTime {
437438
impl TryFrom<OffsetDateTime> for DateTime {
438439
type Error = DateTimeRangeError;
439440

441+
#[allow(useless_deprecated)]
442+
#[deprecated(
443+
since = "2.5.0",
444+
note = "use `TryFrom<PrimitiveDateTime> for DateTime` instead"
445+
)]
440446
fn try_from(dt: OffsetDateTime) -> Result<Self, Self::Error> {
447+
Self::try_from(PrimitiveDateTime::new(dt.date(), dt.time()))
448+
}
449+
}
450+
451+
#[cfg(feature = "time")]
452+
impl TryFrom<PrimitiveDateTime> for DateTime {
453+
type Error = DateTimeRangeError;
454+
455+
fn try_from(dt: PrimitiveDateTime) -> Result<Self, Self::Error> {
441456
Self::from_date_and_time(
442457
dt.year().try_into()?,
443458
dt.month().into(),
@@ -453,11 +468,25 @@ impl TryFrom<OffsetDateTime> for DateTime {
453468
impl TryFrom<DateTime> for OffsetDateTime {
454469
type Error = ComponentRange;
455470

471+
#[allow(useless_deprecated)]
472+
#[deprecated(
473+
since = "2.5.0",
474+
note = "use `TryFrom<DateTime> for PrimitiveDateTime` instead"
475+
)]
476+
fn try_from(dt: DateTime) -> Result<Self, Self::Error> {
477+
PrimitiveDateTime::try_from(dt).map(PrimitiveDateTime::assume_utc)
478+
}
479+
}
480+
481+
#[cfg(feature = "time")]
482+
impl TryFrom<DateTime> for PrimitiveDateTime {
483+
type Error = ComponentRange;
484+
456485
fn try_from(dt: DateTime) -> Result<Self, Self::Error> {
457486
let date =
458487
Date::from_calendar_date(dt.year() as i32, Month::try_from(dt.month())?, dt.day())?;
459488
let time = Time::from_hms(dt.hour(), dt.minute(), dt.second())?;
460-
Ok(PrimitiveDateTime::new(date, time).assume_utc())
489+
Ok(PrimitiveDateTime::new(date, time))
461490
}
462491
}
463492

@@ -1314,7 +1343,7 @@ mod test {
13141343
}
13151344

13161345
#[cfg(feature = "time")]
1317-
use time::{format_description::well_known::Rfc3339, OffsetDateTime};
1346+
use time::{format_description::well_known::Rfc3339, OffsetDateTime, PrimitiveDateTime};
13181347

13191348
#[cfg(feature = "time")]
13201349
#[test]
@@ -1333,23 +1362,40 @@ mod test {
13331362
assert_eq!(dt.second(), 30);
13341363
}
13351364

1365+
#[cfg(feature = "time")]
1366+
#[test]
1367+
fn datetime_try_from_primitive_datetime() {
1368+
use time::macros::datetime;
1369+
1370+
use super::DateTime;
1371+
1372+
// 2018-11-17 10:38:30
1373+
let dt = DateTime::try_from(datetime!(2018-11-17 10:38:30)).unwrap();
1374+
assert_eq!(dt.year(), 2018);
1375+
assert_eq!(dt.month(), 11);
1376+
assert_eq!(dt.day(), 17);
1377+
assert_eq!(dt.hour(), 10);
1378+
assert_eq!(dt.minute(), 38);
1379+
assert_eq!(dt.second(), 30);
1380+
}
1381+
13361382
#[cfg(feature = "time")]
13371383
#[test]
13381384
fn datetime_try_from_bounds() {
13391385
use super::DateTime;
13401386
use time::macros::datetime;
13411387

13421388
// 1979-12-31 23:59:59
1343-
assert!(DateTime::try_from(datetime!(1979-12-31 23:59:59 UTC)).is_err());
1389+
assert!(DateTime::try_from(datetime!(1979-12-31 23:59:59)).is_err());
13441390

13451391
// 1980-01-01 00:00:00
1346-
assert!(DateTime::try_from(datetime!(1980-01-01 00:00:00 UTC)).is_ok());
1392+
assert!(DateTime::try_from(datetime!(1980-01-01 00:00:00)).is_ok());
13471393

13481394
// 2107-12-31 23:59:59
1349-
assert!(DateTime::try_from(datetime!(2107-12-31 23:59:59 UTC)).is_ok());
1395+
assert!(DateTime::try_from(datetime!(2107-12-31 23:59:59)).is_ok());
13501396

13511397
// 2108-01-01 00:00:00
1352-
assert!(DateTime::try_from(datetime!(2108-01-01 00:00:00 UTC)).is_err());
1398+
assert!(DateTime::try_from(datetime!(2108-01-01 00:00:00)).is_err());
13531399
}
13541400

13551401
#[cfg(feature = "time")]
@@ -1365,6 +1411,19 @@ mod test {
13651411
assert_eq!(dt, datetime!(2018-11-17 10:38:30 UTC));
13661412
}
13671413

1414+
#[cfg(feature = "time")]
1415+
#[test]
1416+
fn primitive_datetime_try_from_datetime() {
1417+
use time::macros::datetime;
1418+
1419+
use super::DateTime;
1420+
1421+
// 2018-11-17 10:38:30
1422+
let dt =
1423+
PrimitiveDateTime::try_from(DateTime::try_from_msdos(0x4D71, 0x54CF).unwrap()).unwrap();
1424+
assert_eq!(dt, datetime!(2018-11-17 10:38:30));
1425+
}
1426+
13681427
#[cfg(feature = "time")]
13691428
#[test]
13701429
fn offset_datetime_try_from_bounds() {
@@ -1383,6 +1442,24 @@ mod test {
13831442
.is_err());
13841443
}
13851444

1445+
#[cfg(feature = "time")]
1446+
#[test]
1447+
fn primitive_datetime_try_from_bounds() {
1448+
use super::DateTime;
1449+
1450+
// 1980-00-00 00:00:00
1451+
assert!(PrimitiveDateTime::try_from(unsafe {
1452+
DateTime::from_msdos_unchecked(0x0000, 0x0000)
1453+
})
1454+
.is_err());
1455+
1456+
// 2107-15-31 31:63:62
1457+
assert!(PrimitiveDateTime::try_from(unsafe {
1458+
DateTime::from_msdos_unchecked(0xFFFF, 0xFFFF)
1459+
})
1460+
.is_err());
1461+
}
1462+
13861463
#[cfg(feature = "jiff-02")]
13871464
#[test]
13881465
fn datetime_try_from_civil_datetime() {
@@ -1517,6 +1594,6 @@ mod test {
15171594
// 2020-01-01 00:00:00
15181595
let clock = OffsetDateTime::from_unix_timestamp(1_577_836_800).unwrap();
15191596

1520-
assert!(DateTime::try_from(clock).is_ok());
1597+
assert!(DateTime::try_from(PrimitiveDateTime::new(clock.date(), clock.time())).is_ok());
15211598
}
15221599
}

0 commit comments

Comments
 (0)