繁体   English   中英

在 django 中获取本地时区

[英]Get local timezone in django

我有一个 mysql DATETIME值,它存储在系统时间 UTC 中。 我需要将其转换为 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 值位于我的本地时区 =“美国/洛杉矶”?

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

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

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

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)

我已经创建了一个简单的中间件来为您处理所有这些内容:

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. 在模板中启用localtime。

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

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

# settings.py
TIME_ZONE = 'Asia/Shanghai'

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

USE_TZ = False

正如@MagicLAMP所指出的那样,它仅适用于单个时区网站,如果您的网站是国际网站,或者如果您的网站使用了夏令 ,请检查时区

我个人建议不要使用UTC以外的TIME_ZONE设置。 我记得过去有这个问题,不管数据库是在不同的时区运行(在不同的时区保存值),而不是Django后端使用的。 这意味着要比较时间会有很多麻烦,根据你正在做的事情来改变它们。

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

1:在视图中定义时区

from django.utils import timezone

variable = timezone.now()

2:然后在模板中使用它

{% load l10n %}

Teresina, {{variable |localize}}.

只是用

timezone.localtime(arg)

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

{% load tz %}
{% timezone "Europe/Paris" %}
    Paris time: {{ object.date }}
{% endtimezone %}

我找到了基于自定义模板过滤器的简单解决方案。

这是我的settings.py

TIME_ZONE = 'UTC'
USE_L10N = True
USE_TZ = True

在我名为 Marker 的 model 中,我将日期时间保存为2022-09-15 17:56:26.936210

class Marker(models.Model):
    ....
    created_at = models.DateTimeField(default=now, verbose_name="Date")

接下来,我使用路径project/app/templatetags/some_file_name.py使用自定义模板过滤器创建一个新的Python package

some_file_name.py我们确实注册了一个过滤器并写下它的行为:

from django import template
from django.utils.formats import date_format

register = template.Library()


@register.filter
def to_user_tz_short(dt):
    """Format UTC timestamp from DB to local user's short datetime format with appropriate timezone."""
    user_tz = date_format(
        dt.astimezone(), format="SHORT_DATETIME_FORMAT", use_l10n=True
    )
    return user_tz

接下来使用代码在模板中加载我们的过滤器:

{% load some_file_name %}

最后将过滤器应用于项目:

{{ marker.created_at|to_user_tz_short }}

因此,在我的情况下,日期时间保存在 DB 中,如我之前提到的2022-09-15 17:56:26.936210和过滤后,在模板中根据我的本地时区和日期格式显示为15.09.2022 20:56 .

过滤前: 2022-09-15 17:56:26.936210过滤后 -> 15.09.2022 15.09.2022 20:56

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM