diff --git a/tp-date-input.js b/tp-date-input.js index 65e6830..289c79e 100644 --- a/tp-date-input.js +++ b/tp-date-input.js @@ -292,7 +292,7 @@ class TpDateInput extends EventHelpers(ControlState(FormElement(LitElement))) { } // Convert luxon format to match input assignment - const luxonFormat = this._inputAssign.map(part => { + const format = this._inputAssign.map(part => { switch (part) { case 'MM': return 'LL'; case 'dd': return 'dd'; @@ -301,17 +301,18 @@ class TpDateInput extends EventHelpers(ControlState(FormElement(LitElement))) { } }).join('-'); - // Parse the date in the specified timezone (or local if not set). - // This interprets the entered values as being in that timezone. - const dt = DateTime.fromFormat(i0 + '-' + i1 + '-' + i2, luxonFormat, { zone: this.timeZone || 'local' }); + // Parse the entered values as a plain calendar date, then store as UTC midnight. + // Date-only fields are timezone-agnostic — April 7 means April 7 for everyone. + const dt = DateTime.fromFormat(i0 + '-' + i1 + '-' + i2, format); if (dt.isValid) { this.inputs[0].invalid = false; this.inputs[1].invalid = false; this.inputs[2].invalid = false; - - this.date = dt.toJSDate(); - this.value = dt.toUTC().toISO(); + + const utcMidnight = DateTime.utc(dt.year, dt.month, dt.day); + this.date = utcMidnight.toJSDate(); + this.value = utcMidnight.toISO(); this.invalid = false; this.dispatchEvent(new CustomEvent('value-changed', { detail: this.value, bubbles: true, composed: true })); } else { @@ -467,12 +468,8 @@ class TpDateInput extends EventHelpers(ControlState(FormElement(LitElement))) { let dt = this._toDateTime(this.value); if (dt && dt.isValid) { - // Convert to user's timezone for display (input values are expected to be UTC) - if (this.timeZone) { - dt = dt.setZone(this.timeZone); - } - - // Convert luxon format parts to match display format + // Values are stored as UTC midnight — display the UTC calendar date as-is. + dt = dt.toUTC(); this._input0 = dt.toFormat(this._getLuxonFormat(this._inputAssign[0])); this._input1 = dt.toFormat(this._getLuxonFormat(this._inputAssign[1])); this._input2 = dt.toFormat(this._getLuxonFormat(this._inputAssign[2])); @@ -493,7 +490,8 @@ class TpDateInput extends EventHelpers(ControlState(FormElement(LitElement))) { if (this.today) { setTimeout(() => { if (!this.value) { - this.value = DateTime.now().toISO(); + const now = DateTime.utc(); + this.value = DateTime.utc(now.year, now.month, now.day).toISO(); } }); }