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

发布于 2024-10-17 04:56:42 字数 720 浏览 9 评论 0原文

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

Just to be clear, this is python 2.6, I am using pytz.

This is for an application that only deals with US timezones, I need to be able to anchor a date (today), and get a unix timestamp (epoch time) for 8pm and 11pm in PST only.

This is driving me crazy.

> 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

So, even though I am setting up a timezone, and creating the datetime with that time zone, it is still creating it as UTC and then converting it. This is more of a problem since UTC will be a day ahead when I am trying to do the calculations.

Is there an easy (or at least sensical) way to generate a timestamp for 8pm PST today?

(to be clear, I do understand the value of using UTC in most situations, like database timestamps, or for general storage. This is not one of those situations, I specifically need a timestamp for evening in PST, and UTC should not have to enter into it.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

墨小墨 2024-10-24 04:56:42

至少存在两个问题:

  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()< /code> 函数如何模拟 .total_seconds() 方法)。

There are at least two issues:

  1. you shouldn't pass a timezone with non-fixed UTC offset such as "US/Pacific" as tzinfo parameter directly. You should use pytz.timezone("US/Pacific").localize() method instead
  2. .strftime('%s') is not portable, it ignores tzinfo, and it always uses the local timezone. Use datetime.timestamp() or its analogs on older Python versions instead.

To make a timezone-aware datetime in the given timezone:

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

To get POSIX timestamp:

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).

‖放下 2024-10-24 04:56:42

为 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 > 构造函数并不总是健壮的。 首选方法是:

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

使用 pytz 文档的 评论说 strftime("%s") 不可靠,它忽略时区信息(甚至 UTC)并假定其运行的系统的时区。它依赖于底层 C 库实现,并且在某些系统(例如 Windows)上根本不起作用。

Create a tzinfo object utc for the UTC time zone, then try this:

#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")

Edit: As pointed out in the comments, putting the timezone into the datetime constructor isn't always robust. The preferred method using the pytz documentation would be:

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

Also note from the comments that strftime("%s") isn't reliable, it ignores the time zone information (even UTC) and assumes the time zone of the system it's running on. It relies on an underlying C library implementation and doesn't work at all on some systems (e.g. Windows).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文