3

我注意到默认 Django 的日期时间作为字符串看起来像这样(来自模板):

April 4, 2012, 6 a.m.
April 14, 2012, 12:06 p.m.
April 14, 2012, midnight
April 14, 2012, noon
April 14, 2012, 6:02 a.m.

请注意日期或时间中没有尾随零。此外,Django 消除了 :00 分钟,并且还使用字符串“noon”和“midnight”而不是等效的数字时间。

如果不编写一堆if-elif语句,我能得到的最接近的是这个

# I'm using Django 1.4 with timezone support.
# timezone.now() is the same as `datetime.now()` but it's timezone "aware".
timezone.now().strftime('%B %d, %Y, %I:%M %p').replace( 'AM', 'a.m.' ).replace( 'PM', 'p.m.' )

但这会产生以下结果(使用上面的相同示例)

April 04, 2012, 06:00 a.m.
April 14, 2012, 12:06 p.m.
April 14, 2012, 12:00 a.m.
April 14, 2012, 12:00 p.m.
April 14, 2012, 06:02 a.m.

我需要获取字符串的原因是因为我使用的是 ajax(特别是 Dajax),所以我必须返回一个字符串,datetime因为我无法在 JSON 中存储 Python 对象(即使我可以,JavaScript 也不知道如何来解释它)。

那么是否有某种 Django 函数可以转换datetime为 Django 模板使用的相同字符串?

4

2 回答 2

8

使用django.utils.dateformatwhich Steven 链接到:

>>> import datetime
>>> from django.utils import dateformat
>>> dateformat.format(datetime.datetime.now(), 'F j, Y, P')
u'April 14, 2012, 1:31 p.m.'

P是第93 行的有趣扩展strftime

时间,以 12 小时制的小时、分钟和“上午”/“下午”为单位,保留分钟
如果它们为零,并且字符串 'midnight' 和 'noon' 合适的话。
示例:“上午 1 点”、“下午 1:30”、“午夜”、“中午”、“下午 12:30”
专有扩展。
于 2012-04-14T17:34:33.883 回答
1

这是一种懒惰的方法:

def f(dt):
    s = dt.strftime('%B %d, %Y, %I:%M %p')
    for unwanted, wanted in [
        ('12:00 AM', 'midnight'),
        ('12:00 PM', 'noon'),
        ('AM','a.m.'),
        ('PM', 'p.m.'),
        (':00', ''),
        (' 0', ' ')]:
        s = s.replace(unwanted, wanted)
    return s

print f(datetime(2012, 4, 4, 6))
print f(datetime(2012, 4, 14, 12, 6))
print f(datetime(2012, 4, 14, 12))
print f(datetime(2012, 4, 14, 0))
print f(datetime(2012, 4, 14, 6, 2))

April 4, 2012, 6 a.m.
April 14, 2012, 12:06 p.m.
April 14, 2012, noon
April 14, 2012, midnight
April 14, 2012, 6:02 a.m.
于 2012-04-14T17:29:31.220 回答