Django datetime字段 - 在视图中转换为时区

时间:2016-01-28 21:46:51

标签: python mysql django datetime

我有一个带有日期时间字段的Django模型。保存后,存储在 DB 中的日期时间字段会丢失时区信息,因此会将其保存为天真日期时间。一般来说,这不是问题,因为当在模板中渲染日期时间字段时,Django会自动将其转换回来。

但是这个观点呢?假设我需要日期时间服务器端的字符串表示。根据夏季/冬季时间,我的时区可能是GTM + 1或GMT + 2,这使事情变得更加困难。

那么如何在视图中应用本地tz转换?我用pytz尝试了几种方法。没有成功,ome条目转换为GMT + 1,其他条目转换为GMT + 2 :(

例如

system_tz = pytz.timezone('Europe/Berlin')
local_dt = item.created_at.astimezone(system_tz)
local_dt = system_tz.normalize(local_dt)

其他信息:

  • Django 1.8.7。
  • settings.USE_TZ = True
  • MySQL的
  • 我为什么要这样做?因为我有一个表,可以通过AJAX按需加载所有行。我需要先使用strftime()准备日期时间值,然后再将它们发送给客户端。

3 个答案:

答案 0 :(得分:7)

from django.utils import timezone

local_dt = timezone.localtime(item.created_at, pytz.timezone('Europe/Berlin'))

要转换为UTC + 1:

from django.utils import timezone

local_dt = timezone.localtime(item.created_at, timezone.get_fixed_timezone(60)

答案 1 :(得分:1)

无需使用django.utils在时区之间进行转换:

berlin = pytz.timezone('Europe/Berlin')
local_dt = item.created_at.astimezone(berlin)

然而,如果您通常仅使用一个时区,则可以将其存储在settings.TIME_ZONE = 'Europe/Berlin'然后

local_dt = timezone.localtime(item.created_at)

会将其转换为您当地时间。

答案 2 :(得分:0)

django 在 django.utils.timesince 模块中提供了 timesince 函数

我用这个

from django.utils.timesince import timesince
since = a_datetime_object
return timesince(since)

你也可以传递第二个参数作为引用而不是 datetime.now()

可能的输出是 “2周3天”和“1年3个月”等