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

Posted

技术标签:

【中文标题】Python - 在特定时区设置日期时间(没有 UTC 转换)【英文标题】:Python - Setting a datetime in a specific timezone (without UTC conversions) 【发布时间】:2011-06-25 20:57:19 【问题描述】:

需要明确的是,这是 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 应该不必进入。)

【问题讨论】:

这里有什么问题 - 您的结束日期是 2011 年 2 月 11 日星期五 12:00:00 PST 2011 开始日期是 2 月 11 日? 问题是我正在尝试为太平洋标准时间晚上 8 点创建一个日期时间,它正在为世界标准时间晚上 8 点创建它并将其打印为中午。我真的只想为“8PM PST TODAY”创建一个对象并生成一个 unix 时间戳,而无需进行大量 UTC 操作。 ***.com/questions/4563272/… 【参考方案1】:

至少有两个问题:

    您不应将具有非固定 UTC 偏移量的时区(例如 "US/Pacific")直接作为 tzinfo 参数传递。您应该改为use pytz.timezone("US/Pacific").localize() method .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 totimestamp() function on how to emulate .total_seconds() method)。

【讨论】:

【参考方案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")

编辑: 正如 cmets 中所指出的,将时区放入 datetime 构造函数并不总是可靠的。使用pytz documentation 的首选方法是:

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

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

【讨论】:

实际上,这仅在我拥有的开放解释器中有效,一旦我将其移至脚本,它现在返回错误的结果。不过,我会继续努力。 @liam,在我看来,Python 中的时区支持总是半生不熟。这种情况下的问题是 Unix/Linux 日期始终基于 UTC,即使显示在您的本地时区中,您也需要将 Python 日期调整为同样。 是的,问题是我在交互式 shell 中运行它,并且已经在 PST 上调用了 tzset()(我想,我现在找不到参考)。这在 PST 被视为 UTC 并搞砸了所有 pytz 计算的情况下做了一些棘手的事情。 “半生不熟”是一种轻描淡写的说法,考虑到大多数内置库的干净程度,我对 datetime 库的混乱程度感到惊讶。 来自 pytz 文档:"""不幸的是,对于许多时区,使用标准 datetime 构造函数的 tzinfo 参数“不起作用”。""" @dgunchev,感谢您的提醒。我已经更新了答案。

以上是关于Python - 在特定时区设置日期时间(没有 UTC 转换)的主要内容,如果未能解决你的问题,请参考以下文章

获取特定时区的时间[重复]

将特定时区中的日期转换为 Python 中的时间戳

Rails 3:如何在特定时区获取今天的日期?

Redshift:将时间戳转换为特定时区的日期

python中datetime怎么设置时区

PHP,Codeigniter:如何在Web应用程序中根据用户时区/位置设置日期/时间?