我正在开发一个应用程序,其中事件在特定时间发生。事件创建者可以在夏令时可能适用或不适用的时区创建事件。因此,创作者始终需要查看当地时区的事件。
这部分非常简单;我将时间存储为 UTC 和用户所在区域。所以,我总是可以根据用户的时钟向用户显示时间。
现在的问题是,活动可以有观众,并且他们有自己的时区。他们可能正在遵守夏令时,也可能没有。创建者和观看者可能不会同时遵守夏令时(例如英国、美国)。
最后,所有这些都需要针对过去和未来的事件进行处理。用户应该能够看到过去和未来的事件,并且所有逻辑都需要相应地工作。如果你尝试手动的话,似乎条件很多。
这是我当前的逻辑,当访客查看时会失败
def convert_event_time_to_local(current_date: datetime, event: Event, timezone: str):
"""
Convert event datetime to local datetime.
Args:
current_date (datetime): The current date and time.
event (Event): The Event object to modify.
timezone (str): The timezone to use for the offset calculation.
Examples:
>>> check_daylight_and_add_offset(datetime(2022, 1, 1, 10, 0), event_obj, 'Eastern (UTC-05:00)')
"""
current_date_offset = (
current_date.astimezone(pytz.timezone(timezone)).dst().seconds
)
event_date_offset = event.from_date.astimezone(pytz.timezone(timezone).dst().seconds)
if current_date_offset != event_date_offset:
offset_seconds = 3600 if current_date_offset == 0 else -3600
event.date += timedelta(seconds=offset_seconds)`
我希望根据创建的时间天气在本地为所有用户正确显示时间,或者创建者或访问者不会受到日光的影响,即使事件是过去的
import pytz
from datetime import datetime, timedelta
from typing import Union
from your_module import Event # Import your Event class
def convert_event_time_to_local(event: Event, viewer_timezone: str) -> datetime:
# Convert event time from UTC to viewer's local time
utc_time = event.from_date.replace(tzinfo=pytz.utc)
local_time = utc_time.astimezone(pytz.timezone(viewer_timezone))
return local_time
# Example usage:
event_obj = Event(from_date=datetime(2022, 1, 1, 10, 0))
viewer_timezone = 'America/New_York' # Example timezone
local_event_time = convert_event_time_to_local(event_obj, viewer_timezone)
print(local_event_time)
使用 pytz 进行时区处理,将事件时间从 UTC 转换为查看者的本地时间。通过最初将时区信息设置为 UTC 并随后将其转换为查看者的时区,它可以保证精确的本地时间表示,而不管夏令时差异如何。此方法可确保可靠地管理时区和夏令时转换,以准确显示事件。