如果我想转换时区,通常我会做以下
# local interpreted as pst to utc
utc = pytz.utc
pst = pytz.timezone('America/Los_Angeles')
start_time_str = time.strftime('%Y-%m-%d %H:%M:%S',
time.localtime(start_time))
start_time_datetime =
datetime.datetime.strptime(start_time_str, "%Y-%m-%d %H:%M:%S")
start_time_datetime =
start_time_datetime.replace(tzinfo=pst).astimezone(utc)
现在我想做类似的事情,比如我想把本地时间转换成pst
localtime = datetime.datetime.fromtimestamp(time.mktime(
time.localtime()))
我不太确定你将如何实现这个
如有任何帮助,将不胜感激
两件事:
-
"America/Los_Angeles"
标识符表示整个太平洋时区,包括太平洋标准时间和太平洋标准时间。它将使用-8或-7作为时区偏移,这取决于它所使用的特定日期和时间。 -
调用
replace(tzinfo=...)
是一个错误。请改用localize
。请参阅pytz文档。这将在引言和第一个例子中进行讨论。
您的代码包含不必要的(在strftime
之后调用strptime
)或错误的(.replace()
)转换。
要创建一个已知日期时间对象,给定"自epoch以来的秒数"start_time
(time.time()
返回的值):
#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
tz = pytz.timezone('America/Los_Angeles')
start_time_datetime = datetime.fromtimestamp(start_time, tz)
正如@Matt Johnson所提到的,'America/Los_Angeles'
时区id根据日期生成具有PST或PDT tzname的时间。无需转换。
问题中的最后一个代码示例既有不必要的转换,在某些情况下可能会失败。如果目的是将本地时区中的当前时间作为一个可感知的日期时间对象,那么您可以使用tzlocal
模块:
#!/usr/bin/env python
from datetime import datetime
from tzlocal import get_localzone # $ pip install tzlocal
local_timezone = get_localzone() # pytz timezone corresponding to the local time
current_localtime = datetime.now(local_timezone)
首先,请注意,本地时间是标准时间或夏令时,两者不能同时存在。我相信你真正想问的是,是否有办法判断一个时间是否是夏令时。换句话说,给定一个特定的日子,特定的时间是夏令时吗?另一个常见的用例是将固定在特定时间偏移的表格数据转换为当前的正确时间。
好吧,我可以想出三种方法。
(1) 您可以将datetime
转换为time
对象,并查看.tm_isdst
属性,类似于此答案。您可以对其进行测试,看看该属性是否等于1,然后减去一小时的timedelta
。
>>> time.localtime()
time.struct_time(tm_year=2019, tm_mon=11, tm_mday=16, tm_hour=12,
tm_min=36, tm_sec=32, tm_wday=5, tm_yday=320, tm_isdst=0)
>>> time.localtime().tm_isdst
0
(2) 第二种方法是在每月15日中午之前逐月爬行,检查偏移量是否变化。(请注意,有些地区不实行夏令时。)较大的值表示夏令时提前。(例如,PDT是UTC-7,而PST是UTC-8。)根据这些值,您可以计算时差。然后,您可以通过检查偏移量来测试您的时间,看看它是在标准时间还是夏令时。Offest是这样检查的:
>>> my_special_pdt_datetime.strftime('%z')
'-0700'
(3) 也许最简单的方法是通过获得offset = datetime.datetime.utcnow() - datetime.datetime.now()
来计算现有的偏移量,然后将其与pytz的已知偏移量进行比较:
>>> pytz.timezone('US/Pacific').localize(datetime.datetime(2019,1,1)).strftime('%z')
'-0800'