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) を使用しているためです。JSON に Python オブジェクトを格納できないため、文字列を返さなけれdatetimeばなりません (できたとしても、JavaScript はその方法を知りません)。解釈する)。

datetimeDjangoのテンプレートが使用するのと同じ文字列に変換できるDjango関数のようなものはありますか?

4

2 に答える 2

8

django.utils.dateformatスティーブンがリンクしたものを使用:

>>> 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 時間制の時、分、および「am」/「pm」で表示され、分は省略されます
それらがゼロの場合、文字列 'midnight' と 'noon' が適切な場合。
例: 「午前 1 時」、「午後 1:30」、「真夜中」、「正午」、「午後 12:30」
独自の拡張子。
于 2012-04-14T17:34:33.883 に答える
1

これを行うための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 に答える