]> git.ipfire.org Git - thirdparty/babel.git/commitdiff
Fix get_period_id() with `dayPeriodRule` across 0:00
authorJun Omae <jun66j5@gmail.com>
Sun, 1 May 2022 07:33:41 +0000 (16:33 +0900)
committerAarni Koskela <akx@iki.fi>
Tue, 10 May 2022 06:53:12 +0000 (08:53 +0200)
babel/dates.py
tests/test_day_periods.py

index 1386316599acc9e0cfa5544f88fa5408829479b1..74fc6db71cd114fb3d562da17709c6ad3c1c97bb 100644 (file)
@@ -1113,6 +1113,12 @@ def get_period_id(time, tzinfo=None, type=None, locale=LC_TIME):
     >>> get_period_names(locale="de")[get_period_id(time(7, 42), locale="de")]
     u'Morgen'
 
+    >>> get_period_id(time(0), locale="en_US")
+    u'midnight'
+
+    >>> get_period_id(time(0), type="selection", locale="en_US")
+    u'night1'
+
     :param time: The time to inspect.
     :param tzinfo: The timezone for the time. See ``format_time``.
     :param type: The period type to use. Either "selection" or None.
@@ -1136,6 +1142,16 @@ def get_period_id(time, tzinfo=None, type=None, locale=LC_TIME):
 
     for rule_id, rules in rulesets:
         for rule in rules:
+            if "from" in rule and "before" in rule:
+                if rule["from"] < rule["before"]:
+                    if rule["from"] <= seconds_past_midnight < rule["before"]:
+                        return rule_id
+                else:
+                    # e.g. from="21:00" before="06:00"
+                    if rule["from"] <= seconds_past_midnight < 86400 or \
+                            0 <= seconds_past_midnight < rule["before"]:
+                        return rule_id
+
             start_ok = end_ok = False
 
             if "from" in rule and seconds_past_midnight >= rule["from"]:
index eb12b07f4faa5ce015c9d1530dd784224f71db03..52cbc5e4f3c918c3ea1e82d7d99b11f72f2a6eeb 100644 (file)
@@ -10,6 +10,9 @@ import pytest
     ("de", time(3, 11), "night1"),  # (after, before)
     ("fi", time(0), "midnight"),  # (at)
     ("en_US", time(12), "noon"),  # (at)
+    ("en_US", time(21), "night1"),  # (from, before) across 0:00
+    ("en_US", time(5), "night1"),  # (from, before) across 0:00
+    ("en_US", time(6), "morning1"),  # (from, before)
     ("agq", time(10), "am"),  # no periods defined
     ("agq", time(22), "pm"),  # no periods defined
     ("am", time(14), "afternoon1"),  # (before, after)