Skip to content

Commit a955fd4

Browse files
committed
Implement adding and subtracting durations from datetimes
1 parent d62cc60 commit a955fd4

File tree

2 files changed

+84
-75
lines changed

2 files changed

+84
-75
lines changed

src/expressions/dataTypes/valueTypes/DateTime.ts

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -466,13 +466,49 @@ export function subtract(
466466
return new DayTimeDuration(secondsOfDuration);
467467
}
468468

469-
export function addDuration(dateTime: DateTime, _duration: AbstractDuration): DateTime {
470-
throw new Error(`Not implemented: adding durations to ${valueTypeToString(dateTime.type)}`);
469+
export function addDuration(dateTime: DateTime, duration: AbstractDuration): DateTime {
470+
const jsDateTime = dateTime.toJavaScriptDate();
471+
jsDateTime.setUTCFullYear(jsDateTime.getUTCFullYear() + duration.getYears())
472+
jsDateTime.setUTCMonth(jsDateTime.getUTCMonth() + duration.getMonths())
473+
jsDateTime.setUTCDate(jsDateTime.getUTCDate() + duration.getDays())
474+
jsDateTime.setUTCHours(jsDateTime.getUTCHours() + duration.getHours())
475+
jsDateTime.setUTCMinutes(jsDateTime.getUTCMinutes() + duration.getMinutes());
476+
jsDateTime.setUTCSeconds(jsDateTime.getUTCSeconds() + Math.floor(duration.getSeconds()));
477+
jsDateTime.setUTCMilliseconds(jsDateTime.getUTCMilliseconds() + duration.getSeconds() % 1);
478+
479+
return new DateTime(
480+
jsDateTime.getUTCFullYear(),
481+
jsDateTime.getUTCMonth() + 1,
482+
jsDateTime.getUTCDate(),
483+
jsDateTime.getUTCHours(),
484+
jsDateTime.getUTCMinutes(),
485+
jsDateTime.getUTCSeconds(),
486+
jsDateTime.getUTCMilliseconds(),
487+
488+
dateTime.getTimezone(),
489+
);
471490
}
472491

473-
export function subtractDuration(dateTime: DateTime, _duration: AbstractDuration): DateTime {
474-
throw new Error(
475-
`Not implemented: subtracting durations from ${valueTypeToString(dateTime.type)}`
492+
export function subtractDuration(dateTime: DateTime, duration: AbstractDuration): DateTime {
493+
const jsDateTime = dateTime.toJavaScriptDate();
494+
jsDateTime.setUTCFullYear(jsDateTime.getUTCFullYear() - duration.getYears())
495+
jsDateTime.setUTCMonth(jsDateTime.getUTCMonth() - duration.getMonths())
496+
jsDateTime.setUTCDate(jsDateTime.getUTCDate() - duration.getDays())
497+
jsDateTime.setUTCHours(jsDateTime.getUTCHours() - duration.getHours())
498+
jsDateTime.setUTCMinutes(jsDateTime.getUTCMinutes() - duration.getMinutes());
499+
jsDateTime.setUTCSeconds(jsDateTime.getUTCSeconds() - Math.floor(duration.getSeconds()));
500+
jsDateTime.setUTCMilliseconds(jsDateTime.getUTCMilliseconds() - duration.getSeconds() % 1);
501+
502+
return new DateTime(
503+
jsDateTime.getUTCFullYear(),
504+
jsDateTime.getUTCMonth() + 1,
505+
jsDateTime.getUTCDate(),
506+
jsDateTime.getUTCHours(),
507+
jsDateTime.getUTCMinutes(),
508+
jsDateTime.getUTCSeconds(),
509+
jsDateTime.getUTCMilliseconds(),
510+
511+
dateTime.getTimezone(),
476512
);
477513
}
478514

0 commit comments

Comments
 (0)