@@ -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 {
437438impl 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 {
453468impl 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