在全球范围内使用 Python 处理当地时间

问题描述 投票:0回答:1

我正在开发一个应用程序,其中事件在特定时间发生。事件创建者可以在夏令时可能适用或不适用的时区创建事件。因此,创作者始终需要查看当地时区的事件。

这部分非常简单;我将时间存储为 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)`

我希望根据创建的时间天气在本地为所有用户正确显示时间,或者创建者或访问者不会受到日光的影响,即使事件是过去的

python-3.x datetime timezone dst pytz
1个回答
0
投票
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 并随后将其转换为查看者的时区,它可以保证精确的本地时间表示,而不管夏令时差异如何。此方法可确保可靠地管理时区和夏令时转换,以准确显示事件。

© www.soinside.com 2019 - 2024. All rights reserved.