python - 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?
解决方案
您可以根据需要替换您的感知日期时间对象的属性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'))
推荐阅读
- python - 在 Google Cloud Dataflow 上运行的 Apache Beam 管道中从 setup.py 安装“ffmpeg”包
- hive - 将 apache pig 转换为 hive
- python - 如何不打印外部文本文件中的重复行?
- javascript - JavaScript:属性替代品的长列表
- java - 根据所选数字从 JSON 数组列表中获取数据
- android - AccessibilityService 事件类型 - 可以动态配置吗?
- sql - 只保留最便宜的价格来删除重复项
- java - 拆分和合并时 Flux.fromStream 失败
- excel - 根据特定列是否匹配查找值
- pandas - 比较每个群组的压缩分布