LibJS+LibUnicode: Handle flexible day periods on both sides of midnight

Commit ec7d535 only partially handled the case of flexible day periods
rolling over midnight, in that it only worked for hours after midnight.
For example, the en locale defines a day period range of [21:00, 06:00).
The previous method of adding 24 hours to the given hour would change
e.g. 23:00 to 47:00, which isn't valid.
This commit is contained in:
Timothy Flynn 2022-07-21 11:28:59 -04:00 committed by Linus Groh
parent fadd69263a
commit 0f26ab89ae
Notes: sideshowbarker 2024-07-17 08:43:11 +09:00
2 changed files with 16 additions and 8 deletions

View file

@ -2289,14 +2289,18 @@ Optional<StringView> get_calendar_day_period_symbol_for_hour(StringView locale,
for (auto day_period_index : day_periods) {
auto day_period = s_day_periods[day_period_index];
auto h = hour;
bool hour_falls_within_day_period = false;
if (day_period.begin > day_period.end) {
day_period.end += 24;
h += 24;
if (hour >= day_period.begin)
hour_falls_within_day_period = true;
else if (hour <= day_period.end)
hour_falls_within_day_period = true;
} else if ((day_period.begin <= hour) && (hour < day_period.end)) {
hour_falls_within_day_period = true;
}
if ((day_period.begin <= h) && (h < day_period.end)) {
if (hour_falls_within_day_period) {
auto period = static_cast<DayPeriod>(day_period.day_period);
return get_calendar_day_period_symbol(locale, calendar, style, period);
}

View file

@ -263,11 +263,15 @@ describe("dayPeriod", () => {
});
test("flexible day period rolls over midnight", () => {
// For the en locale, this time (05:00) falls in the flexible day period range of [21:00, 06:00).
const date = Date.UTC(2017, 11, 12, 5, 0, 0, 0);
const en = new Intl.DateTimeFormat("en", { dayPeriod: "short", timeZone: "UTC" });
expect(en.format(date)).toBe("5 at night");
// For the en locale, these times (05:00 and 23:00) fall in the flexible day period range of
// [21:00, 06:00), on either side of midnight.
const date1 = Date.UTC(2017, 11, 12, 5, 0, 0, 0);
const date2 = Date.UTC(2017, 11, 12, 23, 0, 0, 0);
expect(en.format(date1)).toBe("5 at night");
expect(en.format(date2)).toBe("11 at night");
});
});