Python-在特定时区中设置日期时间(不使用UTC转换)

2024-10-02 22:37:57 发布

您现在位置:Python中文网/ 问答频道 /正文

为了清楚起见,这是Python2.6,我正在使用pytz。

这是一个只处理美国时区的应用程序,我需要能够锚定一个日期(今天),并获得一个unix时间戳(纪元时间)为晚上8点和晚上11点在太平洋标准时间。

这把我逼疯了。

> 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

所以,即使我设置了一个时区,并用该时区创建了datetime,它仍然将其创建为UTC,然后将其转换。这是一个更大的问题,因为当我试图计算时,UTC将提前一天。

有没有一种简单的(或者至少是感性的)方法来生成今天晚上8点太平洋标准时间的时间戳?

(为了清楚起见,我确实理解在大多数情况下使用UTC的价值,比如数据库时间戳,或者用于常规存储。这不是其中一种情况,我特别需要PST中晚上的时间戳,UTC不必输入时间戳。)


Tags: 应用程序标准datetime时间unix情况usutc
2条回答

为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 documentation的首选方法是:

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

还要注意,从注释中可以看出strftime("%s")是不可靠的,它忽略了时区信息(甚至是UTC),并假定运行它的系统的时区。它依赖于底层的C库实现,在某些系统(如Windows)上根本不起作用。

至少有两个问题:

  1. 不应直接将具有非固定UTC偏移量(如"US/Pacific")的时区作为tzinfo参数传递。你应该use ^{} method代替
  2. .strftime('%s')是不可移植的,it ignores tzinfo,它总是使用本地时区。改用datetime.timestamp()its analogs on older Python versions

要使给定时区中的日期时间具有时区意识,请执行以下操作:

#!/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上,see ^{} function on how to emulate ^{} method)。

相关问题 更多 >