Python 显示日期,如“日期”;五月五日;,使用蟒蛇strftime?

Python 显示日期,如“日期”;五月五日;,使用蟒蛇strftime?,python,strftime,Python,Strftime,可能重复: 在Python time.strftime中,可以很容易地生成像“5月5日星期四”这样的输出,但是我想生成一个像“5月5日星期四”这样的字符串(注意日期上额外的“th”)。最好的方法是什么?你不能。time.strftime函数和datetime.datetime.strftime方法都(通常)使用平台C库的strftime函数,并且(通常)不提供该格式。您需要使用第三方库,如。 编辑: 在看到大师的答案后纠正: from time import strftime def sp

可能重复:


在Python time.strftime中,可以很容易地生成像“5月5日星期四”这样的输出,但是我想生成一个像“5月5日星期四”这样的字符串(注意日期上额外的“th”)。最好的方法是什么?

你不能。
time.strftime
函数和
datetime.datetime.strftime
方法都(通常)使用平台C库的
strftime
函数,并且(通常)不提供该格式。您需要使用第三方库,如。

编辑: 在看到大师的答案后纠正:

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 此外:

编辑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()

strftime
不允许使用后缀设置日期格式

以下是获得正确后缀的方法:

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

如果4这似乎添加了适当的后缀,并删除了天数中难看的前导零:

#!/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())


但是说真的,这是特定于地区的,所以你应该在国际化过程中这样做

为什么不告诉我们你这样做的方式,这样我们就可以给你一个具体的解决方案。他的问题非常具体。@Noufal Ibrahim:没有代码,它仍然不够具体。没有代码就是“为我做作业”。但是,通过代码,我们可以讨论错误。洛特:我想是的。它非常简单,无需代码示例即可回答。这是一个关于单个函数的直接问题(他的名字)。5月1日,5月2日,5月3日,嗯,我想你的口齿不清。@Thomas Wouters比lisp@eyquem:编辑后,答案不需要投反对票,这不是惩罚,这是为了表明答案是错误的,现在已经不是了,没有反对票:)+1赞成放弃利西的繁荣解决方案:)@Acom我想你的意思是“子孙后代”。因此,我们为子孙后代而工作,而不是为了繁荣!!
dateutil
是否允许设置日期格式?我在文档中看不到任何提及它的内容。
suffix={1:“st”,2:“nd”,3:“rd”}.get(day%10,“th”)
@Jochen Ritzel-这看起来更聪明,但5月11日(May Elevenst)会发生什么呢?@Jochen Ritzel你的表达式会产生“st”表示“11”,“nd”表示“12”,“rd”表示“13”。否?上面的
后缀
实现为11、12和13生成了错误的值。@Buttons840:我使用的是
日期时间
,而不是
时间
0xc0006c000000006c>>2*天和3
部分从一个位字段中查找对应日期的2位(提示:try
bin(0xc0006c000000006c)
,最后2位表示第0天,超过10天都是0)。然后它将数字0-3作为第一个字符的索引,并跳过4个字符以获得第二个字符。关于从何处开始学习语言环境和国际化有何评论?我的应用程序确实需要说西班牙语,所以我可能需要一个更全面的解决方案,就像你说的那样。@Buttons840,从这里开始,当你需要解决具体的国际化问题时,在SOSorry上打开更多的问题,第二眼看,“10天以上都是0”应该是“31天以上都是0”。@Roy,你错过最后一句了吗?这里所有硬编码的答案都是“错的”。做这些事情的正确位置是i18n库
if 4 <= day <= 20 or 24 <= day <= 30:
    suffix = "th"
else:
    suffix = ["st", "nd", "rd"][day % 10 - 1]
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())
#!/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())
"%s%s"%(day, 'trnshddt'[0xc0006c000000006c>>2*day&3::4])