为了清楚,这是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不应该进入它.)
我正在尝试将始终在太平洋时间的天真时间戳转换为UTC时间.在下面的代码中,我能够指定我的这个时间戳是在太平洋时间,但它似乎不知道它应该是UTC的-7小时的偏移,因为它只有10/21而且DST有尚未结束.
剧本:
import pytz
import datetime
naive_date = datetime.datetime.strptime("2013-10-21 08:44:08", "%Y-%m-%d %H:%M:%S")
localtz = pytz.timezone('America/Los_Angeles')
date_aware_la = naive_date.replace(tzinfo=localtz)
print date_aware_la
Run Code Online (Sandbox Code Playgroud)
输出:
2013-10-21 08:44:08-08:00
Run Code Online (Sandbox Code Playgroud)
它应该具有-07:00的偏移,直到DST在11月3日结束.当DST有效且无效时,如何让我的时区感知日期具有正确的偏移量?Pytz足够聪明,知道DST将于11月3日生效吗?
总体目标:我只是试图将时间戳转换为UTC,因为我知道我将在太平洋时间获得时间戳,而不会指示DST是否生效.我没有从python本身生成这个日期,所以我不能只使用utc_now().
由于某些我无法弄清楚的原因,从以下代码:
>>> 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.谢谢!
好吧,首先让我说我的时区是CET/CEST.它从CEST变为CET的确切时刻(从DST返回,即GMT + 2,再到正常,GMT + 1,因此)始终是10月的最后一个星期日凌晨3点.2010年10月31日凌晨3点.
现在请注意以下事项:
>>> import datetime
>>> import pytz.reference
>>> local_tnz = pytz.reference.LocalTimezone()
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 3600)
Run Code Online (Sandbox Code Playgroud)
如上所述,这是错误的.
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 30, 2, 12, 30))
datetime.timedelta(0, 7200)
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 7200)
Run Code Online (Sandbox Code Playgroud)
现在它突然变得正确:/
我知道有几个问题已经存在,但给出的解决方案始终是"使用本地化",但我的问题是LocalTimezone不提供该方法.
事实上,我有几个时间戳,以毫秒为单位,我需要本地时区的utcoffset(不仅是我的,而是使用该程序的任何人).其中一个是1288483950000或Sun Oct 31 2010 02:12:30 GMT + 0200(CEST)在我的时区.
目前我执行以下操作来获取datetime对象:
datetime.datetime.fromtimestamp(int(int(millis)/1E3))
Run Code Online (Sandbox Code Playgroud)
这将在几分钟内得到utcoffset:
-int(local_tnz.utcoffset(date).total_seconds()/60)
Run Code Online (Sandbox Code Playgroud)
不幸的是,在很多场合都是错的:(.
有任何想法吗?
注意:我正在使用python3.2.4,而不是在这种情况下它应该是重要的.
编辑:
通过@JamesHolderness找到解决方案:
def datetimeFromMillis(millis):
return pytz.utc.localize(datetime.datetime.utcfromtimestamp(int(int(millis)/1E3)))
def getTimezoneOffset(date):
return -int(date.astimezone(local_tz).utcoffset().total_seconds()/60)
Run Code Online (Sandbox Code Playgroud)
local_tz等于tzlocal模块中的tzlocal.get_localzone().
具体来说,考虑到我的服务器的时区(系统时间透视图)和时区输入,如何计算系统时间,就像它在新时区(无论夏令时等)一样?
import datetime
current_time = datetime.datetime.now() #system time
server_timezone = "US/Eastern"
new_timezone = "US/Pacific"
current_time_in_new_timezone = ???
Run Code Online (Sandbox Code Playgroud) 如何确保datetime.date.today() 转换为UTC时间?
到目前为止这是我的代码:
#today : 2014-12-21
today = datetime.date.today()
#1900-01-01 16:00:00+00:00
timeformat = datetime.datetime.strptime('16:00', '%H:%M').replace(tzinfo=pytz.utc)
#combine today and timeformat 2014-12-21 16:00:00
now = datetime.datetime.combine(u, timeformat.time())
str_now = now.strftime("%Y-%m-%d %H:%M:%S")
Run Code Online (Sandbox Code Playgroud) 我在Django 1.4中有一个新项目,使用sqlite db.也使用django_extenstions的shell_plus没有问题.
当我安装IPython中,双方shell并shell_plus开始抱怨:
/path/to/my/virtualenv/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py:50:
RuntimeWarning: SQLite received a naive datetime (2012-07-29 13:15:45.229464) while time zone support is active.
Run Code Online (Sandbox Code Playgroud)
似乎IPython本身使用不知不觉的日期时间.怎么解决这个问题?
编辑:
我不想禁用Django的时区支持.
我有一个javascript日历,它发送给我一个unixtimestamp.我在新加坡.我希望将此时间戳解释为新加坡时间戳,然后转换为utc以与db进行比较.
我不能,为了我自己的生活,弄清楚如何告诉django这个时间戳是来自新加坡的当前时区.
当我打印时间戳的打印声明时,它会增加8个小时的时间(这意味着django认为我在utc中输入时间并将其本地化为新加坡背景)
在许多其他事情中,我试过:
start=datetime.datetime.fromtimestamp(int(start_date)).replace(tzinfo=get_current_timezone())
start_date是1325376000(转换为2012-01-01 00:00:00)
但是,当我打印输出时,我得到2012-01-01 08:00:00 + 06:55.我甚至不知道+06:55来自新加坡的时间是+08:00.我迷失了.
谢谢你的帮助.
settings.py:
TIME_ZONE = 'Asia/Singapore'
USE_TZ = True
在2013年6月1日,我预计"PST8PDT"时区的行为与GMT + 7一样,因为它是该时区的夏令时.但是,它的行为类似于GMT + 8:
>>> import pytz, datetime
>>> Pacific = pytz.timezone("PST8PDT")
>>> datetime.datetime(2013, 6, 1, 12, tzinfo=Pacific).astimezone(pytz.utc)
datetime.datetime(2013, 6, 1, 20, 0, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)
相比之下,在2013年1月1日,它表现得(正确)像GMT + 8:
>>> datetime.datetime(2013, 1, 1, 12, tzinfo=Pacific).astimezone(pytz.utc)
datetime.datetime(2013, 1, 1, 20, 0, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?提前致谢!
据我所知,我甚至不需要pytz来做我正在做的事情.
我正在使用O'Reilly的书"用Python编程计算机视觉"重新学习python进行图像处理(我也是mac的新手,所以无论如何,如果这是一个愚蠢的问题,我道歉).连同'empire.jpg'图片,我正在尝试运行第16页的脚本,如下所示:
from PIL import Image
from pylab import *
# read image to array
im = array(Image.open('empire.jpg')) # plot the image
imshow(im)
# some points
x = [100,100,400,400]
y = [200,500,200,500]
# plot the points with red star-markers
plot(x,y,'r*')
# line plot connecting the first two points
plot(x[:2],y[:2])
# add title and show the plot
title('Plotting: "empire.jpg"')
show()
Run Code Online (Sandbox Code Playgroud)
但我得到以下输出错误:
File "plotch1.py", line 2, in <module>
from pylab import *
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/pylab.py", line 1, in <module>
from matplotlib.pylab import * …Run Code Online (Sandbox Code Playgroud)