簡體   English   中英

將美國/東部轉換為 UTC,包括夏令時 Python

[英]Convert US/Eastern to UTC including daylight savings Python

我真的很驚訝沒有在 Python 中找到一種簡單的方法來做到這一點。 我們在 12 月寫了這個,它通過了,因為那是冬天:

def get_utc_time(dt_or_str, number_of_days=None, time_format=DATETIME_FORMAT):
    """

    :param dt_or_str:
    :return:
    """
    eastern = pytz.timezone('US/Eastern')

    # try:
    if isinstance(dt_or_str, datetime):
        new_date_str = dt_or_str.strftime(time_format)
        new_date_obj = dt_or_str
    else:
        new_date_str = dt_or_str
        new_date_obj = datetime.strptime(dt_or_str, time_format)

    if not number_of_days:
        utc_time = eastern.localize(
            datetime.strptime(new_date_str, time_format),
            is_dst=None).astimezone(pytz.utc)
    else:
        est_time = new_date_obj - timedelta(days=number_of_days)
        utc_time = eastern.localize(est_time, is_dst=None).astimezone(pytz.utc)

    utc_time = utc_time.replace(tzinfo=None)

這樣做是為您的時間增加了 5 小時,使其成為 UTC。 事實證明,春季/夏季東部時間僅比 UTC 晚 4 小時,因此我們的代碼現在已損壞。

這是我們寫的在 Summer 不起作用的測試:

def test_get_utc_time_incoming_string(self):
    result = get_utc_time("2017-02-02 04:38")
    self.assertEqual(result, datetime.datetime(2017, 2, 2, 8, 38))

您如何將 EST 轉換為全年可用的 UTC? 我不想硬編碼它,因為夏令時每年都在變化。

在一個答案中找到了這個:

def is_daylight_savings(timezone_name):
    tz = pytz.timezone(timezone_name)
    now = pytz.utc.localize(datetime.utcnow())
    return now.astimezone(tz).dst() != timedelta(0)

所以現在這個:

def get_utc_time(dt_or_str, number_of_days=None, time_format=DATETIME_FORMAT):
    """
    :param dt_or_str:
    :return:
    """
    eastern = pytz.timezone(TIMEZONE)
    it_is_daylight_savings = is_daylight_savings(TIMEZONE)

    if isinstance(dt_or_str, datetime):
        new_date_str = dt_or_str.strftime(time_format)
        new_date_obj = dt_or_str
    else:
        new_date_str = dt_or_str
        new_date_obj = datetime.strptime(dt_or_str, time_format)

    if not number_of_days:
        utc_time = eastern.localize(
            datetime.strptime(new_date_str, time_format),
            is_dst=it_is_daylight_savings).astimezone(pytz.utc)
    else:
        est_time = new_date_obj - timedelta(days=number_of_days)
        utc_time = eastern.localize(est_time, is_dst=it_is_daylight_savings).astimezone(pytz.utc)

    utc_time = utc_time.replace(tzinfo=None)

    return utc_time

隨着言論自由的消亡,粗魯的自由呈指數增長

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM