previous string_handling located datetime and timestamp files have been moved to the datetime handling folder Update readme file with more information about currently covered areas
237 lines
7.2 KiB
Python
237 lines
7.2 KiB
Python
#!/usr/bin/env python3
|
|
|
|
"""
|
|
date string helper test
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from corelibs.datetime_handling.datetime_helpers import (
|
|
get_datetime_iso8601, get_system_timezone, parse_timezone_data, validate_date,
|
|
parse_flexible_date, compare_dates, find_newest_datetime_in_list,
|
|
parse_day_of_week_range, parse_time_range, times_overlap_or_connect, is_time_in_range,
|
|
reorder_weekdays_from_today
|
|
)
|
|
|
|
|
|
def __get_datetime_iso8601():
|
|
"""
|
|
Comment
|
|
"""
|
|
for tz in [
|
|
'', 'Asia/Tokyo', 'UTC', 'Europe/Vienna',
|
|
'America/New_York', 'Australia/Sydney',
|
|
'invalid'
|
|
]:
|
|
print(f"{tz} -> {get_datetime_iso8601(tz)}")
|
|
|
|
|
|
def __parse_timezone_data():
|
|
for tz in [
|
|
'JST', 'KST', 'UTC', 'CET', 'CEST',
|
|
]:
|
|
print(f"{tz} -> {parse_timezone_data(tz)}")
|
|
|
|
|
|
def __validate_date():
|
|
"""
|
|
Comment
|
|
"""
|
|
|
|
test_dates = [
|
|
"2024-01-01",
|
|
"2024-02-29", # Leap year
|
|
"2023-02-29", # Invalid date
|
|
"2024-13-01", # Invalid month
|
|
"2024-00-10", # Invalid month
|
|
"2024-04-31", # Invalid day
|
|
"invalid-date"
|
|
]
|
|
|
|
for date_str in test_dates:
|
|
is_valid = validate_date(date_str)
|
|
print(f"Date '{date_str}' is valid: {is_valid}")
|
|
|
|
# also test not before and not after
|
|
not_before_dates = [
|
|
"2023-12-31",
|
|
"2024-01-01",
|
|
"2024-02-29",
|
|
]
|
|
not_after_dates = [
|
|
"2024-12-31",
|
|
"2024-11-30",
|
|
"2025-01-01",
|
|
]
|
|
|
|
for date_str in not_before_dates:
|
|
datetime.strptime(date_str, "%Y-%m-%d") # Ensure valid date format
|
|
is_valid = validate_date(date_str, not_before=datetime.strptime("2024-01-01", "%Y-%m-%d"))
|
|
print(f"Date '{date_str}' is valid (not before 2024-01-01): {is_valid}")
|
|
|
|
for date_str in not_after_dates:
|
|
is_valid = validate_date(date_str, not_after=datetime.strptime("2024-12-31", "%Y-%m-%d"))
|
|
print(f"Date '{date_str}' is valid (not after 2024-12-31): {is_valid}")
|
|
|
|
for date_str in test_dates:
|
|
is_valid = validate_date(
|
|
date_str,
|
|
not_before=datetime.strptime("2024-01-01", "%Y-%m-%d"),
|
|
not_after=datetime.strptime("2024-12-31", "%Y-%m-%d")
|
|
)
|
|
print(f"Date '{date_str}' is valid (2024 only): {is_valid}")
|
|
|
|
|
|
def __parse_flexible_date():
|
|
for date_str in [
|
|
"2024-01-01",
|
|
"01/02/2024",
|
|
"February 29, 2024",
|
|
"Invalid date",
|
|
"2025-01-01 12:18:10",
|
|
"2025-01-01 12:18:10.566",
|
|
"2025-01-01T12:18:10.566",
|
|
"2025-01-01T12:18:10.566+02:00",
|
|
]:
|
|
print(f"{date_str} -> {parse_flexible_date(date_str)}")
|
|
|
|
|
|
def __compare_dates():
|
|
|
|
for date1, date2 in [
|
|
("2024-01-01 12:00:00", "2024-01-01 15:30:00"),
|
|
("2024-01-02", "2024-01-01"),
|
|
("2024-01-01T10:00:00+02:00", "2024-01-01T08:00:00Z"),
|
|
("invalid-date", "2024-01-01"),
|
|
("2024-01-01", "invalid-date"),
|
|
("invalid-date", "also-invalid"),
|
|
]:
|
|
result = compare_dates(date1, date2)
|
|
print(f"Comparing '{date1}' and '{date2}': {result}")
|
|
|
|
|
|
def __find_newest_datetime_in_list():
|
|
date_list = [
|
|
"2024-01-01 12:00:00",
|
|
"2024-01-02 09:30:00",
|
|
"2023-12-31 23:59:59",
|
|
"2024-01-02 15:45:00",
|
|
"2024-01-02T15:45:00.001",
|
|
"invalid-date",
|
|
]
|
|
newest_date = find_newest_datetime_in_list(date_list)
|
|
print(f"Newest date in list: {newest_date}")
|
|
|
|
|
|
def __parse_day_of_week_range():
|
|
ranges = [
|
|
"Mon-Fri",
|
|
"Saturday-Sunday",
|
|
"Wed-Mon",
|
|
"Fri-Fri",
|
|
"mon-tue",
|
|
"Invalid-Range"
|
|
]
|
|
for range_str in ranges:
|
|
try:
|
|
days = parse_day_of_week_range(range_str)
|
|
print(f"Day range '{range_str}' -> {days}")
|
|
except ValueError as e:
|
|
print(f"[!] Error parsing day range '{range_str}': {e}")
|
|
|
|
|
|
def __parse_time_range():
|
|
ranges = [
|
|
"08:00-17:00",
|
|
"22:00-06:00",
|
|
"12:30-12:30",
|
|
"invalid-range"
|
|
]
|
|
for range_str in ranges:
|
|
try:
|
|
start_time, end_time = parse_time_range(range_str)
|
|
print(f"Time range '{range_str}' -> Start: {start_time}, End: {end_time}")
|
|
except ValueError as e:
|
|
print(f"[!] Error parsing time range '{range_str}': {e}")
|
|
|
|
|
|
def __times_overlap_or_connect():
|
|
time_format = "%H:%M"
|
|
time_ranges = [
|
|
(("08:00", "12:00"), ("11:00", "15:00")), # Overlap
|
|
(("22:00", "02:00"), ("01:00", "05:00")), # Overlap across midnight
|
|
(("10:00", "12:00"), ("12:00", "14:00")), # Connect
|
|
(("09:00", "11:00"), ("12:00", "14:00")), # No overlap
|
|
]
|
|
for (start1, end1), (start2, end2) in time_ranges:
|
|
start1 = datetime.strptime(start1, time_format).time()
|
|
end1 = datetime.strptime(end1, time_format).time()
|
|
start2 = datetime.strptime(start2, time_format).time()
|
|
end2 = datetime.strptime(end2, time_format).time()
|
|
overlap = times_overlap_or_connect((start1, end1), (start2, end2))
|
|
overlap_connect = times_overlap_or_connect((start1, end1), (start2, end2), True)
|
|
print(f"Time ranges {start1}-{end1} and {start2}-{end2} overlap/connect: {overlap}/{overlap_connect}")
|
|
|
|
|
|
def __is_time_in_range():
|
|
time_format = "%H:%M:%S"
|
|
test_cases = [
|
|
("10:00:00", "09:00:00", "11:00:00"),
|
|
("23:30:00", "22:00:00", "01:00:00"), # Across midnight
|
|
("05:00:00", "06:00:00", "10:00:00"), # Not in range
|
|
("12:00:00", "12:00:00", "12:00:00"), # Exact match
|
|
]
|
|
for (check_time, start_time, end_time) in test_cases:
|
|
start_time = datetime.strptime(start_time, time_format).time()
|
|
end_time = datetime.strptime(end_time, time_format).time()
|
|
in_range = is_time_in_range(
|
|
f"{check_time}", start_time.strftime("%H:%M:%S"), end_time.strftime("%H:%M:%S")
|
|
)
|
|
print(f"Time {check_time} in range {start_time}-{end_time}: {in_range}")
|
|
|
|
|
|
def __reorder_weekdays_from_today():
|
|
for base_day in [
|
|
"Tue", "Wed", "Sunday", "Fri", "InvalidDay"
|
|
]:
|
|
try:
|
|
reordered_days = reorder_weekdays_from_today(base_day)
|
|
print(f"Reordered weekdays from {base_day}: {reordered_days}")
|
|
except ValueError as e:
|
|
print(f"[!] Error reordering weekdays from '{base_day}': {e}")
|
|
|
|
|
|
def main() -> None:
|
|
"""
|
|
Comment
|
|
"""
|
|
print("\nDatetime ISO 8601 tests:\n")
|
|
__get_datetime_iso8601()
|
|
print("\nSystem time test:")
|
|
print(f"System time: {get_system_timezone()}")
|
|
print("\nParse timezone data tests:\n")
|
|
__parse_timezone_data()
|
|
print("\nValidate date tests:\n")
|
|
__validate_date()
|
|
print("\nParse flexible date tests:\n")
|
|
__parse_flexible_date()
|
|
print("\nCompare dates tests:\n")
|
|
__compare_dates()
|
|
print("\nFind newest datetime in list tests:\n")
|
|
__find_newest_datetime_in_list()
|
|
print("\nParse day of week range tests:\n")
|
|
__parse_day_of_week_range()
|
|
print("\nParse time range tests:\n")
|
|
__parse_time_range()
|
|
print("\nTimes overlap or connect tests:\n")
|
|
__times_overlap_or_connect()
|
|
print("\nIs time in range tests:\n")
|
|
__is_time_in_range()
|
|
print("\nReorder weekdays from today tests:\n")
|
|
__reorder_weekdays_from_today()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|
|
# __END__
|