我有一个DATETIME
以系统时间UTC存储的mysql 值.我需要将它转换为django中的当地时区.这是我目前拥有的:
# value in mysql
`timestamp`
2013-02-01 22:48:45
# settings.py
TIME_ZONE = 'America/Los_Angeles'
# views.py
last_updated = PathLastUpdated.objects.all()[0].timestamp
print last_updated
2013-02-01 22:48:45 <-- same as UTC
Run Code Online (Sandbox Code Playgroud)
如何将last_updated值设置为我当地的时区="America/Los Angeles"?
Aus*_*ips 34
时区的Django文档记录了将datetime
对象转换为适当时区以显示的所有必要细节.
您的数据以UTC格式存储,这很好.DateTime
从数据库中获取字段对象时,它将是一个天真的datetime.datetime
对象.即没有附加时区的日期/时间.然后由您来完成转换.
您的webapp用户可能位于不同的时区,因此必须为每个请求转换为适当的时区.这就是为什么有一个激活功能来设置当前时区.
如果你安装了pytz,你应该能够做到以下几点:
from django.utils.timezone import activate
activate(settings.TIME_ZONE)
Run Code Online (Sandbox Code Playgroud)
然后,模板引擎中日期字段的所有输出将自动将您的天真日期时间对象转换为正确的时区以供显示.
如果您只有一个datetime.datetime
想要设置时区的天真实例,那么只需pytz
直接使用该模块即可.在您的视图中执行此操作是不正常的,因为在演示时仅转换时区是个好主意.
from pytz import timezone
settings_time_zone = timezone(settings.TIME_ZONE)
last_updated = last_updated.astimezone(settings_time_zone)
Run Code Online (Sandbox Code Playgroud)
Fab*_*olo 20
哭了很多之后,我可以为我的国家显示这样的事情的正确日期:
>>> from django.utils.timezone import get_current_timezone
>>> from front.models import Training
>>> tz = get_current_timezone()
>>> stored_date = Training.objects.first().start_date
datetime.datetime(2015, 4, 25, 17, 0, tzinfo=<UTC>)
>>> desired_date = stored_date + tz.utcoffset(stored_date)
datetime.datetime(2015, 4, 25, 14, 0, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)
该tzinfo
属性显示为utc,但日期和时间显示正确.
更新30/10/2015(Django 1.8)
我今天正在使用另一种方法,那就是django友好
>>> from django.utils import timezone
>>> from trainings.models import Training
>>> value = Training.objects.first().date
>>> value
datetime.datetime(2015, 10, 23, 11, 32, 54, 633151, tzinfo=<UTC>)
>>> timezone.localtime(value)
datetime.datetime(2015, 10, 23, 9, 32, 54, 633151, tzinfo=<django.utils.timezone.LocalTimezone object at 0x7fa6129784a8>)
Run Code Online (Sandbox Code Playgroud)
小智 9
localtime是模板过滤器,这可能会有所帮助.
https://github.com/django/django/blob/1.8.4/django/utils/timezone.py#L298
代码示例:
from django.utils.timezone import localtime
desired_datetime = localtime(stored_datetime)
Run Code Online (Sandbox Code Playgroud)
我个人建议不要使用TIME_ZONE
UTC 以外的设置。我记得过去遇到过这个问题,因为数据库在与 Django 后端使用的时区不同(在不同的时区保存值)。这意味着要比较时间会很麻烦,根据你正在做的事情来回改变它们。
一个好的做法通常是在后端使用一个时区(比如 UTC)并将前端的时间转换为您正在服务的用户时区。
我已经创建了一个简单的中间件来为您处理所有这些内容:
https://github.com/Miserlou/django-easy-timezones
只需安装它并按照说明完成即可!
安装django-easy-timezones
pip install django-easy-timezones pytz pygeoip
Run Code Online (Sandbox Code Playgroud)将"easy-timeZones"添加到您的INSTALLED_APPS设置中,如下所示:
INSTALLED_APPS = (
...
'easy-timezones',
)
Run Code Online (Sandbox Code Playgroud)将EasyTimezoneMiddleware添加到MIDDLEWARE_CLASSES
MIDDLEWARE_CLASSES = (
...
'easy-timezones.middleware.EasyTimezoneMiddleware',
)
Run Code Online (Sandbox Code Playgroud)在设置文件中添加MaxMind GeoIP数据库的路径:
GEOIP_DATABASE = '/path/to/your/geoip/database/GeoIP.dat'
Run Code Online (Sandbox Code Playgroud)在模板中启用localtime.
{% load tz %}
The UTC time is {{ object.date }}
{% localtime on %}
The local time is {{ object.date }}
{% endlocaltime %}
Run Code Online (Sandbox Code Playgroud)田田!
我遇到了同样的问题。在我的设置中,我设置了TIME_ZONE
,但是MySql中的时间仍然是UTC时间。
# settings.py
TIME_ZONE = 'Asia/Shanghai'
Run Code Online (Sandbox Code Playgroud)
然后我发现在settings.py中USE_TZ
已设置为False
USE_TZ = False
正如@MagicLAMP所指出的,它仅适用于单个时区站点,如果您的站点是国际站点,或者使用该站点时是否节省了夏令时,请检查时区。