26

需要明确的是,这是 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 点生成时间戳?

(需要明确的是,我确实理解在大多数情况下使用 UTC 的价值,例如数据库时间戳或一般存储。这不是其中一种情况,我特别需要在 PST 的晚上使用时间戳,而 UTC 不应该必须进入它。)

4

2 回答 2

23

至少有两个问题:

  1. 您不应直接传递具有非固定 UTC 偏移量的时区,例如"US/Pacific"tzinfo 参数。您应该改用pytz.timezone("US/Pacific").localize()方法
  2. .strftime('%s')不可移植,它忽略 tzinfo,并且始终使用本地时区。在较旧的 Python 版本上使用datetime.timestamp()或其类似物。

要在给定时区中创建时区感知日期时间:

#!/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()

(On Python 2.6, see totimestamp() function on how to emulate .total_seconds() method).

于 2014-09-04T11:58:16.437 回答
19

utc为 UTC 时区创建一个 tzinfo 对象,然后试试这个:

#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)上根本不起作用。

于 2011-02-11T23:01:20.983 回答