在django获取当地时区

Dav*_*542 27 python django

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

  • 如果`last_updated`不在utc中,则将最后一行更改为:`last_updated_in_tz = tz.normalize(last_updated.astimezone(tz))`.如果`last_updated`是一个天真的日期时间对象,那么在调用`.astimezone()`之前让它知道:`aware_dt = naive_utc_dt.replace(tzinfo = pytz.utc)`(注意:`.replace()`仅适用于utc,使用`aware_dt = some_tz.localize(naive_dt,is_dst = None)`否则). (3认同)
  • @MrMartin 您需要按照 https://docs.djangoproject.com/en/1.8/topics/settings/#using-settings-in-python-code 导入 Django 设置模块 (2认同)

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)


Tor*_*cht 6

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

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


Ric*_*nes 5

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

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

只需安装它并按照说明完成即可!

  1. 安装django-easy-timezones

    pip install django-easy-timezones pytz pygeoip
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将"easy-timeZones"添加到您的INSTALLED_APPS设置中,如下所示:

    INSTALLED_APPS = (
    ...
    'easy-timezones',
    )
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将EasyTimezoneMiddleware添加到MIDDLEWARE_CLASSES

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

    GEOIP_DATABASE = '/path/to/your/geoip/database/GeoIP.dat'
    
    Run Code Online (Sandbox Code Playgroud)
  5. 在模板中启用localtime.

    {% load tz %}
        The UTC time is {{ object.date }}
    {% localtime on %}
        The local time is {{ object.date }}
    {% endlocaltime %}
    
    Run Code Online (Sandbox Code Playgroud)
  6. 田田!


her*_*hen 5

我遇到了同样的问题。在我的设置中,我设置了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所指出的,它仅适用于单个时区站点,如果您的站点是国际站点,或者使用该站点时是否节省了夏令,请检查时区


Але*_*лич 5

只需使用

timezone.localtime(arg)
Run Code Online (Sandbox Code Playgroud)