@@ -4127,21 +4127,35 @@ function DifferenceInstant(
4127
4127
ns1 : JSBI ,
4128
4128
ns2 : JSBI ,
4129
4129
increment : number ,
4130
- unit : keyof typeof nsPerTimeUnit ,
4130
+ smallestUnit : keyof typeof nsPerTimeUnit ,
4131
+ largestUnit : keyof typeof nsPerTimeUnit ,
4131
4132
roundingMode : Temporal . RoundingMode
4132
4133
) {
4133
4134
const diff = JSBI . subtract ( ns2 , ns1 ) ;
4134
4135
4135
- const remainder = JSBI . remainder ( diff , JSBI . BigInt ( 86400e9 ) ) ;
4136
- const wholeDays = JSBI . subtract ( diff , remainder ) ;
4137
- const roundedRemainder = RoundNumberToIncrement ( remainder , nsPerTimeUnit [ unit ] * increment , roundingMode ) ;
4138
- const roundedDiff = JSBI . add ( wholeDays , roundedRemainder ) ;
4136
+ let hours = 0 ;
4137
+ let minutes = 0 ;
4138
+ let nanoseconds = JSBI . toNumber ( JSBI . remainder ( diff , THOUSAND ) ) ;
4139
+ let microseconds = JSBI . toNumber ( JSBI . remainder ( JSBI . divide ( diff , THOUSAND ) , THOUSAND ) ) ;
4140
+ let milliseconds = JSBI . toNumber ( JSBI . remainder ( JSBI . divide ( diff , MILLION ) , THOUSAND ) ) ;
4141
+ let seconds = JSBI . toNumber ( JSBI . divide ( diff , BILLION ) ) ;
4139
4142
4140
- const nanoseconds = JSBI . toNumber ( JSBI . remainder ( roundedDiff , THOUSAND ) ) ;
4141
- const microseconds = JSBI . toNumber ( JSBI . remainder ( JSBI . divide ( roundedDiff , THOUSAND ) , THOUSAND ) ) ;
4142
- const milliseconds = JSBI . toNumber ( JSBI . remainder ( JSBI . divide ( roundedDiff , MILLION ) , THOUSAND ) ) ;
4143
- const seconds = JSBI . toNumber ( JSBI . divide ( roundedDiff , BILLION ) ) ;
4144
- return { seconds, milliseconds, microseconds, nanoseconds } ;
4143
+ ( { hours, minutes, seconds, milliseconds, microseconds, nanoseconds } = RoundDuration (
4144
+ 0 ,
4145
+ 0 ,
4146
+ 0 ,
4147
+ 0 ,
4148
+ 0 ,
4149
+ 0 ,
4150
+ seconds ,
4151
+ milliseconds ,
4152
+ microseconds ,
4153
+ nanoseconds ,
4154
+ increment ,
4155
+ smallestUnit ,
4156
+ roundingMode
4157
+ ) ) ;
4158
+ return BalanceDuration ( 0 , hours , minutes , seconds , milliseconds , microseconds , nanoseconds , largestUnit ) ;
4145
4159
}
4146
4160
4147
4161
function DifferenceISODateTime (
@@ -4335,24 +4349,14 @@ export function DifferenceTemporalInstant(
4335
4349
const roundingIncrement = ToTemporalRoundingIncrement ( options , MAX_DIFFERENCE_INCREMENTS [ smallestUnit ] , false ) ;
4336
4350
const onens = GetSlot ( first , EPOCHNANOSECONDS ) ;
4337
4351
const twons = GetSlot ( second , EPOCHNANOSECONDS ) ;
4338
- let { seconds, milliseconds, microseconds, nanoseconds } = DifferenceInstant (
4352
+ let { hours , minutes , seconds, milliseconds, microseconds, nanoseconds } = DifferenceInstant (
4339
4353
onens ,
4340
4354
twons ,
4341
4355
roundingIncrement ,
4342
4356
smallestUnit ,
4357
+ largestUnit ,
4343
4358
roundingMode
4344
4359
) ;
4345
- let hours , minutes ;
4346
- ( { hours, minutes, seconds, milliseconds, microseconds, nanoseconds } = BalanceDuration (
4347
- 0 ,
4348
- 0 ,
4349
- 0 ,
4350
- seconds ,
4351
- milliseconds ,
4352
- microseconds ,
4353
- nanoseconds ,
4354
- largestUnit
4355
- ) ) ;
4356
4360
const Duration = GetIntrinsic ( '%Temporal.Duration%' ) ;
4357
4361
return new Duration ( 0 , 0 , 0 , 0 , hours , minutes , seconds , milliseconds , microseconds , nanoseconds ) ;
4358
4362
}
@@ -4695,26 +4699,17 @@ export function DifferenceTemporalZonedDateTime(
4695
4699
months = 0 ;
4696
4700
weeks = 0 ;
4697
4701
days = 0 ;
4698
- ( { seconds, milliseconds, microseconds, nanoseconds } = DifferenceInstant (
4702
+ ( { hours , minutes , seconds, milliseconds, microseconds, nanoseconds } = DifferenceInstant (
4699
4703
ns1 ,
4700
4704
ns2 ,
4701
4705
roundingIncrement ,
4702
4706
// TODO this doesn't type-check as it includes >= day-size units
4703
4707
// This is probably safe as the typing for ToSmallestTemporalUnit isn't
4704
4708
// very good.
4705
4709
smallestUnit as any ,
4710
+ largestUnit ,
4706
4711
roundingMode
4707
4712
) ) ;
4708
- ( { hours, minutes, seconds, milliseconds, microseconds, nanoseconds } = BalanceDuration (
4709
- 0 ,
4710
- 0 ,
4711
- 0 ,
4712
- seconds ,
4713
- milliseconds ,
4714
- microseconds ,
4715
- nanoseconds ,
4716
- largestUnit
4717
- ) ) ;
4718
4713
} else {
4719
4714
const timeZone = GetSlot ( zonedDateTime , TIME_ZONE ) ;
4720
4715
if ( ! TimeZoneEquals ( timeZone , GetSlot ( other , TIME_ZONE ) ) ) {
@@ -4952,23 +4947,14 @@ function AddDuration(
4952
4947
months = 0 ;
4953
4948
weeks = 0 ;
4954
4949
days = 0 ;
4955
- ( { seconds, milliseconds, microseconds, nanoseconds } = DifferenceInstant (
4950
+ ( { hours , minutes , seconds, milliseconds, microseconds, nanoseconds } = DifferenceInstant (
4956
4951
GetSlot ( relativeTo , EPOCHNANOSECONDS ) ,
4957
4952
endNs ,
4958
4953
1 ,
4959
4954
'nanosecond' ,
4955
+ largestUnit ,
4960
4956
'halfExpand'
4961
4957
) ) ;
4962
- ( { hours, minutes, seconds, milliseconds, microseconds, nanoseconds } = BalanceDuration (
4963
- 0 ,
4964
- 0 ,
4965
- 0 ,
4966
- seconds ,
4967
- milliseconds ,
4968
- microseconds ,
4969
- nanoseconds ,
4970
- largestUnit
4971
- ) ) ;
4972
4958
} else {
4973
4959
( { years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds } =
4974
4960
DifferenceZonedDateTime (
0 commit comments