我的服务器在伦敦.
在我的settings.py身上:
TIME_ZONE = 'Europe/Moscow'
USE_TZ = True
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时:
from django.utils import timezone
print timezone.now().hour
Run Code Online (Sandbox Code Playgroud)
它打印伦敦的时间.我做错了什么?
更新:
>> timezone.now()
datetime.datetime(2013, 4, 16, 12, 28, 52, 797923, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)
tzinfo = <UTC>,也许它打印的不是伦敦时间,而是UTC的+0时间?无论如何,如何让django展示莫斯科时间?
另外,当我渲染模板时now = timezone.now().
{{ now.hour }} 打印,例如,12(伦敦时间)
{{ now|date:"G" }} 打印16(莫斯科时间)
这个问题现在已经发生了几个星期,而且与我的项目提出的不同.
使用的两个模型具有时间戳字段,默认情况下设置为timezone.now().
这是引发错误标志的序列:
模型一在下午7:30创建
模型二是在晚上10点创建的,但在MySQL数据库中它存储为晚上7:30!
创建的每个模型的时间戳都保存在下午7:30,而不是实际时间,直到某个持续时间过去.然后设置一个新的时间,所有以下模型都有新的时间... Bizzare
一些额外的细节可能有助于发现问题:
我有一堆方法可以剥离我们的时区,tzinfo并用UTC替换它们.
这是因为我正在进行timezone.now() - creationTime计算以创建:"模型在很久以前发布"功能在项目中.但是,这确实不应该是问题的原因.
我认为使用datetime.datetime.now()不会产生任何影响.
无论如何,谢谢你的帮助!
我有DateTimeField列的模型.
我试图通过sql查询将带有数据库current_time值的行直接插入到表中.
我对MySQL数据库的SQL查询如下:
INSERT INTO MyTable (..., my_datetime, ...) VALUES (..., current_time, ...)
Run Code Online (Sandbox Code Playgroud)
得到:
运行时警告:DateTimeField ModelName.field_name在时区支持处于活动状态时收到了一个天真的日期时间(2014-01-09 22:16:23).
如何在没有警告的情况下通过sql查询直接将当前时间插入到表中?
我什么timezone.now()时候应该使用django ,什么时候应该使用python datetime.datetime.now()?
例如,在下面INSERT哪个更有意义?
- Product.objects.create(title='Soap', date_added=datetime.datetime.now())
- Product.objects.create(title='Soap', date_added=timezone.now())
Run Code Online (Sandbox Code Playgroud)
是否有关于何时使用每种方法的经验法则?
我有一个带有DateTimeField的模型:
deadline = models.DateTimeField(verbose_name="Valid unitl", null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)
应允许用户在现场输入日期,时间和时区信息.这是我想要的格式:
2012-12-31 23:30 +0430
Run Code Online (Sandbox Code Playgroud)
我希望在存储到db之前将时间转换为UTC.所以我尝试使用模型表单,但Enter a valid date/time.如果输入上面的值,它会在该DateTimeField上抛出验证错误.
这是在settings.py中:
DATE_INPUT_FORMATS = ('%Y-%m-%d %H:%M %Z', )
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
编辑:
根据ВидулПетров的建议,尝试使用表单字段:
deadline2 = forms.DateTimeField(input_formats=['%Y-%m-%d %H:%M %Z',],
Run Code Online (Sandbox Code Playgroud)
得到了同样的效果: Enter a valid date/time.
编辑2
看来datetime无法处理"%z"参数.这会抛出一个ValueError:
datetime.datetime.strptime(value, format)
Run Code Online (Sandbox Code Playgroud)
所以我在控制台中测试了它:
>>> import datetime
>>> datetime.datetime.strptime('2012-12-30 19:00 +0100', "%Y-%m-%d %H:%M %z")
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 317, in _strptime
(bad_directive, format))
ValueError: 'z' is a bad directive in format '%Y-%m-%d …Run Code Online (Sandbox Code Playgroud) 我正在关注使用Django编写第一个应用程序的Django官方文档.
在这里,它说我必须在settings.py文件中将TIME_ZONE设置为我的时区.
TIME_ZONE的默认值为:"utc"
我已将其更改为:"utc + 6.00"
在此版本之后我尝试迁移manage.py文件:
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)
发生了值错误:
ValueError: Incorrect timezone setting: UTC+6.00
Run Code Online (Sandbox Code Playgroud)
对不起,如果这是一个非常基本的问题.但在谷歌搜索数小时之后,我无法找到解决方案.
注意:
我的时区是亚洲/达卡(+6:00)
我的操作系统是Ubuntu 14.10
我试图让我的 Django 应用程序与当前用户的时区一起工作,但我没有得到任何结果......
在我的 settings.py 文件中我设置:
TIME_ZONE = 'UTC'
Run Code Online (Sandbox Code Playgroud)
在我的中views.py,我在代码顶部设置:
activate(settings.TIME_ZONE)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,在创建帖子时,正在获取我的最后一个时区“马德里”,而不是我当前的时区。
有办法让这项工作发挥作用吗?
谢谢你!
我看到这篇文章是Django在将数据保存到数据库时会破坏时区感知的DateTimeField吗?但它专门使用pytz和mysql,而不是我不使用pytz并使用SQLite(因为它可能会产生影响).
我有以下型号
class ScheduleItem(models.Model):
work_date = models.DateTimeField('Work date')
Run Code Online (Sandbox Code Playgroud)
我插入数据如下:
from isoweek import Week
from dateutil import parser
from django.utils import timezone
def foo()
year = 2016 #hardcoded for example purpose
wknr = 2 #hardcoded for example purpose
dateObj = parser.parse(Week(year, wknr).day(0).isoformat() + " 00:00:00")
print(dateObj) # 2016-01-11 00:00:00 as expected
final = timezone.make_aware(dateObj)
print(final) # 2016-01-11 00:00:00+01:00 as expected
return final
workdate = foo()
si = ScheduleItem(work_date=workdate)
si.save()
Run Code Online (Sandbox Code Playgroud)
print语句给了我正确的输出,但是一旦我查看数据库(SQLite),我就看到了 2016-01-10 23:00:00
我的django设置说
TIME_ZONE = 'CET'
USE_TZ = True …Run Code Online (Sandbox Code Playgroud) 在我存储的其中一个模型中 time_stamp = models.DateTimeField(default=timezone.now)
但是当我保存模型时,它说You are 5.5 hours ahead of server time.
例如我的机器中的本地时间是13:02但是在保存存储在 db 中的内容之后是7:16
我在这里得到了一个相关的但它没有一个令人满意的答案......
模型.py
class Comment(models.Model):
time_stamp = models.DateTimeField(default=timezone.now)
def save(self, *args, **kwargs):
''' On save, update timestamps '''
if not self.id:
self.time_stamp = timezone.now()
return super(Comment, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud) 到目前为止,我认为创建时区感知日期时间的两种方法是相同的。
但他们不是:
import datetime
from django.utils.timezone import make_aware, get_current_timezone
make_aware(datetime.datetime(1999, 1, 1, 0, 0, 0), get_current_timezone())
datetime.datetime(1999, 1, 1, 0, 0, 0, tzinfo=get_current_timezone())
Run Code Online (Sandbox Code Playgroud)
datetime.datetime(1999, 1, 1, 0, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>)
datetime.datetime(1999, 1, 1, 0, 0, tzinfo=<DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>)
Run Code Online (Sandbox Code Playgroud)
在 Django 管理 GUI 中,第二种方式创建此(德语日期格式 dd.mm.YYYY):
01.01.1999 00:07:00
Run Code Online (Sandbox Code Playgroud)
如果我使用这个,为什么会有 7 分钟的差异:
datetime.datetime(1999, 1, 1, 0, 0, 0, tzinfo=get_current_timezone())
Run Code Online (Sandbox Code Playgroud)