@@ -514,8 +514,52 @@ impl ZonedDateTime {
514514 self . instant
515515 }
516516
517- pub fn with ( & self , _partial : PartialZonedDateTime ) -> TemporalResult < Self > {
518- Err ( TemporalError :: general ( "Not yet implemented" ) )
517+ pub fn with (
518+ & self ,
519+ partial : PartialZonedDateTime ,
520+ disambiguation : Disambiguation ,
521+ offset_option : OffsetDisambiguation ,
522+ overflow : Option < ArithmeticOverflow > ,
523+ provider : & impl TimeZoneProvider ,
524+ ) -> TemporalResult < Self > {
525+ // 23. Let dateTimeResult be ? InterpretTemporalDateTimeFields(calendar, fields, overflow).
526+ let result_date = self . calendar . date_from_partial (
527+ & partial. date . with_fallback_zoneddatetime ( self , provider) ?,
528+ overflow. unwrap_or ( ArithmeticOverflow :: Constrain ) ,
529+ ) ?;
530+
531+ let original_iso = self . tz . get_iso_datetime_for ( & self . instant , provider) ?. time ;
532+ let time = original_iso. with (
533+ partial. time ,
534+ overflow. unwrap_or ( ArithmeticOverflow :: Constrain ) ,
535+ ) ?;
536+
537+ // 24. Let newOffsetNanoseconds be ! ParseDateTimeUTCOffset(fields.[[OffsetString]]).
538+ let original_offset = self . offset_nanoseconds_with_provider ( provider) ?;
539+ let new_offset_nanos = partial
540+ . offset
541+ . map ( |offset| i64:: from ( offset. 0 ) * 60_000_000_000 )
542+ . or ( Some ( original_offset) ) ;
543+
544+ // 25. Let epochNanoseconds be ? InterpretISODateTimeOffset(dateTimeResult.[[ISODate]], dateTimeResult.[[Time]], option, newOffsetNanoseconds, timeZone, disambiguation, offset, match-exactly).
545+ let epoch_nanos = interpret_isodatetime_offset (
546+ result_date. iso ,
547+ Some ( time) ,
548+ false ,
549+ new_offset_nanos,
550+ & self . tz ,
551+ disambiguation,
552+ offset_option,
553+ true ,
554+ provider,
555+ ) ?;
556+
557+ // 26. Return ! CreateTemporalZonedDateTime(epochNanoseconds, timeZone, calendar).
558+ Ok ( Self :: new_unchecked (
559+ Instant :: from ( epoch_nanos) ,
560+ self . calendar . clone ( ) ,
561+ self . tz . clone ( ) ,
562+ ) )
519563 }
520564
521565 /// Creates a new `ZonedDateTime` from the current `ZonedDateTime`
@@ -1366,4 +1410,64 @@ mod tests {
13661410 assert_eq ! ( diff. microseconds( ) , 0 ) ;
13671411 assert_eq ! ( diff. nanoseconds( ) , 0 ) ;
13681412 }
1413+
1414+ #[ test]
1415+ // subclassing_ignored.js
1416+ fn subclassing_ignored ( ) {
1417+ // Javacript
1418+ // TemporalHelpers.checkSubclassingIgnored(
1419+ // Temporal.ZonedDateTime,
1420+ // [10n, "UTC"],
1421+ // "with",
1422+ // [{ year: 2000 }],
1423+ // (result) => {
1424+ // assert.sameValue(result.epochNanoseconds, 946684800_000_000_010n, "epochNanoseconds result");
1425+ // assert.sameValue(result.year, 2000, "year result");
1426+ // assert.sameValue(result.month, 1, "month result");
1427+ // assert.sameValue(result.day, 1, "day result");
1428+ // assert.sameValue(result.hour, 0, "hour result");
1429+ // assert.sameValue(result.minute, 0, "minute result");
1430+ // assert.sameValue(result.second, 0, "second result");
1431+ // assert.sameValue(result.millisecond, 0, "millisecond result");
1432+ // assert.sameValue(result.microsecond, 0, "microsecond result");
1433+ // assert.sameValue(result.nanosecond, 10, "nanosecond result");
1434+ // },
1435+ // );
1436+
1437+ let provider = & FsTzdbProvider :: default ( ) ;
1438+ let zdt = ZonedDateTime :: try_new ( 10_000_000_010 , Calendar :: default ( ) , TimeZone :: default ( ) )
1439+ . unwrap ( ) ;
1440+
1441+ let partial_zdt = PartialZonedDateTime {
1442+ date : PartialDate {
1443+ year : Some ( 2000 ) ,
1444+ ..Default :: default ( )
1445+ } ,
1446+ ..Default :: default ( )
1447+ } ;
1448+
1449+ let result = zdt
1450+ . with (
1451+ partial_zdt,
1452+ Disambiguation :: Compatible ,
1453+ OffsetDisambiguation :: Prefer ,
1454+ None ,
1455+ provider,
1456+ )
1457+ . unwrap ( ) ;
1458+
1459+ assert_eq ! (
1460+ result. epoch_nanoseconds( ) ,
1461+ & EpochNanoseconds ( 946684800_000_000_010 )
1462+ ) ;
1463+ assert_eq ! ( result. year_with_provider( provider) . unwrap( ) , 2000 ) ;
1464+ assert_eq ! ( result. month_with_provider( provider) . unwrap( ) , 1 ) ;
1465+ assert_eq ! ( result. day_with_provider( provider) . unwrap( ) , 1 ) ;
1466+ assert_eq ! ( result. hour_with_provider( provider) . unwrap( ) , 0 ) ;
1467+ assert_eq ! ( result. minute_with_provider( provider) . unwrap( ) , 0 ) ;
1468+ assert_eq ! ( result. second_with_provider( provider) . unwrap( ) , 0 ) ;
1469+ assert_eq ! ( result. millisecond_with_provider( provider) . unwrap( ) , 0 ) ;
1470+ assert_eq ! ( result. microsecond_with_provider( provider) . unwrap( ) , 0 ) ;
1471+ assert_eq ! ( result. nanosecond_with_provider( provider) . unwrap( ) , 10 ) ;
1472+ }
13691473}
0 commit comments