Skip to main content
 首页 » 编程设计

python之如何在 Django 中将 UTC 时间转换为用户本地时间

2024年09月03日33me-sa

这些答案没有帮助:

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

  2. Django different timezones in same application

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

我希望我的每个用户都能看到他们本地时区的日期时间,而不是 UTC。我试过下面的代码:

设置.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 %} 

模型.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

请您参考如下方法:

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

Area 是大陆或海洋名称。区域目前包括:

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

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

区域名称和输出缩写遵循 POSIX(可移植操作系统接口(interface))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