给定特定用户的pytz时区(根据他的偏移量计算),我想显示该时区的通用名称.我假设人们更习惯于看到EST或PST,而不是像America/NewYork那样拼写出来.
pytz会在某处给我那些标准名称,还是我必须通过表格手动执行此操作?这可能会变得混乱,因为例如,一个季节的地方是EST,而在其他地方转移到显示EDT.
我有一个datetime没有时区信息.我现在正在获取时区信息,并希望将时区添加到现有的datetime实例中,我该怎么办?
d = datetime.datetime.now()
tz = pytz.timezone('Asia/Taipei')
Run Code Online (Sandbox Code Playgroud)
如何将时区信息添加tz到datetimea
我正在使用一个代码,它给我utc时间戳,我想将它们转换为适当的日期时间.不幸的是,当我用pytz测试简单的情况时,日期时间增加了6个小时(CST偏移到UTC).我需要保持时区数据的正确性,因为我正在计算其他时区之间的差异.任何想法为什么以及如何将utc时间戳转换为utc日期时间?
In [1]: import pytz
In [2]: from datetime import datetime
In [3]: import time
In [4]: datetime.fromtimestamp(time.mktime(datetime(7,1,1, tzinfo=pytz.UTC).timetuple()), tz=pytz.UTC)
Out[4]: datetime.datetime(2007, 1, 1, 6, 0, tzinfo=<UTC>)
In [5]: datetime.fromtimestamp(time.mktime(datetime(7,1,1).utctimetuple()), tz=pytz.UTC)
Out[5]: datetime.datetime(2007, 1, 1, 6, 0, tzinfo=<UTC>)
In [6]: datetime.fromtimestamp(time.mktime(datetime(7,1,1).utctimetuple()))
Out[6]: datetime.datetime(2007, 1, 1, 0, 0)
Run Code Online (Sandbox Code Playgroud) 将天真时间tzinfo转换为UTC时间的正确方法是什么?说我有:
d = datetime(2009, 8, 31, 22, 30, 30)
tz = timezone('US/Pacific')
Run Code Online (Sandbox Code Playgroud)
第一种方式,pytz启发:
d_tz = tz.normalize(tz.localize(d))
utc = pytz.timezone('UTC')
d_utc = d_tz.astimezone(utc)
Run Code Online (Sandbox Code Playgroud)
第二种方式,来自UTCDateTimeField
def utc_from_localtime(dt, tz):
dt = dt.replace(tzinfo=tz)
_dt = tz.normalize(dt)
if dt.tzinfo != _dt.tzinfo:
# Houston, we have a problem...
# find out which one has a dst offset
if _dt.tzinfo.dst(_dt):
_dt -= _dt.tzinfo.dst(_dt)
else:
_dt += dt.tzinfo.dst(dt)
return _dt.astimezone(pytz.utc)
Run Code Online (Sandbox Code Playgroud)
不用说,这两种方法在很多时区产生不同的结果.
问题是 - 什么是正确的方法?
我有一个datetimeutc时区,例如:
utc_time = datetime.datetime.utcnow()
Run Code Online (Sandbox Code Playgroud)
还有一个pytz时区对象:
tz = timezone('America/St_Johns')
Run Code Online (Sandbox Code Playgroud)
转换utc_time到给定时区的正确方法是什么?
我尝试使用datetime和pytz在python中创建一个datetime对象,显示的偏移是错误的.
import datetime
from pytz import timezone
start = datetime.datetime(2011, 6, 20, 0, 0, 0, 0, timezone('Asia/Kolkata'))
print start
Run Code Online (Sandbox Code Playgroud)
显示的输出是
datetime.datetime(2011, 6, 20, 0, 0, tzinfo=<DstTzInfo 'Asia/Kolkata' HMT+5:53:00 STD>)
Run Code Online (Sandbox Code Playgroud)
请注意,'Asia/Kolkata'是IST,GMT + 5:30,而不是HMT + 5:53.这是一个标准的linux时区,为什么我会弄错,我该如何解决呢?
python(或pytz)中是否存在跨平台功能,它返回tzinfo与当前在计算机上设置的时区对应的对象?
环境变量不能指望,因为它们不是跨平台的
我正在阅读不那么完整的pytz文档,而且我一直在理解它的一部分.
时区之间的转换也需要特别注意.这也需要使用normalize方法来确保转换是正确的.
>>> utc_dt = utc.localize(datetime.utcfromtimestamp(1143408899))
>>> utc_dt.strftime(fmt)
'2006-03-26 21:34:59 UTC+0000'
>>> au_tz = timezone('Australia/Sydney')
>>> au_dt = au_tz.normalize(utc_dt.astimezone(au_tz))
>>> au_dt.strftime(fmt)
'2006-03-27 08:34:59 EST+1100'
>>> utc_dt2 = utc.normalize(au_dt.astimezone(utc))
>>> utc_dt2.strftime(fmt)
'2006-03-26 21:34:59 UTC+0000'
Run Code Online (Sandbox Code Playgroud)
我没有使用过这个例子normalize,结果就是这样.在我看来,这个例子并没有真正解释为什么我们必须在不同时区的对象normalize之间进行转换datetime时使用.
有人请给我一个例子(如上所述),结果在不使用时有所不同normalize.
谢谢
我正在尝试将时区感知datetime对象转换为UTC,然后再回到它的原始时区.我有一个以下代码段
t = datetime(
2013, 11, 22, hour=11, minute=0,
tzinfo=pytz.timezone('Europe/Warsaw')
)
Run Code Online (Sandbox Code Playgroud)
现在在ipython中:
In [18]: t
Out[18]: datetime.datetime(
2013, 11, 22, 11, 0, tzinfo=<DstTzInfo 'Europe/Warsaw' WMT+1:24:00 STD>
)
Run Code Online (Sandbox Code Playgroud)
现在让我们尝试转换为UTC并返回.我希望有相同的表示:
In [19]: t.astimezone(pytz.utc).astimezone(pytz.timezone('Europe/Warsaw'))
Out[19]: datetime.datetime(
2013, 11, 22, 10, 36, tzinfo=<DstTzInfo 'Europe/Warsaw' CET+1:00:00 STD>
)
Run Code Online (Sandbox Code Playgroud)
然而,我们看到Out[18]并且Out[19]有所不同.这是怎么回事?
为了清楚,这是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
Run Code Online (Sandbox Code Playgroud)
因此,即使我正在设置时区,并使用该时区创建日期时间,它仍然将其创建为UTC然后转换它.这是一个更大的问题,因为当我尝试进行计算时,UTC将会提前一天.
是否有一种简单(或至少是敏感)的方式来生成今天太平洋标准时间晚上8点的时间戳?
(很明显,我确实理解在大多数情况下使用UTC的价值,比如数据库时间戳,或者用于一般存储.这不是其中一种情况,我特别需要PST的晚上时间戳,UTC不应该进入它.)