@@ -922,7 +922,7 @@ export function ToRelativeTemporalObject(options: {
922
922
| Temporal . PlainDateTimeLike
923
923
| string
924
924
| undefined ;
925
- } ) : Temporal . ZonedDateTime | Temporal . PlainDateTime | undefined {
925
+ } ) : Temporal . ZonedDateTime | Temporal . PlainDate | undefined {
926
926
const relativeTo = options . relativeTo ;
927
927
// TODO: `as undefined` below should not be needed. Verify that it can be
928
928
// removed after strictNullChecks is enabled.
@@ -932,21 +932,8 @@ export function ToRelativeTemporalObject(options: {
932
932
let matchMinutes = false ;
933
933
let year , month , day , hour , minute , second , millisecond , microsecond , nanosecond , calendar , timeZone , offset ;
934
934
if ( IsObject ( relativeTo ) ) {
935
- if ( IsTemporalZonedDateTime ( relativeTo ) || IsTemporalDateTime ( relativeTo ) ) return relativeTo ;
936
- if ( IsTemporalDate ( relativeTo ) ) {
937
- return CreateTemporalDateTime (
938
- GetSlot ( relativeTo , ISO_YEAR ) ,
939
- GetSlot ( relativeTo , ISO_MONTH ) ,
940
- GetSlot ( relativeTo , ISO_DAY ) ,
941
- 0 ,
942
- 0 ,
943
- 0 ,
944
- 0 ,
945
- 0 ,
946
- 0 ,
947
- GetSlot ( relativeTo , CALENDAR )
948
- ) ;
949
- }
935
+ if ( IsTemporalZonedDateTime ( relativeTo ) || IsTemporalDate ( relativeTo ) ) return relativeTo ;
936
+ if ( IsTemporalDateTime ( relativeTo ) ) return TemporalDateTimeToDate ( relativeTo ) ;
950
937
calendar = GetTemporalCalendarWithISODefault ( relativeTo ) ;
951
938
const fieldNames = CalendarFields ( calendar , [
952
939
'day' ,
@@ -1011,7 +998,7 @@ export function ToRelativeTemporalObject(options: {
1011
998
) ;
1012
999
return CreateTemporalZonedDateTime ( epochNanoseconds , timeZone , calendar ) ;
1013
1000
}
1014
- return CreateTemporalDateTime ( year , month , day , hour , minute , second , millisecond , microsecond , nanosecond , calendar ) ;
1001
+ return CreateTemporalDate ( year , month , day , calendar ) ;
1015
1002
}
1016
1003
1017
1004
export function ValidateTemporalUnitRange ( largestUnit : Temporal . DateTimeUnit , smallestUnit : Temporal . DateTimeUnit ) {
@@ -1243,7 +1230,7 @@ function ToTemporalZonedDateTimeFields(
1243
1230
export function ToTemporalDate (
1244
1231
itemParam : PlainDateParams [ 'from' ] [ 0 ] ,
1245
1232
options : PlainDateParams [ 'from' ] [ 1 ] = ObjectCreate ( null )
1246
- ) {
1233
+ ) : Temporal . PlainDate {
1247
1234
let item = itemParam ;
1248
1235
if ( IsObject ( item ) ) {
1249
1236
if ( IsTemporalDate ( item ) ) return item ;
@@ -3326,9 +3313,9 @@ export function UnbalanceDurationRelative(
3326
3313
const sign = DurationSign ( years , months , weeks , days , 0 , 0 , 0 , 0 , 0 , 0 ) ;
3327
3314
3328
3315
let calendar ;
3329
- let relativeTo : Temporal . PlainDateTime ;
3316
+ let relativeTo : Temporal . PlainDate ;
3330
3317
if ( relativeToParam ) {
3331
- relativeTo = ToTemporalDateTime ( relativeToParam ) ;
3318
+ relativeTo = ToTemporalDate ( relativeToParam ) ;
3332
3319
calendar = GetSlot ( relativeTo , CALENDAR ) ;
3333
3320
}
3334
3321
@@ -3428,9 +3415,9 @@ export function BalanceDurationRelative(
3428
3415
if ( sign === 0 ) return { years, months, weeks, days } ;
3429
3416
3430
3417
let calendar ;
3431
- let relativeTo : Temporal . PlainDateTime ;
3418
+ let relativeTo : Temporal . PlainDate ;
3432
3419
if ( relativeToParam ) {
3433
- relativeTo = ToTemporalDateTime ( relativeToParam ) ;
3420
+ relativeTo = ToTemporalDate ( relativeToParam ) ;
3434
3421
calendar = GetSlot ( relativeTo , CALENDAR ) ;
3435
3422
}
3436
3423
@@ -3470,16 +3457,15 @@ export function BalanceDurationRelative(
3470
3457
untilOptions . largestUnit = 'month' ;
3471
3458
let untilResult = CalendarDateUntil ( calendar , relativeTo , newRelativeTo , untilOptions , dateUntil ) ;
3472
3459
let oneYearMonths = GetSlot ( untilResult , MONTHS ) ;
3473
- let relativeToDateOnly : Temporal . PlainDateLike = relativeTo ;
3474
3460
while ( MathAbs ( months ) >= MathAbs ( oneYearMonths ) ) {
3475
3461
months -= oneYearMonths ;
3476
3462
years += sign ;
3477
- relativeToDateOnly = newRelativeTo ;
3463
+ relativeTo = newRelativeTo ;
3478
3464
const addOptions = ObjectCreate ( null ) ;
3479
- newRelativeTo = CalendarDateAdd ( calendar , relativeToDateOnly , oneYear , addOptions , dateAdd ) ;
3465
+ newRelativeTo = CalendarDateAdd ( calendar , relativeTo , oneYear , addOptions , dateAdd ) ;
3480
3466
const untilOptions = ObjectCreate ( null ) ;
3481
3467
untilOptions . largestUnit = 'month' ;
3482
- untilResult = CalendarDateUntil ( calendar , relativeToDateOnly , newRelativeTo , untilOptions , dateUntil ) ;
3468
+ untilResult = CalendarDateUntil ( calendar , relativeTo , newRelativeTo , untilOptions , dateUntil ) ;
3483
3469
oneYearMonths = GetSlot ( untilResult , MONTHS ) ;
3484
3470
}
3485
3471
break ;
@@ -4131,28 +4117,22 @@ export function AddDuration(
4131
4117
ns1 + ns2 ,
4132
4118
largestUnit
4133
4119
) ) ;
4134
- } else if ( IsTemporalDateTime ( relativeTo ) ) {
4120
+ } else if ( IsTemporalDate ( relativeTo ) ) {
4135
4121
const TemporalDuration = GetIntrinsic ( '%Temporal.Duration%' ) ;
4136
4122
const calendar = GetSlot ( relativeTo , CALENDAR ) ;
4137
4123
4138
- const datePart = CreateTemporalDate (
4139
- GetSlot ( relativeTo , ISO_YEAR ) ,
4140
- GetSlot ( relativeTo , ISO_MONTH ) ,
4141
- GetSlot ( relativeTo , ISO_DAY ) ,
4142
- calendar
4143
- ) ;
4144
4124
const dateDuration1 = new TemporalDuration ( y1 , mon1 , w1 , d1 , 0 , 0 , 0 , 0 , 0 , 0 ) ;
4145
4125
const dateDuration2 = new TemporalDuration ( y2 , mon2 , w2 , d2 , 0 , 0 , 0 , 0 , 0 , 0 ) ;
4146
4126
const dateAdd = calendar . dateAdd ;
4147
4127
const firstAddOptions = ObjectCreate ( null ) ;
4148
- const intermediate = CalendarDateAdd ( calendar , datePart , dateDuration1 , firstAddOptions , dateAdd ) ;
4128
+ const intermediate = CalendarDateAdd ( calendar , relativeTo , dateDuration1 , firstAddOptions , dateAdd ) ;
4149
4129
const secondAddOptions = ObjectCreate ( null ) ;
4150
4130
const end = CalendarDateAdd ( calendar , intermediate , dateDuration2 , secondAddOptions , dateAdd ) ;
4151
4131
4152
4132
const dateLargestUnit = LargerOfTwoTemporalUnits ( 'day' , largestUnit ) ;
4153
4133
const differenceOptions = ObjectCreate ( null ) ;
4154
4134
differenceOptions . largestUnit = dateLargestUnit ;
4155
- ( { years, months, weeks, days } = CalendarDateUntil ( calendar , datePart , end , differenceOptions ) ) ;
4135
+ ( { years, months, weeks, days } = CalendarDateUntil ( calendar , relativeTo , end , differenceOptions ) ) ;
4156
4136
// Signs of date part and time part may not agree; balance them together
4157
4137
( { days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds } = BalanceDuration (
4158
4138
days ,
@@ -4515,19 +4495,7 @@ function MoveRelativeDate(
4515
4495
const options = ObjectCreate ( null ) ;
4516
4496
const later = CalendarDateAdd ( calendar , relativeToParam , duration , options ) ;
4517
4497
const days = DaysUntil ( relativeToParam , later ) ;
4518
- const relativeTo = CreateTemporalDateTime (
4519
- GetSlot ( later , ISO_YEAR ) ,
4520
- GetSlot ( later , ISO_MONTH ) ,
4521
- GetSlot ( later , ISO_DAY ) ,
4522
- GetSlot ( relativeToParam , ISO_HOUR ) ,
4523
- GetSlot ( relativeToParam , ISO_MINUTE ) ,
4524
- GetSlot ( relativeToParam , ISO_SECOND ) ,
4525
- GetSlot ( relativeToParam , ISO_MILLISECOND ) ,
4526
- GetSlot ( relativeToParam , ISO_MICROSECOND ) ,
4527
- GetSlot ( relativeToParam , ISO_NANOSECOND ) ,
4528
- GetSlot ( relativeToParam , CALENDAR )
4529
- ) ;
4530
- return { relativeTo, days } ;
4498
+ return { relativeTo : later , days } ;
4531
4499
}
4532
4500
4533
4501
export function MoveRelativeZonedDateTime (
@@ -4717,17 +4685,18 @@ export function RoundDuration(
4717
4685
const TemporalDuration = GetIntrinsic ( '%Temporal.Duration%' ) ;
4718
4686
let calendar , zdtRelative ;
4719
4687
// if it's a ZDT, it will be reassigned to a PDT below.
4720
- let relativeTo = relativeToParam as Temporal . PlainDateTime ;
4688
+ let relativeTo : Parameters < typeof MoveRelativeDate > [ 1 ] = relativeToParam ;
4721
4689
if ( relativeToParam ) {
4722
4690
if ( IsTemporalZonedDateTime ( relativeTo ) ) {
4723
4691
zdtRelative = relativeTo ;
4724
- relativeTo = BuiltinTimeZoneGetPlainDateTimeFor (
4692
+ const pdt = BuiltinTimeZoneGetPlainDateTimeFor (
4725
4693
GetSlot ( relativeTo , TIME_ZONE ) ,
4726
4694
GetSlot ( relativeTo , INSTANT ) ,
4727
4695
GetSlot ( relativeTo , CALENDAR )
4728
4696
) ;
4729
- } else if ( ! IsTemporalDateTime ( relativeTo ) ) {
4730
- throw new TypeError ( 'starting point must be PlainDateTime or ZonedDateTime' ) ;
4697
+ relativeTo = TemporalDateTimeToDate ( pdt ) ;
4698
+ } else if ( ! IsTemporalDate ( relativeTo ) ) {
4699
+ throw new TypeError ( 'starting point must be PlainDate or ZonedDateTime' ) ;
4731
4700
}
4732
4701
calendar = GetSlot ( relativeTo , CALENDAR ) ;
4733
4702
}
@@ -4762,41 +4731,21 @@ export function RoundDuration(
4762
4731
const secondAddOptions = ObjectCreate ( null ) ;
4763
4732
const yearsMonthsWeeksLater = CalendarDateAdd ( calendar , relativeTo , yearsMonthsWeeks , secondAddOptions , dateAdd ) ;
4764
4733
const monthsWeeksInDays = DaysUntil ( yearsLater , yearsMonthsWeeksLater ) ;
4765
- let relativeToDateOnly = yearsLater ;
4734
+ relativeTo = yearsLater ;
4766
4735
days += monthsWeeksInDays ;
4767
4736
4768
4737
const thirdAddOptions = ObjectCreate ( null ) ;
4769
- const daysLater = CalendarDateAdd ( calendar , relativeToDateOnly , { days } , thirdAddOptions , dateAdd ) ;
4738
+ const daysLater = CalendarDateAdd ( calendar , relativeTo , { days } , thirdAddOptions , dateAdd ) ;
4770
4739
const untilOptions = ObjectCreate ( null ) ;
4771
4740
untilOptions . largestUnit = 'year' ;
4772
- const yearsPassed = CalendarDateUntil ( calendar , relativeToDateOnly , daysLater , untilOptions ) . years ;
4741
+ const yearsPassed = CalendarDateUntil ( calendar , relativeTo , daysLater , untilOptions ) . years ;
4773
4742
years += yearsPassed ;
4774
- const oldRelativeTo = relativeToDateOnly ;
4743
+ const oldRelativeTo = relativeTo ;
4775
4744
const fourthAddOptions = ObjectCreate ( null ) ;
4776
- relativeToDateOnly = CalendarDateAdd (
4777
- calendar ,
4778
- relativeToDateOnly ,
4779
- { years : yearsPassed } ,
4780
- fourthAddOptions ,
4781
- dateAdd
4782
- ) ;
4783
- const daysPassed = DaysUntil ( oldRelativeTo , relativeToDateOnly ) ;
4745
+ relativeTo = CalendarDateAdd ( calendar , relativeTo , { years : yearsPassed } , fourthAddOptions , dateAdd ) ;
4746
+ const daysPassed = DaysUntil ( oldRelativeTo , relativeTo ) ;
4784
4747
days -= daysPassed ;
4785
4748
const oneYear = new TemporalDuration ( days < 0 ? - 1 : 1 ) ;
4786
- // This conversion is needed because of an issue in the spec that's likely to change.
4787
- // See https://github.com/tc39/proposal-temporal/issues/1821.
4788
- relativeTo = CreateTemporalDateTime (
4789
- GetSlot ( relativeToDateOnly , ISO_YEAR ) ,
4790
- GetSlot ( relativeToDateOnly , ISO_MONTH ) ,
4791
- GetSlot ( relativeToDateOnly , ISO_DAY ) ,
4792
- 0 ,
4793
- 0 ,
4794
- 0 ,
4795
- 0 ,
4796
- 0 ,
4797
- 0 ,
4798
- GetSlot ( relativeTo , CALENDAR )
4799
- ) ;
4800
4749
let { days : oneYearDays } = MoveRelativeDate ( calendar , relativeTo , oneYear ) ;
4801
4750
4802
4751
// Note that `nanoseconds` below (here and in similar code for months,
@@ -4828,20 +4777,7 @@ export function RoundDuration(
4828
4777
const secondAddOptions = ObjectCreate ( null ) ;
4829
4778
const yearsMonthsWeeksLater = CalendarDateAdd ( calendar , relativeTo , yearsMonthsWeeks , secondAddOptions , dateAdd ) ;
4830
4779
const weeksInDays = DaysUntil ( yearsMonthsLater , yearsMonthsWeeksLater ) ;
4831
- // This conversion is needed because of an issue in the spec that's likely to change.
4832
- // See https://github.com/tc39/proposal-temporal/issues/1821.
4833
- relativeTo = CreateTemporalDateTime (
4834
- GetSlot ( yearsMonthsLater , ISO_YEAR ) ,
4835
- GetSlot ( yearsMonthsLater , ISO_MONTH ) ,
4836
- GetSlot ( yearsMonthsLater , ISO_DAY ) ,
4837
- 0 ,
4838
- 0 ,
4839
- 0 ,
4840
- 0 ,
4841
- 0 ,
4842
- 0 ,
4843
- GetSlot ( yearsMonthsLater , CALENDAR )
4844
- ) ;
4780
+ relativeTo = yearsMonthsLater ;
4845
4781
days += weeksInDays ;
4846
4782
4847
4783
// Months may be different lengths of days depending on the calendar,
0 commit comments