【问题标题】:Python strftime - date without leading 0?Python strftime - 没有前导0的日期?
【发布时间】:2010-10-28 15:25:41
【问题描述】:

当使用 Python strftime 时,如果日期的第一个 0 在 10 号之前,有没有办法删除它,即。所以011?找不到%thingy 吗?

谢谢!

【问题讨论】:

    标签: python padding strftime


    【解决方案1】:

    其实我也遇到了同样的问题,我意识到,如果你在%和字母之间添加一个连字符,你可以去掉前导零。

    例如%Y/%-m/%-d

    这仅适用于 Unix(Linux、OS X),不适用于 Windows(包括 Cygwin)。在 Windows 上,您将使用 #,例如%Y/%#m/%#d.

    【讨论】:

    • 对我不起作用,给出一个 ValueError (windows, python 2.6)
    • 它在 OS X 上对我有用,但我使用的是来自 python.org 的 Python 2.7.2。
    • @moose 我问了一个关于这个的问题 :-) 这里是答案 -> stackoverflow.com/questions/28894172/…
    • 我收到ValueError: '-' is a bad directive in format '%b %-d, %Y'。 OSX,Python 2.7。
    • %#d 在 Windows 上也会这样做
    【解决方案2】:

    随着 format 方法的出现,自 python2.6 以来,我们可以做这种事情:

    >>> import datetime
    >>> '{dt.year}/{dt.month}/{dt.day}'.format(dt = datetime.datetime.now())
    '2013/4/19'
    

    虽然可能超出了原始问题的范围,但对于更有趣的格式,您可以执行以下操作:

    >>> '{dt:%A} {dt:%B} {dt.day}, {dt.year}'.format(dt=datetime.datetime.now())
    'Wednesday December 3, 2014'
    

    从python3.6开始,这可以表示为inline formatted string

    Python 3.6.0a2 (v3.6.0a2:378893423552, Jun 13 2016, 14:44:21) 
    [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import datetime
    >>> dt = datetime.datetime.now()
    >>> f'{dt:%A} {dt:%B} {dt.day}, {dt.year}'
    'Monday August 29, 2016'
    

    【讨论】:

    • 非常好!不幸的是,如果你想使用像 time.strftime('%A %B %d, %Y') 这样的文本表示,它不能单独工作,它会产生(现在,在英语语言环境中)Tuesday October 07, 2014
    • @PekkaKlärck -- 直到现在我才注意到你的评论的某些原因。事实证明,datetime 指定了一个非常有趣的 __format__ 钩子,它允许您编写类似的东西。
    • 一个问题是 '{dt.hour}' 使用 24 小时制 :(。使用第二个选项仍然会让您回到在 Windows 上使用 '{%#I}' 和在 Unix 上使用 '{%-I}'
    • 好点。我从不在代码中使用 12 小时制表示,所以我没有想到这种情况。
    • 我建议查看有关格式功能的附加文档:pyformat.info
    【解决方案3】:

    根据http://docs.python.org/library/time.html,某些平台可能支持% 和字母之间的宽度和精度规范(例如'd' 表示月份)——但这绝对是一个非便携式解决方案(例如不支持在我的 Mac 上工作;-)。也许您可以在strftime 之后使用字符串替换(或RE,对于非常讨厌的格式)来解决这个问题?例如:

    >>> y
    (2009, 5, 7, 17, 17, 17, 3, 127, 1)
    >>> time.strftime('%Y %m %d', y)
    '2009 05 07'
    >>> time.strftime('%Y %m %d', y).replace(' 0', ' ')
    '2009 5 7'
    

    【讨论】:

    • @guneysus 你是什么意思?它应该导致“2000 年 1 月 1 日”
    • @User 上面的代码检查 0 之前的空格,如果“2000 年 1 月 1 日”不存在。
    【解决方案4】:

    Here 是 GNU C 库中strftime() 支持的修饰符的文档。 (就像人们之前所说的,它可能不便携。)您可能感兴趣的是:

    • %e 而不是 %d 将用空格替换月份中的前导零

    它适用于我的 Python(在 Linux 上)。我不知道它是否对你有用。

    【讨论】:

    • %e 在带有 Python 2.6 的 Windows 上对我来说失败了。我猜它是 *nix 特定的。太糟糕了:(
    • 这是最干净、最通用的解决方案——至少在 *nix 系统上是这样。这适用于 OS X。
    • %-d above 一样,这适用于带有 Python 2.7.2 的 OS X 10.8.5,但不适用于带有 Python 2.7.3 的 64 位 Windows 7 Pro。
    • 这适用于我在带有 Python 3.5.1 的 Windows 7 SP1 上。
    • 这引入了一个额外的空格而不是前导零,因此如果您正在寻找完全匹配,这可能不是它。 >>> one = datetime.datetime(2019, 5, 1, 23, 28, 48, 175214) >>> one.strftime('%b %e %H') 'May 1 23' >>> 十一 = datetime .datetime(2019, 5, 11, 23, 28, 48, 175214) >>>十一.strftime('%b %e %H') '5月11日23日'
    【解决方案5】:
    >>> import datetime
    >>> d = datetime.datetime.now()
    >>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
    '5/5/2011'
    

    【讨论】:

    • 这项工作 2000 年 1 月 1 日有效,Alexs 无效。
    • .replace('X0','X').replace('X','') 的意义何在?只需执行.replace('X0', '') 就可以了。
    • @MarcoBonelli:试试你对字符串“X12/X12/14”的建议,你会看到。
    • 这是hack,但它是pythonic hack。
    【解决方案6】:

    在 Windows 上,添加一个“#”,如 '%#m/%#d/%Y %#I:%M:%S %p'

    供参考:https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx

    【讨论】:

      【解决方案7】:

      聚会迟到了,但%-d 为我工作。

      datetime.now().strftime('%B %-d, %Y') 产生类似 "November 5, 2014"

      的内容

      干杯:)

      【讨论】:

      • 领先答案的重复? stackoverflow.com/a/2073189/389812
      • ValueError: Invalid format string 在我的 Windows 系统中。
      • leading answer 中所述,使用- "仅适用于 Unix(Linux、OS X),不适用于 Windows(包括 Cygwin)。在 Windows 上,您将使用 #"
      • 同意,在我的 Windows 上不起作用,但在 Linux 上可以。疯了!
      【解决方案8】:

      我发现 Django 模板日期格式化过滤器既快速又简单。它去除了前导零。如果您不介意导入 Django 模块,请查看。

      http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date

      from django.template.defaultfilters import date as django_date_filter
      print django_date_filter(mydate, 'P, D M j, Y')    
      

      【讨论】:

      • 请注意,如果你和我一样,并且你不是在 django 中构建你的应用程序,你需要告诉 django 你不需要配置它:import django.confdjango.conf.settings.configure()
      【解决方案9】:

      看看下面-

      >>> from datetime import datetime
      >>> datetime.now().strftime('%d-%b-%Y')
      >>> '08-Oct-2011'
      >>> datetime.now().strftime('%-d-%b-%Y')
      >>> '8-Oct-2011'
      >>> today = datetime.date.today()
      >>> today.strftime('%d-%b-%Y')
      >>> print(today)
      

      【讨论】:

      • 在 python 3 中完美运行
      • 这应该是公认的答案。按要求做,超级简单好记。快速浏览文档我无法找到此信息。
      • “这应该是公认的答案”。不,不应该,因为这只适用于 Linux。
      【解决方案10】:

      像这样简单地使用replace

      (datetime.date.now()).strftime("%Y/%m/%d").replace("/0", "/")

      它会输出:

      '2017/7/21'
      

      【讨论】:

      • 很遗憾,这不适用于格式为 1.4.2021(2021 年 4 月 1 日)的日期;它可以在几个月内捕捉到零,但不是几天(使用 "01.04.2021".replace(".0",".") 只会导致 01.4.2021)
      【解决方案11】:

      对于%d,您可以使用int() 转换为整数,然后它会自动删除前导0 并变为整数。然后您可以使用str() 转换回字符串。

      【讨论】:

      • OP 问题是针对在调用 strftime 时使用格式说明符的解决方案,而不是涉及 str() 的自行解决方案
      • 很好的答案,不要听戴夫·胡珀的
      【解决方案12】:

      例如,即使在同一操作系统的不同版本之间,使用“%-d”也是不可移植的。 更好的解决方案是单独提取日期组件,并在特定于日期的格式化运算符和每个组件的日期属性访问之间进行选择。

      e = datetime.date(2014, 1, 6)
      "{date:%A} {date.day} {date:%B}{date.year}".format(date=e)
      

      【讨论】:

        【解决方案13】:

        因为 Python 真的只是在你的平台上调用了 C 语言的strftime(3) 函数,所以可能有一些格式字符可以用来控制前导零;试试man strftime 看看。但是,当然,结果不会是可移植的,因为 Python 手册会提醒您。 :-)

        我会尝试使用新样式的datetime 对象,它具有t.yeart.montht.day 等属性,并通过% 运算符的正常、高性能格式设置这些属性,它确实支持对前导零的控制。有关详细信息,请参阅http://docs.python.org/library/datetime.html。更好的是,如果您的 Python 有 "".format() 运算符并且更现代,请使用它;它也有很多数字格式选项。见:http://docs.python.org/library/string.html#string-formatting

        【讨论】:

          【解决方案14】:

          根据 Alex 的方法,这将适用于字符串开头和后空格的情况:

          re.sub('^0|(?<= )0', '', "01 January 2000 08:00am")
          

          我比 .format 或 %-d 更喜欢它,因为它是跨平台的,让我可以继续使用 strftime(获取“十一月”和“星期一”之类的内容)。

          【讨论】:

            【解决方案15】:

            老问题,但 %l(小写 L)在 strftime 中对我有用:但这可能不适用于所有人,因为它没有在我找到的 Python 文档中列出

            【讨论】:

            • 我正在使用基于 Python 的软件包(名为 WeeWX 的气象站软件),它只允许我指定百分号格式,就像这样 - 而不是像上面大多数答案使用的复杂的字符串替换内容. “%l”对我有用! (在 Linux 上)
            • @RobCranfill 很高兴听到这对某人有用!我记得当时它为我解决了一个相当烦人的问题
            【解决方案16】:
            import datetime
            now = datetime.datetime.now()
            print now.strftime("%b %_d")
            

            【讨论】:

            • 这用空格替换了前导零,这不是 OP 要求的
            • ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y' 使用 python 3.5
            【解决方案17】:

            如果我们只想获取不带前导零的日期,我们可以

            d = date.today()
            day = int(d.strftime("%d"))
            

            【讨论】:

            • 我觉得这个解决方案很有趣,因为它适用于 Windows 和 Linux。
            【解决方案18】:

            Python 3.6+:

            from datetime import date
            today = date.today()
            text = "Today it is " + today.strftime(f"%A %B {today.day}, %Y")
            

            【讨论】:

              【解决方案19】:

              我迟到了,但是一个简单的列表切片就可以了

              today_date = date.today().strftime('%d %b %Y')
              if today_date[0] == '0':
                  today_date = today_date[1:]
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-04-19
                • 1970-01-01
                • 1970-01-01
                • 2013-12-29
                • 1970-01-01
                • 1970-01-01
                • 2010-12-11
                • 2012-01-21
                相关资源
                最近更新 更多