在我的settings.py文件中,我设置了:
TIME_ZONE = 'UTC'
在我的
views.py
中,我在代码的顶部设置了:activate(settings.TIME_ZONE)
但这个不起作用,在创建帖子的时候,它获取了我上次使用的时区是“马德里”,而不是我的当前时区。
有没有办法让这个工作起来?
谢谢!
TIME_ZONE = 'UTC'
views.py
中,我在代码的顶部设置了:activate(settings.TIME_ZONE)
但这个不起作用,在创建帖子的时候,它获取了我上次使用的时区是“马德里”,而不是我的当前时区。
有没有办法让这个工作起来?
谢谢!
<script>
// Timezone settings
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; // e.g. "America/New_York"
document.cookie = "django_timezone=" + timezone;
</script>
import zoneinfo
from django.utils import timezone
class TimezoneMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
try:
# get django_timezone from cookie
tzname = request.COOKIES.get("django_timezone")
if tzname:
timezone.activate(zoneinfo.ZoneInfo(tzname))
else:
timezone.deactivate()
except Exception as e:
timezone.deactivate()
return self.get_response(request)
这里是这个Django时区的来源。
将以下中间件添加到MIDDLEWARE中:
import pytz
from django.utils import timezone
class TimezoneMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
tzname = request.session.get('django_timezone')
if tzname:
timezone.activate(pytz.timezone(tzname))
else:
timezone.deactivate()
return self.get_response(request)
from django.shortcuts import redirect, render
def set_timezone(request):
if request.method == 'POST':
request.session['django_timezone'] = request.POST['timezone']
return redirect('/')
else:
return render(request, 'template.html', {'timezones': pytz.common_timezones})
{% load tz %}
{% get_current_timezone as TIME_ZONE %}
<form action="{% url 'set_timezone' %}" method="POST">
{% csrf_token %}
<label for="timezone">Time zone:</label>
<select name="timezone">
{% for tz in timezones %}
<option value="{{ tz }}"{% if tz == TIME_ZONE %} selected{% endif %}>{{ tz }}</option>
{% endfor %}
</select>
<input type="submit" value="Set">
</form>
在表单中启用时区支持后,Django会将表单中输入的日期时间解释为当前时区,并在cleaned_data中返回带有时区信息的datetime对象。
如果当前时区对于不存在或因夏令时转换(由pytz提供的时区会执行此操作)而存在歧义的日期时间引发异常,则这些日期时间将报告为无效值。
在模板中启用时区支持后,Django会将带有时区信息的datetime对象,在其呈现到模板上时转换为当前时区。这与格式本地化非常相似。
警告
Django不会转换天真的datetime对象,因为它们可能存在歧义,并且当启用时区支持时,您的代码不应该生成天真的datetime对象。但是,您可以使用下面描述的模板过滤器强制进行转换。
转换为本地时间并不总是合适的 - 您可能正在为计算机而不是人类生成输出。tz模板标签库提供的以下过滤器和标签允许您控制时区转换。
模板标签:
localtime¶
启用或禁用包含块中带有时区信息的datetime对象转换为当前时区。
就模板引擎而言,此标记与USE_TZ设置具有完全相同的效果。它允许更精细的控制转换。
要激活或停用模板块的转换,请使用:
{% load tz %}
{% localtime on %}
{{ value }}
{% endlocaltime %}
{% localtime off %}
{{ value }}
{% endlocaltime %}
注意
在 {% localtime %} 块内,USE_TZ 的值不被尊重。
timezone 设置或取消包含块内的当前时区。当未设置当前时区时,将应用默认时区。
{% load tz %}
{% timezone "Europe/Paris" %}
Paris time: {{ value }}
{% endtimezone %}
{% timezone None %}
Server time: {{ value }}
{% endtimezone %}
get_current_timezone¶ 使用get_current_timezone标记可以获取当前时区的名称:
{% get_current_timezone as TIME_ZONE %}
另外,您可以激活tz()上下文处理器并使用TIME_ZONE上下文变量。
settings.py
中。来自https://docs.djangoproject.com/zh-hans/3.1/topics/i18n/timezones/
from django.utils import timezone
now = timezone.now()
from django.utils import timezone
和timezone.now()
还是像models.DateTimeField(auto_now_add=True)
这样的方式? - Henri