首页 > 解决方案 > timedelta 到欧洲中部时间下午 12 点

问题描述

我试图在本地时区未知(GitHub 操作)的机器上将剩余时间留到欧洲/柏林下午 12 点。

我有一个函数应该返回一个 timedelta,剩余时间直到 12 点。

import datetime
import pytz

def get_twelve_pm():
    cest = pytz.timezone('Europe/Berlin')

    now = datetime.datetime.now(tz=cest)
    twelve_pm = datetime.datetime(
        now.year, now.month, now.day, 12).astimezone(cest)

    print(cest)
    print(now)
    print(twelve_pm)
    print(twelve_pm - now)

出于某种原因,在 GitHub 操作中,结果是:

欧洲/柏林

2020-12-10 12:15:46.446839+01:00

2020-12-10 13:00:00+01:00

0:44:13.553161

为什么说 13:00+01:00?我希望它像函数所说的那样说 12:00+01:00?

标签: pythondatetimetimezonepytz

解决方案


您可以根据需要替换您的感知日期时间对象的属性now,例如

import datetime
import pytz

tz_Berlin = pytz.timezone('Europe/Berlin')
now = datetime.datetime.now(tz=tz_Berlin)

twelve_pm = now.replace(hour=12, minute=0, second=0, microsecond=0)
# datetime.datetime(2020, 12, 10, 12, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>)

或使用 localize 创建一个表示同一日期下午 12 点的日期时间对象(使用 的正确方法pytz):

twelve_pm = tz_Berlin.localize(datetime.datetime(now.year, now.month, now.day, 12))
# datetime.datetime(2020, 12, 10, 12, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>)

...或使用 Python 3.9 zoneinfo,因此您可以直接设置 tzinfo:

from zoneinfo import ZoneInfo

tz_Berlin = ZoneInfo('Europe/Berlin')
twelve_pm = datetime.datetime(now.year, now.month, now.day, 12, tzinfo=tz_Berlin)
# datetime.datetime(2020, 12, 10, 12, 0, tzinfo=zoneinfo.ZoneInfo(key='Europe/Berlin'))

推荐阅读