Python日期时间到没有微秒组件的字符串


410

我正在将UTC时间字符串添加到当前仅包含Amsterdam(!)时间字符串的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其接收到的任何实例都将包含微秒组件。

Answers:


840

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

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

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


10
一位同事刚刚提出了令人信服的理由,因为这是正确的方法。考虑到我确信。
davidchambers,

3
那是什么令人信服的案例-使用datetime.replace将此解决方案置于您的解决方案之上?
matlehmann 2014年

13
@matlehmann:我当然不知道大卫·钱伯斯同事的论点。但是,我认为,如果您打算以一种非常特定的格式打印日期,则应该明确此意图。此答案中的代码显示为“采用当前时间并完全按照这种格式进行格式化”。另一个答案中的代码表示“花费当前时间,将微秒设置为0,然后以某种方式将其转换为字符串”。
Sven Marnach 2014年

3
+1,如果将来的Python版本中的标准datetime-str转换发生变化,则明确说明字符串格式可以避免出现问题
Alan Evangelista

2
@DylanYoung OP的要求是以与返回的标准格式不同的格式打印日期时间对象,该格式.isoformat()默认包含微秒。如果这是您需要的,请明确说明。每个人都将立即了解此代码的作用。几乎没有人会在不查看文档的情况下理解其他代码。
Sven Marnach '16

172
>>> import datetime
>>> now = datetime.datetime.now()
>>> print unicode(now.replace(microsecond=0))
2011-11-03 11:19:07


1
在我的情况下,日期已经确定,我需要将其“定位”到第二个日期。这太完美了,谢谢。
Vigrond 2014年

1
这是最好的答案!
2014年

谢谢,比格式化或解析字符串要好得多。
Zach Young


47

这就是我做到的方式。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()
davidchambers

1
取决于您要的内容,如果要使用python字符串表示形式unicode(),以及要使用ISO-8601,请使用isoformat()
radtek

我知道了。unicode().isoformat().replace('T', ' ')当然更方便。;)
davidchambers

我只是将Sven的解决方案用于非iso格式,它的含义更为明确:datetime.now()。strftime(“%Y-%m-%d%H:%M”),但是替换'T'只是另一个道路。如果您同时需要ISO和Unicode日期,则可能是最佳解决方案。
radtek

isoformat接受分隔符,所以不应该进行替换。只是做:datetime.datetime.now().replace(microsecond=0).isoformat(' ')
coya

17

另一个选择:

>>> 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询问的是日期时间,而不是时间。
尔根·艾哈德


8

我通常这样做:

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

7

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

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

3

我们可以尝试如下

import datetime

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

这不如.isoformat(' ', 'seconds')早先的答案中提出的。
davidchambers,

1
当我尝试上面提出的较早答案时,我得到以下错误>>> datetime.datetime.now()。isoformat('','seconds')追溯(最近一次调用为最新):文件“ <stdin>”,第1,在<module> TypeError中:isoformat()最多接受1个参数(给定2个)
Abhishek Bajaj

知道了 它在Python 3中对我有效,但在Python 2中不起作用
。– davidchambers

我正在使用python 3.4.3版本,因为我看到该错误。>>> datetime.datetime.now()。isoformat('','seconds')追溯(最近一次调用最近):文件“ <stdin>”,在<module>中的第1行,TypeError:isoformat()最多使用1个论点(给出2个)
Abhishek Bajaj

1

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

>>> 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'更简单的imo。但是,轻松并非是最好的
-An0n

1

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

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

辉煌。简单,灵活且与平台无关(与strftime不同)。
Endre两者
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.