【问题标题】:DJANGO datetime wrong on template even after timezone setup即使在时区设置之后,模板上的 DJANGO 日期时间错误
【发布时间】:2021-01-21 01:36:06
【问题描述】:

我有一个 DJANGO 应用程序,但我完全迷失了很多次。

我位于匈牙利布达佩斯,我目前的考试时间是:09:26

我在settings.py中正确设置了我的时区

...
TIME_ZONE = 'Europe/Budapest'

USE_I18N = True

USE_L10N = True

USE_TZ = True
...

假设我在我的 SQLite 数据库中存储了一个 datetime 对象,管理页面将显示正确的时间:

如果我在 view 中查询该数据,则日期突然错误。

2020-10-06 07:26:41.040463+00:00

我已阅读需要在我看来激活时区的解决方案,但它不起作用:

tzname = pytz.timezone("Europe/Budapest")
timezone.activate(tzname)
for i in MyObject.objects.all():
    print(i.date)

返回

2020-10-06 07:26:41.040463+00:00

我通常用 Ajax JS 调用填充我的模板,所以我无法尝试这样的模板过滤器:

{{ value|timezone:"Europe/Budapest" }}

如何更改时间,以便我的 JsonResponse 向我的模板发送正确的时间?

【问题讨论】:

    标签: django time timezone


    【解决方案1】:

    仔细考虑timezone documentation中的第一句话:

    启用时区支持后,Django 以 UTC 格式将日期时间信息存储在数据库中,在内部使用时区感知日期时间对象,并在模板和表单中将它们转换为最终用户的时区。

    请注意,到本地时区的转换只发生在模板和表单中,而不是数据库查询、视图或其他功能。有很多很好的理由,其中之一是转换到不同的时区可能会丢失信息。假设您从数据库返回的日期时间是布达佩斯时间 2019 年 10 月 25 日凌晨 2:30。这代表什么时间点?你不知道,因为由于夏令时,那个时间出现了两次。

    所以你看到的行为是完全正确的。如果您想在代码中将日期时间转换为本地时间,请使用 localtime():

    from django.utils.timezone import localtime
    
    local = localtime(myobject.timestamp)
    

    【讨论】:

      【解决方案2】:

      当您创建模型时,您可以将日期时间设置为您当地的时区。

      from django.utils import timezone
      
      date = models.DateTimeField(
          default=timezone.localtime(timezone.now()),
          blank=True
      )
      
      

      timezone.localtime(timezone.now()) 将根据设置中给出的TIME_ZONE 为您提供时间。

      时刻 JS: https://momentjs.com/timezone/docs/#/using-timezones/converting-to-zone/

      【讨论】:

      • 这只会为我的对象分配一个默认时间。如果对象时间发生变化,这将无济于事,并且还会导致错误的日期
      • 是的。也就是说,如果您想建立一个只使用本地时区的新模型。如果您只想在 django 模板中转换时区,可以使用我附加的链接。
      • 这只是给出一个默认值。如果对象的值发生变化,默认值什么也不做。并且(在大多数情况下)值会改变
      • 另外,您提供的链接指向的是旧版本的 DJANGO,正如我在帖子中提到的,我正在使用 AJAX 填充模板,因此模板转换没有帮助。
      • 没错。我的印象是您的日期时间字段是基于对象创建的日期时间等。如果它是一个可变字段,设置默认值将无济于事。
      猜你喜欢
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多