【问题标题】:Convert date to natural language in python? [duplicate]在python中将日期转换为自然语言? [复制]
【发布时间】:2012-09-17 07:29:21
【问题描述】:

可能重复:
How to print date in a regular format in Python?

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

输入:

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

预期输出:

Wednesday, September 26 of 2012 Mountain Time

提前致谢!

注意编辑: 到目前为止,我尝试了django humanize,尽管它不能很好地处理复杂的日期时间字符串。

解决方案:

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

    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")

输出:

'Wednesday, September 26 of 2012'

【问题讨论】:

  • 已经有一个很棒的question
  • @KeithSmiley:那篇文章有什么相关性?
  • @Martijn Pieters 理想情况下它应该显示时区。 EST 或 PST 等...
  • @ipegasus:我不是这个意思。我的意思是不同的语言和不同的文化对人类可读的内容有不同的定义。

标签: python django


【解决方案1】:

Babel project 提供了一个功能齐全的date and time localization library

您还需要iso8601 module 才能正确解析带有时区的日期时间字符串。

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

>>> 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'

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

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

>>> 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 format 不包含这些的模式。

如果你必须在你的日期格式中有一个序数(也许是因为你只希望输出英文),你必须自己创建这些:

>>> 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'

【讨论】:

    【解决方案2】:

    您可以使用strftime() 方法获得日期的自定义字符串表示。 strftime 接受一个字符串模式,说明您希望如何格式化您的日期。

    例如:

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

    “%”后面的所有字母都代表某种格式:

    • %d 是天数
    • %m 是月份数
    • %y 是年份的最后两位数
    • %Y 是全年

    https://stackoverflow.com/a/311655

    【讨论】:

    • 我不知道你为什么问我发布的问题是如何相关的,然后链接到同一个问题。你是说我应该解释一下吗?
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:
      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")   
      

      【讨论】:

      • “1st”、“2nd”和“3rd”呢?
      • 已编辑以包含这些案例
      • 比那个复杂一点..
      • 是的,好点,忘记了 21、23 等
      • 您可能想解释一下您如何处理您的代码。仅仅一小段代码并不是真正的答案。
      猜你喜欢
      • 2016-04-29
      • 1970-01-01
      • 2011-08-18
      • 2010-12-20
      • 2017-11-30
      • 2020-11-20
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多