【问题标题】:Python datetime to string without microsecond componentPython datetime 到没有微秒组件的字符串
【发布时间】:2011-12-21 10:41:16
【问题描述】:

我正在将 UTC 时间字符串添加到当前仅包含阿姆斯特丹 (!) 时间字符串的 Bitbucket API 响应中。为了与其他地方返回的 UTC 时间字符串保持一致,所需的格式是 2011-11-03 11:07:04(后跟 +00:00,但这不是密切相关的)。

datetime 实例使用微秒组件创建这样一个字符串(没有微秒组件)的最佳方法是什么?

>>> import datetime
>>> print unicode(datetime.datetime.now())
2011-11-03 11:13:39.278026

我将添加我想到的最佳选项作为可能的答案,但可能会有更优雅的解决方案。

编辑:我应该提一下,我并没有实际上打印当前时间——我使用datetime.now 来提供一个简单的示例。因此,该解决方案不应假定它接收到的任何datetime 实例都将包含微秒级组件。

【问题讨论】:

    标签: python datetime datetime-format


    【解决方案1】:

    如果您想以不同于标准格式的特定格式格式化 datetime 对象,最好明确指定该格式:

    >>> datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    '2011-11-03 18:21:26'
    

    有关% 指令的说明,请参阅the documentation of datetime.strftime()

    【讨论】:

    • 什么是令人信服的案例 - 使用 datetime.replace 将此解决方案置于您的解决方案之上?
    • @matlehmann:我当然不知道 davidchambers 同事的论点。但是,我认为如果您的意图是以非常特定的格式打印日期,您应该明确说明这一意图。这个答案中的代码说“取当前时间并完全像这样格式化”。另一个答案中的代码说“取当前时间,将微秒设置为 0,然后以某种方式将其转换为字符串”。
    • +1,如果标准的 datetime-str 转换在未来的 Python 版本中发生变化,明确字符串格式可以避免问题
    • @DylanYoung OP 的要求是以与.isoformat() 返回的标准格式不同的格式打印日期时间对象,默认情况下包括微秒.如果这是您需要的,请明确说明。每个人都会立即明白这段代码的作用。如果不查看文档,几乎没有人会理解其他代码。
    • 从 Python 3.6 开始,您可以简单地执行以下操作:datetime.now().isoformat(timespec='seconds', sep=' ')
    【解决方案2】:
    >>> import datetime
    >>> now = datetime.datetime.now()
    >>> print unicode(now.replace(microsecond=0))
    2011-11-03 11:19:07
    

    【讨论】:

    【解决方案3】:

    在 Python 3.6 中:

    from datetime import datetime
    datetime.now().isoformat(' ', 'seconds')
    '2017-01-11 14:41:33'
    

    https://docs.python.org/3.6/library/datetime.html#datetime.datetime.isoformat

    【讨论】:

    • 我认为现在,8 年后随着 Python 3.6 的出现,这应该是公认的、普遍的答案。这提供了@DylanYoung 和 AlexanderMP 在同一线程here 上争论的两全其美
    • 我一直讨厌那个“T”。直到现在我才知道分隔符选项。谢谢你和 1+。
    【解决方案4】:

    我就是这样做的。 ISO 格式:

    import datetime
    datetime.datetime.now().replace(microsecond=0).isoformat()
    # Returns: '2017-01-23T14:58:07'
    

    如果您不想要 ISO 格式,您可以替换“T”:

    datetime.datetime.now().replace(microsecond=0).isoformat(' ')
    # Returns: '2017-01-23 15:05:27'
    

    【讨论】:

    • 这与我的回答类似。有理由支持.isoformat() 而不是unicode()
    • 取决于你想要什么,如果你想要python字符串表示使用unicode(),如果你想要ISO-8601,使用isoformat()
    • 我明白了。 unicode() 肯定比 .isoformat().replace('T', ' ') 更方便。 ;)
    • 我只会使用 Sven 的非 ISO 格式解决方案,它更明确: datetime.now().strftime("%Y-%m-%d %H:%M") ,但是替换“T”只是另一种方式。如果您需要 ISO 和 unicode 日期,可能是最佳解决方案。
    • isoformat 接受分隔符说明符,因此不应进行替换。就这样做:datetime.datetime.now().replace(microsecond=0).isoformat(' ')
    【解决方案5】:

    另一种选择:

    >>> import time
    >>> time.strftime("%Y-%m-%d %H:%M:%S")
    '2011-11-03 11:31:28'
    

    默认情况下使用本地时间,如果您需要 UTC,您可以使用以下:

    >>> time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
    '2011-11-03 18:32:20'
    

    【讨论】:

    • 投反对票,因为 OP 询问的是日期时间,而不是时间。
    【解决方案6】:

    通过切片保留您想要的前 19 个字符:

    >>> str(datetime.datetime.now())[:19]
    '2011-11-03 14:37:50'
    

    【讨论】:

    • 这只是不正确的,因为时间字符串可以附加时区规范,例如+05:30。正确的是str(now())[:19]
    • @K3---rnc:谢谢。根据您的建议更新。
    • 一年后10000,会错过一秒钟
    • 时间会告诉@diti ;)
    【解决方案7】:

    我通常这样做:

    import datetime
    now = datetime.datetime.now()
    now = now.replace(microsecond=0)  # To print now without microsecond.
    
    # To print now:
    print(now)
    

    输出:

    2019-01-13 14:40:28
    

    【讨论】:

      【解决方案8】:

      由于并非所有datetime.datetime 实例都具有微秒分量(即为零时),因此您可以将字符串分区为“。”并只取第一项,这将始终有效:

      unicode(datetime.datetime.now()).partition('.')[0]
      

      【讨论】:

        【解决方案9】:

        从 Python 3.6+ 开始,最好的方法是使用 isoformat 的新 timespec 参数。

        isoformat(timespec='seconds', sep=' ')
        

        用法:

        >>> datetime.now().isoformat(timespec='seconds')
        '2020-10-16T18:38:21'
        >>> datetime.now().isoformat(timespec='seconds', sep=' ')
        '2020-10-16 18:38:35'
        

        【讨论】:

          【解决方案10】:

          我们可以试试下面的方法

          import datetime
          
          date_generated = datetime.datetime.now()
          date_generated.replace(microsecond=0).isoformat(' ').partition('+')[0]
          

          【讨论】:

          • 这不如.isoformat(' ', 'seconds'),在较早的答案中提出。
          • 当我尝试上面提出的较早答案时,我遇到了错误>>> datetime.datetime.now().isoformat(' ', 'seconds') Traceback(最近一次通话最后一次): 中的文件“”,第 1 行 TypeError:isoformat() 最多接受 1 个参数(给定 2 个)
          • 啊,我明白了。它适用于 Python 3,但不适用于 Python 2。
          • 我使用的是 python 3.4.3 版本,因为我看到了那个错误。 >>> datetime.datetime.now().isoformat(' ', 'seconds') Traceback(最近一次调用最后):文件“”,第 1 行,在 类型错误:isoformat() 最多占用1 个参数(2 个给定)
          【解决方案11】:

          我使用它是因为我可以理解并因此更好地记住它(日期时间格式也可以根据您的选择进行自定义):-

          import datetime
          moment = datetime.datetime.now()
          print("{}/{}/{} {}:{}:{}".format(moment.day, moment.month, moment.year,
                                           moment.hour, moment.minute, moment.second))
          

          【讨论】:

          • 太棒了。简单、灵活且独立于平台(与 strftime 不同)。
          【解决方案12】:
          >>> from datetime import datetime
          >>> dt = datetime.now().strftime("%Y-%m-%d %X")
          >>> print(dt)
          '2021-02-05 04:10:24'
          

          【讨论】:

            【解决方案13】:

            f 字符串格式

            >>> import datetime
            >>> print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S}')
            2021-12-01 22:10:07
            

            【讨论】:

              【解决方案14】:

              我发现这是最简单的方法。

              >>> t = datetime.datetime.now()
              >>> t
              datetime.datetime(2018, 11, 30, 17, 21, 26, 606191)
              >>> t = str(t).split('.')
              >>> t
              ['2018-11-30 17:21:26', '606191']
              >>> t = t[0]
              >>> t
              '2018-11-30 17:21:26'
              >>> 
              

              【讨论】:

              • datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") '2011-11-03 18:21:26' 多更容易海事组织。但简单并不总是最好的
              【解决方案15】:

              你也可以使用下面的方法

              import datetime as _dt
              
              ts = _dt.datetime.now().timestamp()
              print("TimeStamp without microseconds: ", int(ts)) #TimeStamp without microseconds:  1629275829
              
              dt = _dt.datetime.now()
              print("Date & Time without microseconds: ", str(dt)[0:-7]) #Date & Time without microseconds:  2021-08-18 13:07:09
              

              【讨论】:

                【解决方案16】:

                没有微秒分量的当前时间戳:

                timestamp = list(str(datetime.timestamp(datetime.now())).split('.'))[0]
                

                【讨论】:

                • 这不会以所请求的格式提供答案。
                猜你喜欢
                • 2014-01-11
                • 2015-09-14
                • 2015-12-02
                • 2023-03-08
                • 1970-01-01
                • 1970-01-01
                • 2014-11-27
                • 1970-01-01
                相关资源
                最近更新 更多