Skip to content

Commit 38d495b

Browse files
committed
fix(TimePicker): correct meridiem handling to prevent hour conversion errors
- Fix AM/PM switching logic to properly convert between 12h and 24h formats - Add bounds checking to prevent hours from going below 0 or above 23 - Prevent double conversion errors when switching meridiem multiple times - Ensure accurate time representation when toggling between AM and PM
1 parent 6f69747 commit 38d495b

File tree

1 file changed

+17
-9
lines changed

1 file changed

+17
-9
lines changed

js/src/time-picker.js

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ class TimePicker extends BaseComponent {
477477

478478
Manipulator.setDataAttribute(
479479
this._element,
480-
'toggle',
480+
'meridiem',
481481
CLASS_NAME_TIME_PICKER
482482
)
483483

@@ -674,7 +674,7 @@ class TimePicker extends BaseComponent {
674674
if (this._localizedTimePartials.hour12) {
675675
this._timePickerBody.append(
676676
this._createTimePickerInlineSelect(
677-
'toggle',
677+
'meridiem',
678678
[
679679
{ value: 'am', label: 'AM' },
680680
{ value: 'pm', label: 'PM' }
@@ -721,7 +721,7 @@ class TimePicker extends BaseComponent {
721721
{ value: 'am', label: 'AM' },
722722
{ value: 'pm', label: 'PM' }
723723
],
724-
'toggle',
724+
'meridiem',
725725
this._config.ariaSelectMeridiemLabel
726726
)
727727
)
@@ -808,7 +808,7 @@ class TimePicker extends BaseComponent {
808808
}
809809

810810
_setUpRolls(initial = false) {
811-
const parts = ['hours', 'minutes', 'seconds', 'toggle']
811+
const parts = ['hours', 'minutes', 'seconds', 'meridiem']
812812

813813
for (const part of parts) {
814814
const partValue = this._getPartOfTime(part)
@@ -855,7 +855,7 @@ class TimePicker extends BaseComponent {
855855
}
856856

857857
_setUpSelects() {
858-
for (const part of Array.from(['hours', 'minutes', 'seconds', 'toggle'])) {
858+
for (const part of Array.from(['hours', 'minutes', 'seconds', 'meridiem'])) {
859859
for (const element of SelectorEngine.find(
860860
`select.${part}`,
861861
this._element
@@ -939,23 +939,31 @@ class TimePicker extends BaseComponent {
939939
return this._date.getSeconds()
940940
}
941941

942-
if (part === 'toggle') {
942+
if (part === 'meridiem') {
943943
return getAmPm(new Date(this._date), this._config.locale)
944944
}
945945
}
946946

947947
_handleTimeChange = (set, value) => {
948948
const _date = this._date || new Date('1970-01-01')
949949

950-
if (set === 'toggle') {
950+
if (set === 'meridiem') {
951+
const currentHours = _date.getHours()
952+
951953
if (value === 'am') {
952954
this._ampm = 'am'
953-
_date.setHours(_date.getHours() - 12)
955+
// Convert PM hours (12-23) to AM hours (0-11)
956+
if (currentHours >= 12) {
957+
_date.setHours(currentHours - 12)
958+
}
954959
}
955960

956961
if (value === 'pm') {
957962
this._ampm = 'pm'
958-
_date.setHours(_date.getHours() + 12)
963+
// Convert AM hours (0-11) to PM hours (12-23)
964+
if (currentHours < 12) {
965+
_date.setHours(currentHours + 12)
966+
}
959967
}
960968
}
961969

0 commit comments

Comments
 (0)