printf在Python中将时间格式化为字符串

printf在Python中将时间格式化为字符串,python,django,Python,Django,如何以字符串格式显示datetime对象以进行打印 以下是我试图打印的字符串: 'Text %s, on date: %d' % (x.name, x.time) 下面是我得到的错误: %d format: a number is required, not datetime.datetime 如果您使用的是Python 2.6或更高版本,那么format()是格式化字符串的最佳选择。它可以帮助您避免被%格式说明符弄乱,使用它您必须执行更多的任务才能将字符串格式化为正确的格式。。否则您可以获

如何以字符串格式显示datetime对象以进行打印

以下是我试图打印的字符串:

'Text %s, on date: %d' % (x.name, x.time)
下面是我得到的错误:

%d format: a number is required, not datetime.datetime
如果您使用的是Python 2.6或更高版本,那么
format()
是格式化字符串的最佳选择。它可以帮助您避免被
%
格式说明符弄乱,使用它您必须执行更多的任务才能将字符串格式化为正确的格式。。否则您可以获得
类型错误

解决方案 您需要在模板或参数中更改类型:

'Text %s, on date: %s' % (x.name, x.time)
但是
datetime.datetime
实例只是一个对象(它具有某种人性化的字符串表示)。您可以通过以下方式将其更改为更友好:

'Text %s, on date: %s' % (x.name, x.time.isoformat())
您甚至可以使用以下方法对其进行格式化:

试验 让我们测试一下:

>>> import datetime
>>> now = datetime.datetime.now()  # our "now" timestamp
>>> '%d' % now

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    '%d' % datetime.datetime.now()
TypeError: %d format: a number is required, not datetime.datetime
>>> '%s' % now.isoformat()
'2012-09-25T22:24:30.399000'
>>> now.strftime('%A, %B %d, %Y')
'Tuesday, September 25, 2012'

@基思。。我应该引用那句话。。谢谢。注意:在日期:{1}将字符串更改为
“Text{0}”
将使其在python 2.6及更高版本上工作。@lazyr。。空括号在2.6或更高版本中不起作用吗??As format()仅在2.6中引入。。我使用的是Python2.7,所以我不知道..@RohitJain:
。format()
方法优于字符串格式化操作(
%
),但因为与您提到的不同。这两种方法都非常灵活,您甚至没有触及字符串格式化操作的边界,但
.format()
方法的基本优点是它。。。是一种方法;)为了更深入的比较,请参阅:从第七段开始:“在版本2.7中更改:位置参数说明符可以省略,所以<代码> {{} } /代码>相当于<代码> { 0 }{ 1 } <代码>,如果您正在编写新代码,请考虑使用它,因为它“应该优先于<代码> %格式化(…)在新的代码中”,根据链接文档+1,但有一条注释:“但是datetime.datetime实例只是一个没有人性化字符串表示的对象。”这不是真的。它确实有一个字符串表示,并且有文档记录;唯一的问题是它可能不是你想要的。(令人恼火的是,它几乎和isoformat完全不同:“2012-09-25 14:02:58.806941”。@abarnert:是的,它有字符串表示法。最初我考虑的是表示法(
repr()
%r
),它并不是真正的人性化(
datetime.datetime(2012,9,25,22,26,28393000)
)。但是是的,字符串表示法(
str()
datetime.datetime.\uu str\uu()
,或
%s
-取决于您使用它的位置)也是
datatime.datetime
的一部分,所以我将在我的回答中包括这一点。谢谢。
datetime
实际上是一个非常友好的类,它的
\uuuuu repr\uuuuu
既可读又可执行,可以创建一个等价的对象,而且它的
\uuuu str\uuuuu
格式良好,可排序。所以有一个小问题,它离ISO格式只有一个字符,这就更加突出了…不管怎样,你的答案以可读的形式包含了如此多的信息,真遗憾我不能+2它。
'Text %s, on date: %s' % (x.name, x.time.strftime('%A, %B %d, %Y'))
>>> import datetime
>>> now = datetime.datetime.now()  # our "now" timestamp
>>> '%d' % now

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    '%d' % datetime.datetime.now()
TypeError: %d format: a number is required, not datetime.datetime
>>> '%s' % now.isoformat()
'2012-09-25T22:24:30.399000'
>>> now.strftime('%A, %B %d, %Y')
'Tuesday, September 25, 2012'
'Text {x.name}, on date: {x.time}'.format(x=x)  # accessing properties
'Text {0}, on date: {1}'.format(x.name, x.time)  # accessing by positions
'Text {}, on date: {}'.format(x.name, x.time)  # in Python >2.7 it can be shorter
'Text {0}, on date: {1}'.format(x.name, x.time.isoformat())  # ISO format
'Text {0}, on date: {1}'.format(x.name, x.time.strftime('%A, %B %d, %Y'))