提问人:Dieudonné 提问时间:10/29/2023 最后编辑:FObersteinerDieudonné 更新时间:10/29/2023 访问量:65
UTC的本地开始和结束时间
Local start and end of day in UTC
问:
我想知道特定日期的开始和结束时间在UTC和Python中表示。
例如:
- 当前日期和时间是 2023年 10月 29日 星期日 01:33:49 CEST (中欧夏令时间),
- 这一天开始于 周日 29 十月 2023, 00:00:00 CEST,
- 这一天结束于 Sun 29 Oct 2023, 23:59:59 CET (注意,时区从 CEST(夏令时)切换到 CET(非夏令时))
现在我想在UTC中获取这些时间:
- 开始: 周六 28 十月 2023, 22:00:00 UTC
- 结束时间:2023 年 10 月 29 日星期日,22:59:59 UTC(一天包含 25 小时)
我不想以编程方式设置时区 - 我想从我的系统中获取它。
我发现这在 Swift 中很容易做到,因为每个日期都是时区感知的,但我无法了解如何在 Python 中做到这一点。我需要这样做的原因是,我想从包含UTC时间戳的数据库中获取特定(本地)日期内的所有数据。
我试过了这个:
from datetime import datetime, time
import pytz
start_of_day = datetime.combine(datetime.now(), time.min)
end_of_day = datetime.combine(datetime.now(), time.max)
print(start_of_day)
print(end_of_day)
print(start_of_day.astimezone().tzinfo)
print(end_of_day.astimezone().tzinfo)
start_of_day = pytz.utc.localize(start_of_day)
end_of_day = pytz.utc.localize(end_of_day)
print(start_of_day)
print(end_of_day)
print(start_of_day.astimezone().tzinfo)
print(end_of_day.astimezone().tzinfo)
它给出了以下输出:
2023-10-29 00:00:00
2023-10-29 23:59:59.999999
BST
GMT
2023-10-29 00:00:00+00:00
2023-10-29 23:59:59.999999+00:00
BST
GMT
虽然我期望,像这样的东西(我猜 UTC 也可能是 GMT):
2023-10-29 00:00:00
2023-10-29 23:59:59.999999
CEST
CET
2023-10-28 22:00:00+00:00
2023-10-29 22:59:59.999999+00:00
UTC
UTC
不仅时间不对,而且时区也很奇怪。
答:
1赞
FObersteiner
10/29/2023
#1
Pytz 只是设置时区,它不会像那样转换。localize
astimezone
下面是代码的略微修改版本。我们可以使用标准的 lib datetime.timezone.utc 来设置 UTC,以使事情更清晰一些(pytz 自 Python 3.9 起被弃用)。另请参阅代码中的注释以获取一些解释。
from datetime import datetime, time, timezone
start_of_day = datetime.combine(datetime.now(), time.min)
end_of_day = datetime.combine(datetime.now(), time.max)
print(start_of_day) # naive datetime here...
print(end_of_day)
print(start_of_day.astimezone().tzinfo)
print(end_of_day.astimezone().tzinfo)
start_of_day = start_of_day.astimezone(timezone.utc) # convert / make aware, UTC
end_of_day = end_of_day.astimezone(timezone.utc)
print(start_of_day)
print(end_of_day)
print(start_of_day.tzinfo) # datetime object is already aware here, no need for astimezone
print(end_of_day.tzinfo)
在配置为使用时区“欧洲/柏林”的系统上,输出为
2023-10-29 00:00:00 # naive datetime, but "silently" on UTC+2
2023-10-29 23:59:59.999999 # same but UTC+1
CEST
CET
# Note that the conversion from local to UTC applies the UTC offset:
2023-10-28 22:00:00+00:00 # was on UTC+2, so clock moves back 2h for UTC
2023-10-29 22:59:59.999999+00:00 # was UTC+1, clock back 1h
UTC
UTC
评论
0赞
Dieudonné
10/29/2023
谢谢,这按预期工作。时区仍然是错误的,因为显然我在树莓派上设置不正确,并且没有完全意识到我正在远程工作 - 时区在我的开发计算机上当然是正确的。
0赞
FObersteiner
10/29/2023
@Dieudonné很高兴能帮上忙。代码的第二部分是,如果你调用 ,你实际上是在转换为本地 tz,不管输入是 tz 感知的还是幼稚的。这就是为什么第一部分和第二部分的输出都是“BST”/“GMT”的原因。start_of_day.astimezone().tzinfo
评论