37

重複の可能性:
Python: Date Ordinal Output?

Python time.strftime では、「Thursday May 05」のような出力を簡単に生成できますが、「Thursday May 5th」のような文字列を生成したいと思います (日付に「th」が追加されていることに注意してください)。これを行う最善の方法は何ですか?

4

5 に答える 5

92

strftime接尾辞を付けて日付をフォーマットすることはできません。

正しいサフィックスを取得する方法は次のとおりです。

if 4 <= day <= 20 or 24 <= day <= 30:
    suffix = "th"
else:
    suffix = ["st", "nd", "rd"][day % 10 - 1]

ここで見つかりました

アップデート:

Jochenのコメントに基づくよりコンパクトなソリューションとgsteffの回答を組み合わせる:

from datetime import datetime as dt

def suffix(d):
    return 'th' if 11<=d<=13 else {1:'st',2:'nd',3:'rd'}.get(d%10, 'th')

def custom_strftime(format, t):
    return t.strftime(format).replace('{S}', str(t.day) + suffix(t.day))

print custom_strftime('%B {S}, %Y', dt.now())

与える:

May 5th, 2011

于 2011-05-05T01:07:00.570 に答える
18

これは適切な接尾辞を追加し、日番号の醜い先行ゼロを削除するようです:

#!/usr/bin/python

import time

day_endings = {
    1: 'st',
    2: 'nd',
    3: 'rd',
    21: 'st',
    22: 'nd',
    23: 'rd',
    31: 'st'
}

def custom_strftime(format, t):
    return time.strftime(format, t).replace('{TH}', str(t[2]) + day_endings.get(t[2], 'th'))

print custom_strftime('%B {TH}, %Y', time.localtime())
于 2011-05-05T01:19:15.337 に答える
12
"%s%s"%(day, 'trnshddt'[0xc0006c000000006c>>2*day&3::4])

しかし、真剣に、これはロケール固有であるため、国際化中に行う必要があります

于 2011-05-05T02:00:43.383 に答える
3

from time import strftime

print strftime('%A %B %dth')

編集:

教祖の答えを見た後の修正:

from time import strftime

def special_strftime(dic = {'01':'st','21':'st','31':'st',
                            '02':'nd','22':'nd',
                            '03':'rd','23':'rd'}):
    x = strftime('%A %B %d')
    return x + dic.get(x[-2:],'th')


print special_strftime()

編集2

また:

from time import strftime


def special_strftime(dic = {'1':'st','2':'nd','3':'rd'}):

    x = strftime('%A %B %d')
    return x + ('th' if x[-2:] in ('11','12','13')
                else dic.get(x[-1],'th')

print special_strftime()

編集3

最後に、それは単純化することができます:

from time import strftime

def special_strftime(dic = {'1':'st','2':'nd','3':'rd'}):

    x = strftime('%A %B %d')
    return x + ('th' if x[-2]=='1' else dic.get(x[-1],'th')

print special_strftime()
于 2011-05-05T01:05:51.840 に答える
1

それはいけません。time.strftime関数とdatetime.datetime.strftimeメソッドは両方とも(通常)プラットフォームCライブラリの関数を使用し、(strftime通常)その形式を提供しません。dateutilなどのサードパーティライブラリを使用する必要があります。

于 2011-05-05T01:05:28.803 に答える