from .dates_add_days import epoch_day_from_iso DAY_NAMES = ( "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", ) def day_of_week(iso: str) -> int: """The ISO 8601 day of the week: 1 = Monday through 7 = Sunday. ISO numbering rather than the 0 = Monday that Python's own weekday() uses or the 0 = Sunday that JavaScript uses, because ISO is what the rest of the business world means by "day 1" and because a weekend test becomes ``day >= 6`` in every language. """ # 1970-01-01, epoch day 0, was a Thursday. Shifting by 3 moves the origin of # the cycle to Monday so that the remainder is already ISO numbering. return (epoch_day_from_iso(iso) + 3) % 7 + 1 def is_weekend(iso: str) -> bool: """True for Saturday and Sunday.""" return day_of_week(iso) >= 6 def is_weekday(iso: str) -> bool: """True for Monday to Friday. Says nothing about public holidays.""" return day_of_week(iso) <= 5 def day_name(iso: str) -> str: """The English name, for logs and labels. Not localised, deliberately: a capability that needed locale data would need a locale argument and a data file to pin it. """ return DAY_NAMES[day_of_week(iso) - 1]