标签: django-timezone

django的timezone.now没有显示正确的时间

我的服务器在伦敦.

在我的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(莫斯科时间)

django django-timezone

47
推荐指数
1
解决办法
3万
查看次数

Django default = timezone.now()使用"旧"时间保存记录

这个问题现在已经发生了几个星期,而且与我的项目提出的不同.

使用的两个模型具有时间戳字段,默认情况下设置为timezone.now().

这是引发错误标志的序列:


  • 模型一在下午7:30创建

  • 模型二是在晚上10点创建的,但在MySQL数据库中它存储为晚上7:30!

创建的每个模型的时间戳都保存在下午7:30,而不是实际时间,直到某个持续时间过去.然后设置一个新的时间,所有以下模型都有新的时间... Bizzare


一些额外的细节可能有助于发现问题:

我有一堆方法可以剥离我们的时区,tzinfo并用UTC替换它们.

这是因为我正在进行timezone.now() - creationTime计算以创建:"模型在很久以前发布"功能在项目中.但是,这确实不应该是问题的原因.

我认为使用datetime.datetime.now()不会产生任何影响.

无论如何,谢谢你的帮助!

python django django-timezone

17
推荐指数
2
解决办法
1万
查看次数

DateTimeField收到了一个天真的日期时间

我有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查询直接将当前时间插入到表中?

python mysql django datetime django-timezone

17
推荐指数
2
解决办法
2万
查看次数

Timezone.now()vs datetime.datetime.now()

我什么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)

是否有关于何时使用每种方法的经验法则?

python django datetime django-timezone

13
推荐指数
1
解决办法
4156
查看次数

django DateTimeField与UTC偏移量?

我有一个带有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)

python django django-timezone

12
推荐指数
1
解决办法
2万
查看次数

ValueError:在Django中迁移manage.py文件时设置的时区不正确

我正在关注使用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

python django timezone django-timezone

9
推荐指数
2
解决办法
7560
查看次数

如何在Django中获取当前用户的时区?

我试图让我的 Django 应用程序与当前用户的时区一起工作,但我没有得到任何结果......

在我的 settings.py 文件中我设置:

TIME_ZONE = 'UTC'
Run Code Online (Sandbox Code Playgroud)

在我的中views.py,我在代码顶部设置:

activate(settings.TIME_ZONE)
Run Code Online (Sandbox Code Playgroud)

但这不起作用,在创建帖子时,正在获取我的最后一个时区“马德里”,而不是我当前的时区。

有办法让这项工作发挥作用吗?

谢谢你!

python django timezone django-settings django-timezone

9
推荐指数
2
解决办法
1万
查看次数

Django datetimefield时区感知CET

我看到这篇文章是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)

python sqlite django-models django-timezone

8
推荐指数
1
解决办法
3555
查看次数

Django DateTimeField 说“您比服务器时间提前 5.5 小时。”

在我存储的其中一个模型中 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)

python django timezone django-timezone

8
推荐指数
1
解决办法
4910
查看次数

创建时区感知日期时间对象的两种方法(Django)。相差七分钟?

到目前为止,我认为创建时区感知日期时间的两种方法是相同的。

但他们不是:

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)

python django datetime django-timezone

8
推荐指数
1
解决办法
2172
查看次数