fix(set): clamp hour() to 23 instead of the invalid 24

hour(n) with n >= 24 clamped n to 24, which walkTo() rejects as an invalid
hour (valid range 0-23), nulling the epoch and invalidating the object.
Clamp to 23 to match the other overflow-clamping setters (date, month).
This commit is contained in:
dualfroz committed 2026-09-06 01:13:18 +02:00
1 parent 96f6f12e4e
commit bf7f44c584
3 files changed
+15 -40

No files matched your search

-39
View File
@@ -688,9 +688,6 @@
"arm"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -705,9 +702,6 @@
"arm"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -722,9 +716,6 @@
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -739,9 +730,6 @@
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -756,9 +744,6 @@
"loong64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -773,9 +758,6 @@
"loong64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -790,9 +772,6 @@
"ppc64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -807,9 +786,6 @@
"ppc64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -824,9 +800,6 @@
"riscv64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -841,9 +814,6 @@
"riscv64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -858,9 +828,6 @@
"s390x"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -875,9 +842,6 @@
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -892,9 +856,6 @@
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
+2 -1
View File
@@ -67,8 +67,9 @@ const minutes = function (s, n, goFwd) {
const hours = function (s, n, goFwd) {
n = validate(n)
// Clamp to 0-23: hour 24 is rejected by walkTo(), which nulls the epoch.
if (n >= 24) {
n = 24
n = 23
} else if (n < 0) {
n = 0
}
+13
View File
@@ -238,3 +238,16 @@ test('month()/date() setters clamp the day to the month length', (t) => {
t.equal(iso(spacetime('2021-02-10').date(31)), '2021-02-28', 'date(31) in a common february clamps to the 28th')
t.end()
})
test('hour() setter clamps out-of-range hours to a valid hour', (t) => {
const s = spacetime('2021-03-14 10:00:00', 'UTC')
// an out-of-range hour must clamp to 23, not null the epoch
t.equal(s.hour(24).hour(), 23, 'hour(24) clamps to 23')
t.equal(s.hour(25).hour(), 23, 'hour(25) clamps to 23')
t.equal(s.hour(100).hour(), 23, 'hour(100) clamps to 23')
t.equal(s.hour(24).isValid(), true, 'hour(24) stays valid')
t.equal(s.hour(24).format('iso-short'), '2021-03-14', 'hour(24) keeps the same day')
// negative hours still clamp to 0
t.equal(s.hour(-1).hour(), 0, 'hour(-1) clamps to 0')
t.end()
})