Python datetime to string without microsecond component

dav*_*ers 384 python datetime datetime-format

我正在将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
Run Code Online (Sandbox Code Playgroud)

作为一个可能的答案,我将添加我发生的最佳选项,但可能会有一个更优雅的解决方案.

编辑:我应该提到我实际上并没有打印当前时间 - 我曾经datetime.now提供过一个简单的例子.所以解决方案不应该假设datetime它接收的任何实例都包含微秒组件.

Sve*_*ach 790

如果要格式化datetime与标准格式不同的特定格式的对象,最好明确指定该格式:

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

有关指令的说明,请参阅文档datetime.strftime()%.

  • @matlehmann:我当然不知道davidchambers的同事的论点.但是,我认为如果您打算以非常具体的格式打印日期,您应该明确这个意图.这个答案中的代码说"把当前时间和格式完全一样".另一个答案中的代码说"获取当前时间,将微秒设置为0,然后以某种方式将其转换为字符串". (13认同)
  • 一位同事刚才提出了一个令人信服的理由,认为这是正确的做法.考虑我说服了. (10认同)
  • 什么是令人信服的案例 - 使用datetime.replace将此解决方案置于您的解决方案之上? (3认同)
  • 如果标准的datetime-str转换在未来的Python版本中发生变化,那么明确表示字符串格式可以避免出现问题 (3认同)
  • 从 Python 3.6 开始,您可以简单地执行:`datetime.now().isoformat(timespec='seconds', sep=' ')` (3认同)
  • @DylanYoung OP的要求是以与.isoformat()返回的标准格式_different_格式不同的格式打印日期时间对象,默认情况下包括微秒。如果这是您需要的,请明确说明。每个人都将立即了解此代码的作用。几乎没有人会在不查看文档的情况下理解其他代码。 (2认同)

dav*_*ers 162

>>> import datetime
>>> now = datetime.datetime.now()
>>> print unicode(now.replace(microsecond=0))
2011-11-03 11:19:07
Run Code Online (Sandbox Code Playgroud)

  • 我认为,这是正确的解决方案,因为它具有可读性和文档记录以及一致的行为:["``.isoformat([sep])` - 以ISO 8601格式返回表示日期和时间的字符串,YYYY-MM-DDTHH: MM:SS.mmmmmm或,如果微秒为0,YYYY-MM-DDTHH:MM:SS"](http://docs.python.org/2/library/datetime.html#datetime.datetime.isoformat) (19认同)

小智 54

在Python 3.6中:

from datetime import datetime
datetime.datetime.now().isoformat(' ', 'seconds')
'2017-01-11 14:41:33'
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为现在,8 年后随着 Python 3.6 的出现,这应该是公认的、普遍的答案。这提供了@DylanYoung 和 AlexanderMP 在同一线程 [here](/sf/answers/559998421/) 上争论的两全其美 (6认同)

rad*_*tek 42

这就是我这样做的方式.ISO格式:

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

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

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


And*_*ark 17

还有一个选择:

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

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

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


Ste*_*ski 15

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

>>> str(datetime.datetime.now())[:19]
'2011-11-03 14:37:50'
Run Code Online (Sandbox Code Playgroud)

  • 这只是不正确的,因为时间字符串可以附加时区规范,例如`+05:30`.正确的是`str(now())[:19]`. (5认同)
  • @K3---rnc:谢谢。根据您的建议更新。 (2认同)

An0*_*n0n 13

我通常这样做:

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

# To print now:
print(now)
Run Code Online (Sandbox Code Playgroud)

输出:

2019-01-13 14:40:28
Run Code Online (Sandbox Code Playgroud)


Aus*_*all 8

由于并非所有datetime.datetime实例都具有微秒组件(即,当它为零时),您可以将字符串分区为".".并只采取第一项,它将始终有效:

unicode(datetime.datetime.now()).partition('.')[0]
Run Code Online (Sandbox Code Playgroud)


cra*_*ael 5

对于Python 3.6及更高版本的,这样做的最好的办法是通过新timespec的说法isoformat

isoformat(timespec='seconds', sep=' ')
Run Code Online (Sandbox Code Playgroud)

用法:

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


k.t*_*k.t 5

f 字符串格式

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