这里有一个轻微的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后缀。
答案 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()
最后请注意,为什么不直接在模型中使用人性化?
答案 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.