关于Python日期时间的格式

时间:2017-06-21 08:58:28

标签: python django datetime

这里有一个轻微的OCD问题 - 我在Django中使用{%humanize%}标签,它给出了以下列格式返回的日期时间:

2017年6月17日下午07:24

现在,在我的Django帖子模型中,我将返回以下内容:

def published_date(self):
    """Returns a humanized date format for Algolia indexing."""
    humanized_published_date = str(self.publish.strftime("%B %d, %Y %I:%M%p"))
    return humanized_published_date

一切运作良好。但是,上述方法返回的格式为:

2017年6月17日下午07:24

我之前已经阅读过日期时间文档(https://docs.python.org/2/library/datetime.html),特别是#34; 8.1.7部分。 strftime()strptime()行为"。我可以看到我可能需要的是de_DE格式 - 它显示12小时时钟后缀为pm而不是PM。

所以,我的问题是这个。如何重新格式化日期时间以提供以下格式:June 17, 2017 07:24 pm。*(如上面的代码中所述 - 我目前正在使用%B %d, %Y %I:%M%p)。

* N.B。我的OCD到了我不想要2017年6月17日07:24 PM或者甚至是2017年6月17日07:24 pm!也就是说,我需要在十二小时的时钟和前面的meridiem之间留出空间,然后发布meridiem后缀。

2 个答案:

答案 0 :(得分:0)

添加空格并将meridiem指令更改为大写:

...strftime("%B %d, %Y %I:%M %P")

然而,上%P取决于机器;可能无处不在。

OTOH,您可以使用以下hack来更改最后两个字符的大小写。 endswith检查确保您不会破坏日期时间字符串中的内容并替换正确的字符,否则不会进行替换;可能不满足你的强迫症:

d = datetime.now().strftime("%B %d, %Y %I:%M %p")
if d.endswith(('AM', 'PM')):
    d = d[:-2] + d[-2:].lower()

最后请注意,为什么不直接在模型中使用人性化?

请参阅Django humanize outside of template?

答案 1 :(得分:0)

解决方案是手动小写值:

dt = self.publish.strftime("%B %d, %Y %I:%M %p")
humanized_published_date = datetime.now().strftime(dt[:-2] + dt[-2:].lower())

这里有issue的完整解释。 这取决于C-lib实现和您正在使用的语言环境,这就是为什么没有标准的方法。

但Django DateFormat库在这方面似乎有更多选择:https://github.com/django/django/blob/master/django/utils/dateformat.py

此实现应该按预期工作:

from django.utils import dateformat

df = dateformat.DateFormat(self.publish) 
humanized_published_date = df.format("F j, Y H:i a")

print(humanized_published_date)
>>> June 21, 2017 09:19 a.m.