代码之家  ›  专栏  ›  技术社区  ›  anonymous coward

从python日期/时间获取“2:35 pm”而不是“02:35 pm”?

  •  27
  • anonymous coward  · 技术社区  · 14 年前

    我对python的理解还是有点慢,所以我还没有弄清楚这个问题,除了在docs等文档中明显存在的问题。

    我曾与Django合作过一段时间,他们通过模板标记添加了一些日期时间格式选项,但是使用常规的python代码 我怎么能拿到12小时 小时 没有前导零?

    有没有一个简单的方法可以做到这一点?我正在查看“strftime()”的2.5和2.6文档,但似乎没有针对本例的格式化选项。

    我应该用别的吗?

    请随意添加文档中不明显的其他时间格式设置提示。=)

    8 回复  |  直到 9 年前
        1
  •  20
  •   Mike DeSimone    11 年前

    没有内置到 datetime 会做的。您需要使用以下内容:

    datetime.time(1).strftime('%I:%M%p').lstrip('0')
    

    补遗

    正如@naktinis指出的,这是为使用这个特定的 strftime 参数。不幸的是,如果 斯特夫时间 参数未知或未指定(例如外部参数),因为它变成了“做我想说的,而不是我说的”问题。

    因此,考虑到你必须知道你的 斯特夫时间 参数,在更复杂的情况下,您可以将其作为部分解决:

    tval = datetime.time(1)
    tval_str = (tval.strftime('%A, %B ') + tval.strftime('%d').lstrip('0') 
        + tval.strftime(' %Y, ') + tval.strftime('%I:%M').lstrip('0') 
        + tval.strftime('%p').lower())
    

    或与 re 模块:

    tval = datetime.time(1)
    tval_str = re.sub(r"^0|(?<=\s)0", "", 
        re.sub(r"(?<=[0-9])[AP]M", lambda m: m.group().lower(), 
        tval.strftime('%A, %B %d %Y, %I:%M%p')))
    

    那就是说,记住如果 "%p" 这个术语给你大写字母,可能是因为用户设置了他们的区域设置,以这种方式工作,并且通过改变大小写,你将覆盖用户首选项,这有时会导致错误报告。另外,用户可能需要一些 其他 “上午”或“下午”,如“上午”和“下午”。还请注意,对于不同的地区(例如 en_US 现场给出 AM PM 对于 %p 但是 de_DE 给予 am pm )您可能无法在假定的编码中获取字符。

    documentation on strftime behavior :

    因为格式取决于当前的区域设置,所以在对输出值进行假设时应该小心。字段顺序将有所不同(例如,__month/day/year__对__day/month/year__),并且输出可能包含使用区域设置__默认编码的Unicode字符(例如,如果当前区域设置为 js_JP ,默认编码可以是 eucJP , SJIS utf-8 使用 locale.getlocale() 确定当前区域设置的编码)。

    因此,简而言之,如果您认为需要覆盖区域设置,请确保您有一个很好的理由,这样您就不会只创建新的bug。

        2
  •  12
  •   Uyghur Lives Matter    12 年前

    这个问题已经得到了回答,但从技术上讲,您可以直接从python日期时间获取“2:35pm”,使用 .strftime("%-I:%M%P") 在使用glibc的Linux平台上,因为 Python's strftime() uses the c library's strftime() .

    >>> import datetime
    >>> now = datetime.datetime.now()
    datetime.datetime(2012, 9, 18, 15, 0, 30, 385186)
    >>> now.strftime("%-I:%M%P")
    '3:00pm'
    >>> datetime.time(14, 35).strftime("%-I:%M%P")
    '2:35pm'
    

    strftime glibc notes on "-" .

        3
  •  7
  •   Community CDub    7 年前

    当我偏爱 Mike DeSimone's answer 为了投票的目的,我认为这可能是一个值得的贡献…

    django项目包含一个“php兼容”的日期格式类 django/utils/dateformat.py (trunk) . 它的用法类似于so(shell示例):

    >>> import datetime
    >>> from django.utils.dateformat import DateFormat
    >>> d = datetime.datetime.now()
    >>> df =  DateFormat(d)
    >>> df.format('g:ia') # Format for Hour-no-leading-0, minutes, lowercase 'AM/PM'
    u'9:10a.m.'
    

    它满足了这里的要求,并且可能值得包括在您的项目中。有了这一点,我想说你应该核实许可证的使用……欢迎提出任何澄清意见。

        4
  •  4
  •   Community CDub    7 年前

    蟒蛇 strftime() 仅保证支持 C89 (见 list )

    有用的附加格式代码由其他标准定义(请参见 the Linux man page for strftime() )对于这个问题, 相关附加代码为:

    • %l 小时(12小时时钟)作为十进制数(范围1到12)。
    • %P 类的 %p 但是小写:“am”或“pm”或当前区域设置对应的字符串。

    我喜欢在周围使用包装函数 STF() 要执行其他代码:

    def extendedStrftime(dt, format):
    
        day  = dt.strftime('%d').lstrip('0')
        hour = dt.strftime('%I').lstrip('0')
        ampm = dt.strftime('%p').lower()
    
        format = format.replace('%e', day)
        format = format.replace('%l', hour)
        format = format.replace('%P', ampm)
    
        return dt.strftime(format)
    

    要获得“2:35pm”格式的输出:

    extendedStrftime(dt, '%l:%M%P')
    

    想要这样做也是很常见的 format the day without the leading zero , 这可以通过附加代码来完成 %e :

    extendedStrftime(dt, '%e %b %Y')  # "1 Jan 2015"
    
        5
  •  2
  •   badp    14 年前

    datetime.time 对象暴露 hour , minute second 领域。用这些设置自己的格式非常简单。像这样:

    return "%d:%02d %s" % (foo.hour % 12 + 0 if foo.hour % 12 else 12, #ugh
                           foo.minute,
                           "pm" if foo.hour >= 12 else "am")
    
        6
  •  2
  •   unutbu    14 年前

    使用 %l 要将小时作为介于1到12之间的数字:

    In [2]: datetime.time(hour=14,minute=35).strftime('%l:%M%p')
    Out[2]: ' 2:35PM'
    

    有关更多格式代码,请参阅 http://au2.php.net/strftime .

        7
  •  1
  •   genpfault    14 年前

    我知道很便宜,但是你 能够 如果第一个字符是零,则丢弃它:)

        8
  •  0
  •   niko.makela    13 年前

    我用过的一点小技巧:

    # a time object
    mytime = time(hour=time_hour, minute=time_minute)
    # return a time as a string without a leading zero in hours.
    return "%s:%s" % (mytime.hour, mytime.strftime("%M"))