我想知道Python库Pytz中timezone参数的所有可能值.
for tz in pytz.all_timezones:
print tz
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Asmera
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau
Africa/Blantyre
Africa/Brazzaville
Africa/Bujumbura
Africa/Cairo
Africa/Casablanca
Africa/Ceuta
Africa/Conakry
Africa/Dakar
Africa/Dar_es_Salaam
Africa/Djibouti
Africa/Douala
Africa/El_Aaiun
Africa/Freetown
Africa/Gaborone
Africa/Harare
Africa/Johannesburg
Africa/Juba
Africa/Kampala
Africa/Khartoum
Africa/Kigali
Africa/Kinshasa
Africa/Lagos
Africa/Libreville
Africa/Lome
Africa/Luanda
Africa/Lubumbashi
Africa/Lusaka
Africa/Malabo
Africa/Maputo
Africa/Maseru
Africa/Mbabane
Africa/Mogadishu
Africa/Monrovia
Africa/Nairobi
Africa/Ndjamena
Africa/Niamey
Africa/Nouakchott
Africa/Ouagadougou
Africa/Porto-Novo
Africa/Sao_Tome
Africa/Timbuktu
Africa/Tripoli
Africa/Tunis
Africa/Windhoek
America/Adak
America/Anchorage
America/Anguilla
America/Antigua
America/Araguaina
America/Argentina/Buenos_Aires
America/Argentina/Catamarca
America/Argentina/ComodRivadavia
America/Argentina/Cordoba
America/Argentina/Jujuy
America/Argentina/La_Rioja
America/Argentina/Mendoza
America/Argentina/Rio_Gallegos
America/Argentina/Salta
America/Argentina/San_Juan
America/Argentina/San_Luis
America/Argentina/Tucuman
America/Argentina/Ushuaia …
Run Code Online (Sandbox Code Playgroud) 我试图理解为什么在将时区转换为UTC时我得到这些结果:
In [74]: d1 = datetime(2007, 12, 5, 6, 30,tzinfo=pytz.timezone('US/Pacific'))
In [75]: d1
Out[75]: datetime.datetime(2007, 12, 5, 6, 30, tzinfo=<DstTzInfo 'US/Pacific' LMT-1 day, **16:07:00 STD**>)
In [76]: d1.astimezone(pytz.utc)
Out[76]: datetime.datetime(2007, 12, 5, 14, 23, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)
为什么早上6:30成为下午2:23?
另一方面,如果我使用以下方法,我得到预期的结果:
In [90]: d2 = datetime(2007, 12, 5, 6, 30)
In [91]: uspac = pytz.timezone('US/Pacific')
In [92]: d2_aware = uspac.localize(d2)
In [94]: d2_aware.astimezone(pytz.utc)
Out[94]: datetime.datetime(2007, 12, 5, 14, 30, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud) 我尝试使用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时区,为什么我会弄错,我该如何解决呢?
由于某些我无法弄清楚的原因,从以下代码:
>>> from pytz import timezone
>>> timezone('America/Chicago')
Run Code Online (Sandbox Code Playgroud)
我明白了:
<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD>
Run Code Online (Sandbox Code Playgroud)
我想,我应该得到:
<DstTzInfo 'America/Chicago' LMT-1 day, 18:00:00 STD>
Run Code Online (Sandbox Code Playgroud)
...因为我认为我的时区距离UTC只有6小时9分钟.
我已经查看了源代码,pytz
但我承认我还没有完全弄清楚出了什么问题.
我已将其他值传递给timezone()
函数,它返回的值似乎是正确的.但由于某些原因,与我的时区相关的信息不正确.
最后,我旁边的立方体中的同事确认该函数在他的机器上返回正确的时区信息.
有谁知道为什么我的时区('America/Chicago'
)会在9分钟后关闭?我运行版本2015.7
的pytz
安装使用pip
.谢谢!
import pytz, datetime
pytz.timezone("Asia/Calcutta")
Run Code Online (Sandbox Code Playgroud)
打印以下内容:
< DstTzInfo 'Asia/Calcutta' HMT+5:53:00 STD >
Run Code Online (Sandbox Code Playgroud)
为什么不是05:30呢?我在时区America/Los_Angeles.
我正在编写一个程序,它可以处理很多时区并将它们交叉.我最常处理的两件事是从"now"创建一个datetime对象,然后本地化一个天真的datetime对象.
要在太平洋时区创建一个日期时间对象,我目前正在这样做(python 2.7.2+)
from datetime import datetime
import pytz
la = pytz.timezone("America/Los_Angeles")
now = datetime.now(la)
Run Code Online (Sandbox Code Playgroud)
对于夏令时,这是正确的吗?如果没有,我想我应该这样做:
now2 = la.localize(datetime.now())
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么?任何人都可以告诉我第一个错误的情况,秒是对的?
至于我的秒问题,假设我在加利福尼亚州洛杉矶上午8:00的某个用户输入中有一个天真的日期和时间.是这样制作日期时间的正确方法:
la.localize(datetime(2012, 9, 1, 8, 0))
Run Code Online (Sandbox Code Playgroud)
如果没有,我应该如何构建这些日期时间?
我正在尝试通过以下方式在保存和加载时根据时区修改日期时间:
输入日期时间以及输入时区被发送到服务器,服务器应更新日期时间以反映时区。所以当它保存在数据库(PostregSQL)中时,保存的是UTC时间(当然是在时区引起的偏移之后)。
为了反映这一点,这里有一个以相同方式失败的简单示例:
一些进口:
>>> import datetime
>>> import pytz
>>> from apps.myapp.models import Project
Run Code Online (Sandbox Code Playgroud)
创建两个输入:
>>> input_date = timezone.now()
>>> input_date
datetime.datetime(2017, 2, 7, 16, 7, 14, 377429, tzinfo=<UTC>)
>>> current_tz = pytz.timezone('America/New_York')
>>> current_tz
<DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD>
Run Code Online (Sandbox Code Playgroud)
如您所见,时区不是5h
( 24 - 19 = 5
),而是4h56
. 在这个阶段我认为没关系,它可能与夏令时有关。
现在我正在替换输入日期的时区:
>>> input_date = input_date.replace(tzinfo=current_tz)
>>> input_date
datetime.datetime(2017, 2, 7, 16, 7, 14, 377429, tzinfo=<DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD>)
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,时间没有改变,但时区改变了,这很好。
我将这个值分配给一个项目(launch_date
是一种DateTimeField
没有任何具体的选项): …
我有时间数据,我正在使用它转换成时间戳
datetime.datetime.strptime(x,"%Y-%m-%d %H:%M:%S.%f")
Run Code Online (Sandbox Code Playgroud)
问题是,这会隐式加载 UTC 时间,当我尝试将其更改为本地时区时,它会添加/减去时间(将其转换)。
如何加载字符串作为时间戳并将其设置为本地时区(有夏令时)?
可能重复:
pytz的奇怪时区问题
这似乎是错的:
>>> import pytz
>>> z1 = timezone('America/Edmonton')
>>> z2 = timezone('US/Mountain')
>>> z1
<DstTzInfo 'America/Edmonton' LMT-1 day, 16:26:00 STD>
>>> z2
<DstTzInfo 'US/Mountain' MST-1 day, 17:00:00 STD>
>>> pytz.VERSION
'2012f'
>>>
Run Code Online (Sandbox Code Playgroud)
'America/Edmonton'和'US/Eastern'应该是同一时区(STD的17:00:00).更不用说16:26:00没有任何意义.
- 更新 -
以上是Jon Skeet的回答.但是,当我这样做时,事情变得奇怪:
>>> d = datetime.now()
>>> d
datetime.datetime(2012, 10, 9, 15, 21, 41, 644706)
Run Code Online (Sandbox Code Playgroud)
我创造了一个天真的约会.由于'America/Edmonton' 是我的时区,我尝试手动设置:
>>> d2 = d.replace(tzinfo=timezone('America/Edmonton'))
>>> d2
datetime.datetime(2012, 10, 9, 15, 21, 41, 644706, tzinfo=<DstTzInfo 'America/Edmonton' LMT-1 day, 16:26:00 STD>)
Run Code Online (Sandbox Code Playgroud)
这不应该有任何改变,因为这是正确的TZ.然而:
>>> d2.astimezone(timezone('US/Eastern'))
datetime.datetime(2012, 10, …
Run Code Online (Sandbox Code Playgroud) 有人可以解释一下为什么我不能得到相同的结果吗?
import datetime,pytz
var1 = datetime.datetime(2017,10,25,20,10,50,tzinfo=pytz.timezone("Europe/Athens")))
print(var1)
Run Code Online (Sandbox Code Playgroud)
此代码的输出是: 2017-10-25 20:10:50+01:35
import datetime,pytz
var1 = datetime.datetime(2017,10,25,20,10,50)
var1 = pytz.timezone("Europe/Athens").localize(var1)
print(var1)
Run Code Online (Sandbox Code Playgroud)
此代码的输出是: 2017-10-25 20:10:50+03:00
我的问题是为什么他们有不同的时区(1:35和3:00).我知道第二个代码是真的,因为我的UTC是3:00
.但是你能告诉我为什么我要进入1:35
第一个吗?