如果我想转换时区,通常我会做的如下
# 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)
现在我想做类似的事情,我希望localtime转换为pst
localtime = datetime.datetime.fromtimestamp(time.mktime(
time.localtime()))
我不确定你将如何实现这个
任何帮助将不胜感激
答案 0 :(得分:2)
两件事:
"America/Los_Angeles"
标识符代表整个太平洋时区,包括两者 PST和PDT。它将使用-8或-7作为时区偏移量,具体取决于使用它的具体日期和时间。
调用replace(tzinfo=...)
是个错误。请改用localize
。见the pytz documentation。这在引言和第一个例子中讨论过。
答案 1 :(得分:1)
答案 2 :(得分:1)
您的代码包含不必要的内容(strptime
之后调用strftime
)或错误(.replace()
)转换。
创建一个知晓的日期时间对象,给定“自纪元以来的秒数”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)
As @Matt Johnson mentions,'America/Los_Angeles'
时区ID根据日期生成PST或PDT tzname的时间。不需要转换。
您问题中的最后一个代码示例包含不必要的转换,并且在某些情况下可能会失败。如果目的是将当地时区的当前时间作为有意识的日期时间对象,那么您可以使用tzlocal
module:
#!/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)
答案 3 :(得分:0)
首先,请注意,本地时间是标准时间或夏令时-不能同时使用。我相信您真正要问的是问是否有一种方法可以确定某个时间是否为夏时制。换句话说,给定特定的一天,夏令时是否是特定的时间?另一个常见用例是将在特定时间偏移处固定的表格数据转换为当前正确时间。
好的,我可以想到三种方法来做到这一点。
(1)您可以将datetime
转换为time
对象,并查看.tm_isdst
属性similar to this answer。您可以对其进行测试以查看该属性是否等于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号中午逐月进行爬网,并检查偏移量是否变化。 (请注意,某些区域未实现DST。)该值越大,表示夏令时越早。 (例如,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'