如何在Django中将UTC转换为用户本地时区?

时间:2019-03-09 18:23:16

标签: python django datetime django-templates

这些答案没有帮助:

  1. Getting correct local time zone to display for end-users in Django web app

  2. Django different timezones in same application

所有日期时间数据都存储在我数据库中的UTC中。

我希望每个用户都可以在其本地时区而不是UTC中看到日期时间。我已经尝试过以下代码:

settings.py

TIME_ZONE = 'UTC'

USE_TZ = True

views.py

from django.shortcuts import render
from home_app import models
from django.utils import timezone
import pytz

def home_view(request):
    timezone.activate(pytz.timezone('Asia/Kolkata'))
    sample_queryset = models.TimeModel.objects.all()
    return render(request, 'home/home.html', {'sample_queryset': sample_queryset,})

home.html

{% for row in sample_queryset %}
    {% load tz %}
    {% localtime on %}
    {{ row.time }}
    {% endlocaltime %}
{% endfor %}

models.py

from django.db import models

class TimeModel(models.Model):
    sample_text = models.CharField(max_length=255)
    time = models.DateTimeField(auto_now=True)

    def __str__(self):
        return str(self.time) + ' ' + self.sample_text

但是,毕竟,数据库中的UTC时间是相同的。

其他详细信息:

Django 1.11

SQLite(目前;将在生产中使用Postgres)

Python 3.6.8

2 个答案:

答案 0 :(得分:2)

有效的timeZone值基于Linux和其他Unix系统使用的tz(时区)数据库。值为字符串(xsd:string),格式为“ 区域/位置”,其中:

区域是大陆或海洋的名称。当前区域包括:

  • 非洲
  • 美国(北美和南美)
  • 南极洲
  • 北极
  • 亚洲
  • 大西洋
  • 澳大利亚
  • 欧洲
  • Etc(行政区域。例如,“ Etc / UTC”代表 世界标准时间。)
  • 印度
  • 太平洋

位置是城市,岛屿或其他区域名称。

区域名称和输出缩写遵循POSIX(便携式操作系统接口)UNIX约定,该约定使用格林威治以西的正号(+)和格林威治以东的负号(-),这与通常预期的相反。例如,“ Etc / GMT + 4”表示比UTC(格林威治以西)晚4小时,而不是比UTC(格林尼治东部)协调世界时早4小时。

Here is a list all valid timezones

您可以按照以下步骤在settings.py中更改时区

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Kolkata'

USE_I18N = True

USE_L10N = True

USE_TZ = True

答案 1 :(得分:0)

我已从SQLite迁移到Postgres,并进行了以下更改:

models.py

之前:

从django.db导入模型

class TimeModel(models.Model):
    sample_text = models.CharField(max_length=255)
    time = models.DateTimeField(auto_now=True) # changed time to dt

    def __str__(self):
        return str(self.time) + ' ' + self.sample_text

之后:

from django.db import models

class TimeModel(models.Model):
    sample_text = models.CharField(max_length=255)
    dt = models.DateTimeField(auto_now=True) # changed time to dt

    def __str__(self):
        return str(self.dt) + ' ' + self.sample_text