我目前正在使用OSX上版本1.6.1和Python 2.7.5版本的官方Django教程.我正在开发第2部分,即管理界面.当我尝试进入/ admin/polls/poll /时,我收到以下错误报告:
ImproperlyConfigured at /admin/polls/poll/
This query requires pytz, but it isn't installed.
Request Method: GET
Request URL: http://127.0.0.1:8000/admin/polls/poll/
Django Version: 1.6.1
Exception Type: ImproperlyConfigured
Exception Value:
This query requires pytz, but it isn't installed.
Exception Location: /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py in datetime_trunc_sql, line 196
Python Executable: /opt/local/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python
Python Version: 2.7.5
Run Code Online (Sandbox Code Playgroud)
我尝试通过安装pip(需要安装setuptools)安装pytz,但这没有任何区别.此外,我将再次阅读本教程,我知道一个月前我没有遇到过这个问题.可能更新到小牛队造成了一些问题吗?
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)
如果没有,我应该如何构建这些日期时间?
我有一个数据库,存储日期时间为UTC.我需要查询特定时间的信息,但日期和时间是在当地时间给出的,比如说'欧洲/哥本哈根'.我给这些作为:
year = 2012; month = 12; day = 2; hour = 13; min = 1;
Run Code Online (Sandbox Code Playgroud)
所以,我需要将这些转换为UTC,以便我可以在数据库中查找它们.我想用这个来做pytz.我在看localize:
local_tz = timezone('Europe/Copenhagen')
t = local_tz.localize(datetime.datetime(year, month, day, hour, min))
Run Code Online (Sandbox Code Playgroud)
但我很困惑localize().这是假设那一年等在当地时间给我的吗?或者,它是否假设它们是以UTC格式给出的,现在它已将它们转换为当地时间?
print t 给我:
2012-12-02 13:01:00+01:00
Run Code Online (Sandbox Code Playgroud)
所以它似乎假设原始年份等在utc; 小时现在是13 + 1而不是13.所以我该怎么做呢?我已经阅读了pytz文档,但这并没有让我更清楚.它提到了很多东西是棘手的,所以我不确定pytz是否真的解决了这些问题.而且,我并不总是知道这些例子是否向我展示了有效的东西或不起作用的东西.
我试过规范化:
print local_tz.normalize(t)
Run Code Online (Sandbox Code Playgroud)
这给了我与print t相同的结果.
编辑:使用上面给出的年份等数字,它应该与2012-12-2 12:01数据库中的信息相匹配.(因为那天哥本哈根是utc + 1)
有谁能帮我理解这里发生了什么?
import pytz
from datetime import datetime
tz = pytz.timezone('Europe/Berlin')
print repr(tz)
# <DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>
dt = datetime(2011, 1, 3, 18, 40)
result = tz.localize(dt)
print repr(result.tzinfo)
# <DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>
assert result.tzinfo == tz, "Why aren't these the same timezone?"
Run Code Online (Sandbox Code Playgroud)
我的理解是localize()pytz时区对象上的方法将采用一个天真的日期时间对象,并添加一个tzinfo匹配执行本地化的时区对象的属性.在这种情况下似乎没有发生这种情况.
显然,我对时区或者pytz处理时区的方式有些误解.谁能解释一下?
这只是另一篇文章pytz.
有两个函数可以在两个时区之间转换日期时间对象.第二个功能适用于所有情况.第一个函数在两种情况下失败,(3)和(4).类似的SO帖子没有这样的问题.任何解释基础上的区别localize(datetime.datetime)和replace(tzinfo)将是一个很大的帮助.
>>> from dateutil.parser import parse
>>> import pytz
Run Code Online (Sandbox Code Playgroud)
以下功能使用datetime.datetime.replace(tzinfo).
def buggy_timezone_converter(input_dt, current_tz='UTC', target_tz='US/Eastern'):
'''input_dt is a datetime.datetime object'''
current_tz = pytz.timezone(current_tz)
target_tz = pytz.timezone(target_tz)
target_dt = input_dt.replace(tzinfo=current_tz).astimezone(target_tz)
return target_tz.normalize(target_dt)
Run Code Online (Sandbox Code Playgroud)
现在注意四个日期时间转换.
(1)从UTC到EST - 好的
>>> buggy_timezone_converter(parse('2013-02-26T04:00:00'))
Out[608]: datetime.datetime(2013, 2, 25, 23, 0, tzinfo=<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>)
Run Code Online (Sandbox Code Playgroud)
(2)从UTC到EDT - 好的
>>> buggy_timezone_converter(parse('2013-05-26T04:00:00'))
Out[609]: datetime.datetime(2013, 5, 26, 0, 0, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)
Run Code Online (Sandbox Code Playgroud)
(3)从EST到UTC - 不行.时间偏移是4小时56分钟.它应该是5个小时 …
delorean文档显示这种方式来获得在给定的时区当前时间 使用datetime:
from datetime import datetime
from pytz import timezone
EST = "US/Eastern"
UTC = "UTC"
d = datetime.utcnow()
utc = timezone(UTC)
est = timezone(EST)
d = utc.localize(d)
d = est.normalize(EST)
Run Code Online (Sandbox Code Playgroud)
并将其与基于delorian的代码进行比较:
from delorean import Delorean
EST = "US/Eastern"
d = Delorean(timezone=EST)
Run Code Online (Sandbox Code Playgroud)
我相信这个datetime例子应该写成:
from datetime import datetime
import pytz
eastern_timezone = pytz.timezone("US/Eastern")
d = datetime.now(eastern_timezone)
Run Code Online (Sandbox Code Playgroud)
这更简洁.
当最后一个代码示例失败而第一个代码示例继续工作时,是否有任何情况?
更新: 当前示例:
from datetime import datetime
import pytz
d = datetime.utcnow()
d = pytz.utc.localize(d)
est …Run Code Online (Sandbox Code Playgroud) TL; DR;
如何转换2016-01-01为django timezone??
完整版本
我从表单中收到一个查询字符串参数,我想得到该字符串并将其用作Django中的日期时间过滤器.问题是,当我将字符串转换为日期时间时,它不会识别日期时间,因此由于时区不同而丢失了几个小时.也许我在格式化中迷失自己,但我无法做到.
我有pytz,我也有USE_TZ = True我的设置.
例:
from datetime import date
# Example from what I receive as GET querystring parameter
start_date, end_date = '15-01-2016', '16-01-2016'
DATE_FORMAT = '%Y-%m-%d'
start_date = start_date.split('-')
start_date = date(int(start_date[2]), int(start_date[1]), int(start_date[0]))
sd_filter = start_date.strftime(DATE_FORMAT)
end_date = end_date.split('-')
end_date = date(int(end_date[2]), int(end_date[1]), int(end_date[0]))
ed_filter = end_date.strftime(DATE_FORMAT)
#query
my_list = MyModel.objects.filter(created_at__range=(sd_filter, ed_filter))
Run Code Online (Sandbox Code Playgroud)
问题在于过滤器..由于djanto设置的时区,我失去了几个小时.
UPDATE1:我不需要将a转换datetime.now()为我的时间..我需要将字符串转换为datetime ..
有人帮忙吗?
提前致谢