在 django datetime 上使用 strftime 会在字符串中生成 UTC 时间

Posted

技术标签:

【中文标题】在 django datetime 上使用 strftime 会在字符串中生成 UTC 时间【英文标题】:Using strftime on a django datetime produces a UTC time in the string 【发布时间】:2012-08-08 04:37:50 【问题描述】:

我的一个模型中有以下代码:

def shortDescription(self):
    return self.name + ' ' + self.class_date.strftime("%I:%M")

self.class_date 是时区感知 DateTimeFieldself.class_date.is_aware()TrueUSE_TZTrue

shortDescription 返回一个以 UTC 而非默认时区提供时间的字符串,将 aclass.class_date 放入模板中会显示正确时区的时间。

strftime 是否总是在本地时间的基础上工作?还是这里发生了什么?

【问题讨论】:

“时区感知日期”是什么意思?这是什么课? 【参考方案1】:

当您直接引用 %I%M 之类的日期时间片段时,它会直接使用它,因为它没有进行语言环境转换。如果您包含%Z,您会看到时间在UTC。如果您想要了解区域设置的结果,则需要使用更有限的%X,它只会显示为区域设置转换的全部时间。

如果你需要更多,你必须转换它:

from django.utils import timezone

def shortDescription(self):
    class_date = timezone.localtime(self.class_date)
    return self.name + ' ' + class_date.strftime("%I:%M")

或者,您可以依赖 date 过滤器,它会自动为您执行此操作:

from django.template import defaultfilters

def shortDescription(self):
    return self.name + ' ' + defaultfilters.date(self.class_date, 'g:i')

【讨论】:

优秀。而且我根本不知道 defaultfilters 技巧。 是的,我一直在使用它。 Django 模板过滤器只是常规方法,因此您可以在代码中的任何位置使用它们中的任何一个。 defaultfilters.slugify 也经常派上用场。 对我不起作用,same Problem here 第一种方法效果更好。谢谢你的解决方案。 :) class_date 在第二种方法中也需要转换为当地时间。

以上是关于在 django datetime 上使用 strftime 会在字符串中生成 UTC 时间的主要内容,如果未能解决你的问题,请参考以下文章

django之Template(模板)

Python:AttributeError:'str'对象没有属性'datetime'

使用具有正确语法的 pandas to_datetime() 方法,无法识别的值类型:str?

String str=“2011-11-11 22:22:22” 如何把str转换成datetime类型存入mysql中

使用“datetime”获取实时偏移时出错

Django:如何让 datetime 对象知道创建它的时区?