Python - 在特定时区设置日期时间(不涉及UTC转换)

35

仅仅想明确一下,这是 Python 2.6 版本,我使用的是 pytz 库。

这是为一个只涉及美国时区的应用程序所需的,我需要能够针对今天锚定日期并获取 PST 时区下晚上 8 点和 11 点的 Unix 时间戳(纪元时间)。

这真的让我疯狂了。

> pacific = pytz.timezone("US/Pacific")

> datetime(2011,2,11,20,0,0,0,pacific)

datetime.datetime(2011, 2, 11, 20, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:0 STD>)

> datetime(2011,2,11,20,0,0,0,pacific).strftime("%s")
'1297454400'

zsh> date -d '@1297454400'    
Fri Feb 11 12:00:00 PST 2011

即使我设置了时区并使用该时区创建日期时间,它仍将其创建为 UTC,然后进行转换。这是一个问题,因为当我尝试进行计算时,UTC会领先一天。

有没有一种简单(或至少合理)的方法来生成今天下午8点PST的时间戳?

(清楚地说,我确实了解在大多数情况下使用UTC的价值,比如数据库时间戳或用于普通存储。但这不是其中之一,我特别需要一个PST晚上的时间戳,而UTC不应该涉及其中。)


问题在哪里 - 您的结束日期为2011年2月11日星期五12:00:00 PST,而开始日期是2月11日? - mmmmmm
问题在于我正在尝试创建一个普通标准时间下午8点的日期时间,但它却创建了一个协调世界时下午8点的日期时间,并将其打印为中午。我真的只想创建一个“今天晚上8点PST”的对象并生成一个Unix时间戳,而不必进行大量的协调世界时操作。 - liam
https://dev59.com/r2455IYBdhLWcg3wD_yZ - Wtower
2个回答

26

至少有两个问题:

  1. 你不应该直接将非固定UTC偏移量的时区,比如"US/Pacific"作为tzinfo参数传递。你应该使用pytz.timezone("US/Pacific").localize()方法
  2. .strftime('%s')是不可移植的,它忽略了tzinfo,并且总是使用本地时区。请改用datetime.timestamp()旧版本Python上的类似函数

要在给定时区中创建具有时区信息的日期时间:

#!/usr/bin/env python
from datetime import datetime 
import pytz # $ pip install pytz

tz = pytz.timezone("US/Pacific")
aware = tz.localize(datetime(2011, 2, 11, 20), is_dst=None)

获取 POSIX 时间戳:

timestamp = (aware - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds()

(在 Python 2.6 上,请参考 totimestamp() 函数如何模拟 .total_seconds() 方法).


23
创建一个时区为UTC的tzinfo对象utc,然后尝试以下操作:
#XXX: WRONG (for any timezone with a non-fixed utc offset), DON'T DO IT
datetime(2011,2,11,20,0,0,0,pacific).astimezone(utc).strftime("%s")

编辑:正如评论中指出的那样,将时区放入datetime构造函数并不总是稳健的。使用pytz文档中推荐的方法是:

pacific.localize(datetime(2011,2,11,20,0,0,0)).astimezone(utc).strftime("%s")

同时请注意评论中提到的,strftime("%s") 不是很可靠,它会忽略时区信息(即使是UTC),并假设正在运行的系统的时区。它依赖于底层的C库实现,在某些系统上根本不起作用(例如Windows)。


实际上,那只在我使用的开放式解释器中有效,在将其移动到脚本后它现在返回了错误的结果。不过,我会继续努力的。 - liam
@liam,Python中的时区支持似乎总是让我感到不太完善。在这种情况下的问题是,即使在本地时区显示,Unix/Linux日期始终基于UTC,因此您需要调整Python日期以保持一致。 - Mark Ransom
是的,问题在于我在交互式 shell 中运行它,并且已经在 PST 上调用了 tzset()(我想是这样,现在找不到参考资料了)。这会导致 PST 被视为 UTC 并破坏所有 pytz 计算。 "半熟" 是一种低估,考虑到大多数内置库有多干净,我很惊讶 datetime 库是如此毫无意义的混乱。 - liam
1
从pytz文档中:"""不幸的是,对于许多时区,使用标准datetime构造函数的tzinfo参数与pytz一起使用'不起作用'。""" - Doncho Gunchev
@NickT 确定。这是我在2015年的回答 - jfs
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接