关于django:用python把日期转换成自然语言?

Convert date to natural language in python?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How to print date in a regular format in Python?

我想知道如何将以下日期转换为自然语言,包括Python中的时区?

输入:

1
"'2012-09-27T02:00:00Z'"

预期输出:

1
Wednesday, September 26 of 2012 Mountain Time

事先谢谢!

注释编辑:到目前为止,我试着将django人性化,尽管它不能很好地处理复杂的日期时间字符串。

解决方案:

感谢您提供所有信息。我最终解析了原始字符串,并使用了pitz和strftime,如下所示:

1
2
3
4
    my_date = '2012-09-27T02:00:00Z'
    utc_date_object = datetime(int(my_date[0:4]), int(my_date[5:7]), int(my_date[8:10]),int(my_date[11:13]),int(my_date[14:16]),int(my_date[17:19]),0,pytz.utc)
    mt_date_object = utc_date_object.replace(tzinfo=pytz.utc).astimezone(pytz.timezone('US/Mountain'))
    natural_date = mt_date_object.strftime("%A, %B %d of %Y")

输出:

1
'Wednesday, September 26 of 2012'


Babel项目提供了一个功能齐全的日期和时间本地化库。

您还需要iso8601模块来正确分析带有时区的日期时间字符串。

它可以根据区域设置设置日期和时间格式:

1
2
3
4
5
6
7
>>> from datetime import date, datetime, time
>>> from babel.dates import format_date, format_datetime, format_time
>>> d = date(2007, 4, 1)
>>> format_date(d, locale='en')
u'Apr 1, 2007'
>>> format_date(d, locale='de_DE')
u'01.04.2007'

或者让您详细指定格式。这包括格式化时区。

将分析器和格式化程序放在一起:

1
2
3
>>> dt = iso8601.parse_date("2012-08-25T02:00:00Z")
>>> format_date(dt,"MMMM dd, yyyy", locale='en') + ' at ' + format_time(dt,"HH:mm V")
u'August 25, 2012 at 02:00 World (GMT) Time'

在国际上,序数("1st"、"2nd"等)比较难,babel使用的ldml格式不包括这些的模式。

如果日期格式中必须有一个序号(可能是因为您只希望以英语输出),则必须自己创建这些序号:

1
2
3
4
5
6
7
8
9
>>> suffix = ('st' if dt.day in [1,21,31]
...                else 'nd' if dt.day in [2, 22]
...                else 'rd' if dt.day in [3, 23]
...                else 'th')
>>> u'{date}{suffix}, {year} at {time}'.format(
...     date=format_date(dt,"MMMM dd", locale='en'),
...     suffix=suffix, year=dt.year,
...     time=format_time(dt,"HH:mm V"))
u'August 25th, 2012 at 02:00 World (GMT) Time'

您可以使用strftime()方法获得日期的自定义字符串表示形式。strftime接受一个字符串模式,解释如何设置日期格式。

例如:

1
2
print today.strftime('We are the %d, %h %Y')
'We are the 22, Nov 2008'

"%"后面的所有字母表示某种格式:

  • %D是日数
  • %M是月份号
  • %Y是最后两位数的年份
  • %Y是全年

https://stackoverflow.com/a/311655


1
2
3
4
5
6
7
def myFormat(dtime):
    if dtime.day in [1,21,31] : ending ="st"
    elif dtime.day in [2,22] : ending ="nd"
    elif dtime.day in [3,23] : ending ="rd"
    else : ending ="th"

    return dtime.strftime("%B %d"+ ending +" of %Y")


不是100%回答您的问题,但此代码可能有助于您开始格式化时间和日期:

1
2
import datetime
print datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S')