@@ -3636,29 +3636,33 @@ export function UnbalanceDurationRelative(
3636
3636
case 'week' :
3637
3637
if ( ! calendar ) throw new RangeError ( 'a starting point is required for weeks balancing' ) ;
3638
3638
assertExists ( relativeTo ) ;
3639
+ const dateAdd = calendar . dateAdd ;
3639
3640
// balance years down to days
3640
3641
while ( MathAbs ( years ) > 0 ) {
3641
3642
let oneYearDays ;
3642
- ( { relativeTo, days : oneYearDays } = MoveRelativeDate ( calendar , relativeTo , oneYear ) ) ;
3643
+ ( { relativeTo, days : oneYearDays } = MoveRelativeDate ( calendar , relativeTo , oneYear , dateAdd ) ) ;
3643
3644
days += oneYearDays ;
3644
3645
years -= sign ;
3645
3646
}
3646
3647
3647
3648
// balance months down to days
3648
3649
while ( MathAbs ( months ) > 0 ) {
3649
3650
let oneMonthDays ;
3650
- ( { relativeTo, days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth ) ) ;
3651
+ ( { relativeTo, days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth , dateAdd ) ) ;
3651
3652
days += oneMonthDays ;
3652
3653
months -= sign ;
3653
3654
}
3654
3655
break ;
3655
- default :
3656
+ default : {
3656
3657
// balance years down to days
3658
+ if ( years == 0 && months == 0 && weeks == 0 ) break ;
3659
+ if ( ! calendar ) throw new RangeError ( 'a starting point is required for balancing calendar units' ) ;
3660
+ const dateAdd = calendar . dateAdd ;
3657
3661
while ( MathAbs ( years ) > 0 ) {
3658
3662
if ( ! calendar ) throw new RangeError ( 'a starting point is required for balancing calendar units' ) ;
3659
3663
assertExists ( relativeTo ) ;
3660
3664
let oneYearDays ;
3661
- ( { relativeTo, days : oneYearDays } = MoveRelativeDate ( calendar , relativeTo , oneYear ) ) ;
3665
+ ( { relativeTo, days : oneYearDays } = MoveRelativeDate ( calendar , relativeTo , oneYear , dateAdd ) ) ;
3662
3666
days += oneYearDays ;
3663
3667
years -= sign ;
3664
3668
}
@@ -3668,7 +3672,7 @@ export function UnbalanceDurationRelative(
3668
3672
if ( ! calendar ) throw new RangeError ( 'a starting point is required for balancing calendar units' ) ;
3669
3673
assertExists ( relativeTo ) ;
3670
3674
let oneMonthDays ;
3671
- ( { relativeTo, days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth ) ) ;
3675
+ ( { relativeTo, days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth , dateAdd ) ) ;
3672
3676
days += oneMonthDays ;
3673
3677
months -= sign ;
3674
3678
}
@@ -3678,11 +3682,12 @@ export function UnbalanceDurationRelative(
3678
3682
if ( ! calendar ) throw new RangeError ( 'a starting point is required for balancing calendar units' ) ;
3679
3683
assertExists ( relativeTo ) ;
3680
3684
let oneWeekDays ;
3681
- ( { relativeTo, days : oneWeekDays } = MoveRelativeDate ( calendar , relativeTo , oneWeek ) ) ;
3685
+ ( { relativeTo, days : oneWeekDays } = MoveRelativeDate ( calendar , relativeTo , oneWeek , dateAdd ) ) ;
3682
3686
days += oneWeekDays ;
3683
3687
weeks -= sign ;
3684
3688
}
3685
3689
break ;
3690
+ }
3686
3691
}
3687
3692
3688
3693
return { years, months, weeks, days } ;
@@ -3719,28 +3724,28 @@ export function BalanceDurationRelative(
3719
3724
case 'year' : {
3720
3725
if ( ! calendar ) throw new RangeError ( 'a starting point is required for years balancing' ) ;
3721
3726
assertExists ( relativeTo ) ;
3727
+ const dateAdd = calendar . dateAdd ;
3722
3728
// balance days up to years
3723
3729
let newRelativeTo , oneYearDays ;
3724
- ( { relativeTo : newRelativeTo , days : oneYearDays } = MoveRelativeDate ( calendar , relativeTo , oneYear ) ) ;
3730
+ ( { relativeTo : newRelativeTo , days : oneYearDays } = MoveRelativeDate ( calendar , relativeTo , oneYear , dateAdd ) ) ;
3725
3731
while ( MathAbs ( days ) >= MathAbs ( oneYearDays ) ) {
3726
3732
days -= oneYearDays ;
3727
3733
years += sign ;
3728
3734
relativeTo = newRelativeTo ;
3729
- ( { relativeTo : newRelativeTo , days : oneYearDays } = MoveRelativeDate ( calendar , relativeTo , oneYear ) ) ;
3735
+ ( { relativeTo : newRelativeTo , days : oneYearDays } = MoveRelativeDate ( calendar , relativeTo , oneYear , dateAdd ) ) ;
3730
3736
}
3731
3737
3732
3738
// balance days up to months
3733
3739
let oneMonthDays ;
3734
- ( { relativeTo : newRelativeTo , days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth ) ) ;
3740
+ ( { relativeTo : newRelativeTo , days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth , dateAdd ) ) ;
3735
3741
while ( MathAbs ( days ) >= MathAbs ( oneMonthDays ) ) {
3736
3742
days -= oneMonthDays ;
3737
3743
months += sign ;
3738
3744
relativeTo = newRelativeTo ;
3739
- ( { relativeTo : newRelativeTo , days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth ) ) ;
3745
+ ( { relativeTo : newRelativeTo , days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth , dateAdd ) ) ;
3740
3746
}
3741
3747
3742
3748
// balance months up to years
3743
- const dateAdd = calendar . dateAdd ;
3744
3749
newRelativeTo = CalendarDateAdd ( calendar , relativeTo , oneYear , undefined , dateAdd ) ;
3745
3750
const dateUntil = calendar . dateUntil ;
3746
3751
const untilOptions = ObjectCreate ( null ) ;
@@ -3762,28 +3767,30 @@ export function BalanceDurationRelative(
3762
3767
case 'month' : {
3763
3768
if ( ! calendar ) throw new RangeError ( 'a starting point is required for months balancing' ) ;
3764
3769
assertExists ( relativeTo ) ;
3770
+ const dateAdd = calendar . dateAdd ;
3765
3771
// balance days up to months
3766
3772
let newRelativeTo , oneMonthDays ;
3767
- ( { relativeTo : newRelativeTo , days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth ) ) ;
3773
+ ( { relativeTo : newRelativeTo , days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth , dateAdd ) ) ;
3768
3774
while ( MathAbs ( days ) >= MathAbs ( oneMonthDays ) ) {
3769
3775
days -= oneMonthDays ;
3770
3776
months += sign ;
3771
3777
relativeTo = newRelativeTo ;
3772
- ( { relativeTo : newRelativeTo , days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth ) ) ;
3778
+ ( { relativeTo : newRelativeTo , days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth , dateAdd ) ) ;
3773
3779
}
3774
3780
break ;
3775
3781
}
3776
3782
case 'week' : {
3777
3783
if ( ! calendar ) throw new RangeError ( 'a starting point is required for weeks balancing' ) ;
3778
3784
assertExists ( relativeTo ) ;
3785
+ const dateAdd = calendar . dateAdd ;
3779
3786
// balance days up to weeks
3780
3787
let newRelativeTo , oneWeekDays ;
3781
- ( { relativeTo : newRelativeTo , days : oneWeekDays } = MoveRelativeDate ( calendar , relativeTo , oneWeek ) ) ;
3788
+ ( { relativeTo : newRelativeTo , days : oneWeekDays } = MoveRelativeDate ( calendar , relativeTo , oneWeek , dateAdd ) ) ;
3782
3789
while ( MathAbs ( days ) >= MathAbs ( oneWeekDays ) ) {
3783
3790
days -= oneWeekDays ;
3784
3791
weeks += sign ;
3785
3792
relativeTo = newRelativeTo ;
3786
- ( { relativeTo : newRelativeTo , days : oneWeekDays } = MoveRelativeDate ( calendar , relativeTo , oneWeek ) ) ;
3793
+ ( { relativeTo : newRelativeTo , days : oneWeekDays } = MoveRelativeDate ( calendar , relativeTo , oneWeek , dateAdd ) ) ;
3787
3794
}
3788
3795
break ;
3789
3796
}
@@ -5814,16 +5821,17 @@ export function RoundDuration(
5814
5821
case 'week' : {
5815
5822
if ( ! calendar ) throw new RangeError ( 'A starting point is required for weeks rounding' ) ;
5816
5823
assertExists ( relativeTo ) ;
5824
+ const dateAdd = calendar . dateAdd ;
5817
5825
// Weeks may be different lengths of days depending on the calendar,
5818
5826
// convert days to weeks in a loop as described above under 'years'.
5819
5827
const sign = MathSign ( days ) ;
5820
5828
const oneWeek = new TemporalDuration ( 0 , 0 , days < 0 ? - 1 : 1 ) ;
5821
5829
let oneWeekDays ;
5822
- ( { relativeTo, days : oneWeekDays } = MoveRelativeDate ( calendar , relativeTo , oneWeek ) ) ;
5830
+ ( { relativeTo, days : oneWeekDays } = MoveRelativeDate ( calendar , relativeTo , oneWeek , dateAdd ) ) ;
5823
5831
while ( MathAbs ( days ) >= MathAbs ( oneWeekDays ) ) {
5824
5832
weeks += sign ;
5825
5833
days -= oneWeekDays ;
5826
- ( { relativeTo, days : oneWeekDays } = MoveRelativeDate ( calendar , relativeTo , oneWeek ) ) ;
5834
+ ( { relativeTo, days : oneWeekDays } = MoveRelativeDate ( calendar , relativeTo , oneWeek , dateAdd ) ) ;
5827
5835
}
5828
5836
oneWeekDays = MathAbs ( oneWeekDays ) ;
5829
5837
// dayLengthNs is never undefined if unit is `day` or larger.
0 commit comments