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

时间:2011-02-11 22:27:29

标签: python datetime pst pytz

为了清楚,这是python 2.6,我正在使用pytz。

这适用于仅处理美国时区的应用程序,我需要能够锚定日期(今天),并且仅在太平洋标准时间晚上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应该不必进入它。)

2 个答案:

答案 0 :(得分:14)

为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 :(得分:13)

至少有两个问题:

  1. 您不应该直接将具有非固定UTC偏移量的时区(例如"US/Pacific")作为tzinfo参数传递。您应该use pytz.timezone("US/Pacific").localize() method而不是
  2. .strftime('%s')不可移植,it ignores tzinfo,并且始终使用本地时区。请改用datetime.timestamp()its analogs on older Python versions
  3. 在给定时区内制作时区感知日期时间:

    #!/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 totimestamp() function on how to emulate .total_seconds() method)。