34

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

我如何才能让 last_updated 值在我的本地时区 = "America/Los Angeles" 中?

4

9 回答 9

41

时区的Django 文档datetime记录了将对象转换为适当的时区以进行显示的所有必要细节。

您的数据以 UTC 存储,这很好。当您DateTime从数据库中获取字段对象时,它将是一个幼稚的datetime.datetime对象。即没有附加时区的日期/时间。然后由您来完成转换。

您的 webapp 的用户可能在不同的时区,因此必须为每个请求转换到适当的时区。这就是为什么有一个激活功能来设置当前时区的原因。

如果您安装了pytz,您应该能够执行以下操作:

from django.utils.timezone import activate
activate(settings.TIME_ZONE)

然后,模板引擎中日期字段的所有输出将自动将您天真的日期时间对象转换为正确的时区以进行显示。

如果您只有一个datetime.datetime要设置时区的幼稚实例,则只需pytz直接使用该模块即可。但是,在您的视图中执行此操作是不正常的,因为仅在演示时转换时区是个好主意。

from pytz import timezone

settings_time_zone = timezone(settings.TIME_ZONE)
last_updated = last_updated.astimezone(settings_time_zone)
于 2013-02-02T11:21:24.807 回答
30

在哭了很多之后,我可以显示我的国家的正确日期,做这样的事情:

>>> 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>)

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>)
于 2015-04-13T23:39:30.330 回答
18

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)
于 2015-09-19T09:25:38.290 回答
7

我创建了一个简单的中间件来为你处理所有这些东西:

https://github.com/Miserlou/django-easy-timezones

只需安装它并按照说明操作即可!

  1. 安装 django-easy-timezones

    pip install django-easy-timezones pytz pygeoip
    
  2. 将“easy-timezones”添加到您的 INSTALLED_APPS 设置中,如下所示:

    INSTALLED_APPS = (
    ...
    'easy-timezones',
    )
    
  3. 将 EasyTimezoneMiddleware 添加到您的 MIDDLEWARE_CLASSES

    MIDDLEWARE_CLASSES = (
    ...
    'easy-timezones.middleware.EasyTimezoneMiddleware',
    )
    
  4. 在设置文件中添加MaxMind GeoIP 数据库的路径:

    GEOIP_DATABASE = '/path/to/your/geoip/database/GeoIP.dat'
    
  5. 在模板中启用本地时间。

    {% load tz %}
        The UTC time is {{ object.date }}
    {% localtime on %}
        The local time is {{ object.date }}
    {% endlocaltime %}
    
  6. 多田!

于 2013-07-17T06:29:47.860 回答
6

我个人建议不要使用TIME_ZONEUTC 以外的设置。我记得过去遇到过这个问题,无论是数据库在与 Django 后端使用的不同时区(将值保存在不同时区)中运行。这意味着比较时间很麻烦,根据你在做什么来回改变它们。

一个好的做法通常是在后端使用一个时区(比如说 UTC),并将前端的时间转换为您正在服务的用户时区。

于 2013-02-02T09:08:05.177 回答
5

我遇到了同样的问题。在我的设置中,我设置了TIME_ZONE,但 MySql 中的时间仍然是 UTC 时间。

# settings.py
TIME_ZONE = 'Asia/Shanghai'

然后我发现,在settings.py中,USE_TZ已经设置为False

USE_TZ = False

正如@MagicLAMP 所指出的,它仅适用于单时区站点,如果您的站点是国际站点或者使用您的站点的地方发生夏令时,请检查时区。

于 2016-09-23T06:41:58.860 回答
3

我花了一段时间才找到这个,但这就是我解决它的方法。我从 IP 地址猜测用户的时区,然后在 Django 2 及更高版本中执行此操作:

{% load tz %}
{% timezone "Europe/Paris" %}
    Paris time: {{ object.date }}
{% endtimezone %}
于 2018-05-26T19:37:42.293 回答
2

只需使用

timezone.localtime(arg)
于 2017-05-13T21:25:16.010 回答
1

1:在视图中定义时区

from django.utils import timezone

variable = timezone.now()

2:然后在你的模板中使用它

{% load l10n %}

Teresina, {{variable |localize}}.
于 2019-03-07T19:17:35.590 回答