我正在使用PostgreSQL存储一个DateTimeField
的对象
DateTimeField
正在使用auto_now_add
个选项
它是由Django Rest Framework
中的序列化程序自动创建的。
如Django docs所述,我试图获取当地时区并将其激活。
from django.utils.timezone import localtime, get_current_timezone
tz = get_current_timezone()
timezone.activate(tz)
session.started_at = localtime(session.started_at)
在模板index.html
中,我还尝试加载时区。
{% localtime on %}
Session: start time {{ item.session.started_at }}
{% endlocaltime %}
在settings.py
USE_TZ = True
TIME_ZONE = 'UTC'
我正在使用GMT + 7时区,但它仍然在模板上显示UTC时间。
我正在使用Django开发服务器进行测试。
我错过了什么吗?
答案 0 :(得分:2)
如果我没弄错,TIME_ZONE
设置会设置“本地”时区,请将其从UTC
更改为您当地的时区。
没有HTTP-Header将服务器显示为客户端的时区。大多数使用本地化时间的网站会询问用户他们所在的时区,并将其保存在用户个人资料中。请参阅Django文档 https://docs.djangoproject.com/en/2.0/topics/i18n/timezones/#selecting-the-current-time-zone
Javascript有一种访问UTC偏移的方法,也许您可以使用它来将信息与请求一起发送到您的服务器。
答案 1 :(得分:1)
找到用户的时区后,请在Django 2及更高版本中执行此操作:
{% load tz %}
{% timezone "Europe/Paris" %}
Paris time: {{ object.date }}
{% endtimezone %}
答案 2 :(得分:0)
假设您的所有日期时间都以UTC格式存储在数据库中,您可以在模板中使用tz
django实用程序将日期投射到当地时间
IE如果日期时间存储为2017年10月12日18:00:00,我想将其转换为America/La_Paz
当地时间(GMT -4)我可以使用
Session: start time {{ item.session.started_at|timezone:"America/La_Paz" }}
在模板中将显示到America / La_Paz的当地时间(本例中为2017年10月12日14:00:00)
模板/ my_template.html
{% load tz %}
<!-- some html code here -->
Session: start time {{ item.session.started_at|timezone:"America/La_Paz" }}
你可以在你的视图中创建一个cotext var或var来设置你用来在tmeplate中投射日期的时区,并使用它来进行投射
在您的观点中:my_timezone = 'A VALID TIMEZONE NAME'
再次在你的模板中
模板/ my_template.html
{% load tz %}
<!-- some html code here -->
Session: start time {{ item.session.started_at|timezone:my_timezone}}
答案 3 :(得分:0)
您的Web应用程序的用户可能处于不同的时区,因此有必要转换为适当的时区。您可以创建中间件并使用activate函数设置当前时区。要获取适当的时区,您可以在登录页面中对 Free IP Geolocation API 进行ajax api调用,时区值可以保存在cookie变量中,以后可以在中间件中进行访问
landingpage.html
<script>
$.ajax({
url: 'https://freegeoip.app/json/',
dataType: 'json',
success: function (data) {
document.cookie = 'timezone=' + data['time_zone'] + '; path=/';
}
});
</script>
middleware.py
import pytz
import requests
from django.utils import timezone
class TimezoneMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
tzname = request.COOKIES.get('timezone')
if tzname:
timezone.activate(pytz.timezone(tzname))
else:
timezone.deactivate()
return self.get_response(request)
settings.py
MIDDLEWARE = [ ........
'projectname.middleware.TimezoneMiddleware',
]