协慌网

登录 贡献 社区

如何以常规格式打印日期?

这是我的代码:

import datetime
today = datetime.date.today()
print(today)

打印: 2008-11-22这正是我想要的。

但是,我有一个列表要附加到该列表上,然后突然所有内容都变得 “不可思议”。这是代码:

import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print(mylist)

打印以下内容:

[datetime.date(2008, 11, 22)]

我怎样才能得到像2008-11-22这样的简单约会?

答案

为什么:日期是对象

在 Python 中,日期是对象。因此,当您操纵它们时,您操纵的是对象,而不是字符串或时间戳。

Python 中的任何对象都有两个字符串表示形式:

  • 可以使用str()函数print使用的常规表示形式。在大多数情况下,它是最常见的人类可读格式,用于简化显示。所以str(datetime.datetime(2008, 11, 22, 19, 53, 42)) 2008,11,22,19,53,42))给您'2008-11-22 19:53:42'

  • 用于表示对象性质(作为数据)的替代表示。 repr()函数获得它,并且很容易知道在开发或调试时要处理的数据类型。 repr(datetime.datetime(2008, 11, 22, 19, 53, 42))给您'datetime.datetime(2008, 11, 22, 19, 53, 42)'

发生的事情是,当您使用print日期时,它使用了str()因此您可以看到一个不错的日期字符串。但是,当您打印mylist ,您已经打印了对象列表,而 Python 尝试使用repr()表示数据集。

方法:您想怎么做?

好吧,当您操作日期时,请一直使用日期对象。他们有成千上万种有用的方法,大多数 Python API 都希望日期成为对象。

当您要显示它们时,只需使用str() 。在 Python 中,良好的做法是显式转换所有内容。因此,仅在打印时,才使用str(date)获得日期的字符串表示形式。

最后一件事。当您尝试打印日期时,您打印了mylist 。如果要打印日期,则必须打印日期对象,而不是其容器(列表)。

EG,您想将所有日期打印在一个列表中:

for date in mylist :
    print str(date)

请注意,在这种特定情况下,您甚至可以省略str()因为 print 会为您使用它。但这不应该成为一种习惯:-)

实际案例,使用您的代码

import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print mylist[0] # print the date object, not the container ;-)
2008-11-22

# It's better to always use str() because :

print "This is a new day : ", mylist[0] # will work
>>> This is a new day : 2008-11-22

print "This is a new day : " + mylist[0] # will crash
>>> cannot concatenate 'str' and 'datetime.date' objects

print "This is a new day : " + str(mylist[0]) 
>>> This is a new day : 2008-11-22

高级日期格式

日期具有默认表示形式,但是您可能需要以特定格式打印日期。在这种情况下,您可以使用strftime()方法获得自定义的字符串表示形式。

strftime()需要一个字符串模式来说明如何格式化日期。

EG:

print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'

"%"之后的所有字母代表某种格式:

  • %d是日期数字(2 位数字,如有必要,以前导零开头)
  • %m是月份号(2 位数字,如有必要,以前导零开头)
  • %b是月份的缩写(3 个字母)
  • %B是完整的月份名称(字母)
  • %y是年份的缩写(后两位)
  • %Y是完整的年份数字(4 位数字)

等等。

查看官方文档McCutchen 的快速参考资料,您可能一无所知。

PEP3101 开始,每个对象都可以具有自己的格式,该格式将由任何字符串的方法格式自动使用。对于日期时间,格式与 strftime 中使用的格式相同。因此,您可以像上面一样进行上述操作:

print "We are the {:%d, %b %Y}".format(today)
>>> 'We are the 22, Nov 2008'

这种形式的优点是您还可以同时转换其他对象。
随着格式字符串文字的引入(自 Python 3.6,2016-12-23 起),可以这样写:

import datetime
f"{datetime.datetime.now():%Y-%m-%d}"
>>> '2017-06-15'

本土化

如果您以正确的方式使用日期,日期会自动适应当地的语言和文化,但这有点复杂。也许是关于 SO(堆栈溢出)的另一个问题;-)

import datetime
print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")

编辑:

Cees 的建议之后,我也开始使用时间:

import time
print time.strftime("%Y-%m-%d %H:%M")

date,datetime 和 time 对象均支持 strftime(format)方法,以在显式格式字符串的控制下创建表示时间的字符串。

这是格式代码及其指令和含义的列表。

%a  Locale’s abbreviated weekday name.
    %A  Locale’s full weekday name.      
    %b  Locale’s abbreviated month name.     
    %B  Locale’s full month name.
    %c  Locale’s appropriate date and time representation.   
    %d  Day of the month as a decimal number [01,31].    
    %f  Microsecond as a decimal number [0,999999], zero-padded on the left
    %H  Hour (24-hour clock) as a decimal number [00,23].    
    %I  Hour (12-hour clock) as a decimal number [01,12].    
    %j  Day of the year as a decimal number [001,366].   
    %m  Month as a decimal number [01,12].   
    %M  Minute as a decimal number [00,59].      
    %p  Locale’s equivalent of either AM or PM.
    %S  Second as a decimal number [00,61].
    %U  Week number of the year (Sunday as the first day of the week)
    %w  Weekday as a decimal number [0(Sunday),6].   
    %W  Week number of the year (Monday as the first day of the week)
    %x  Locale’s appropriate date representation.    
    %X  Locale’s appropriate time representation.    
    %y  Year without century as a decimal number [00,99].    
    %Y  Year with century as a decimal number.   
    %z  UTC offset in the form +HHMM or -HHMM.
    %Z  Time zone name (empty string if the object is naive).    
    %%  A literal '%' character.

这就是我们可以使用 Python 中的 datetime 和 time 模块来做的事情

import time
    import datetime

    print "Time in seconds since the epoch: %s" %time.time()
    print "Current date and time: ", datetime.datetime.now()
    print "Or like this: ", datetime.datetime.now().strftime("%y-%m-%d-%H-%M")


    print "Current year: ", datetime.date.today().strftime("%Y")
    print "Month of year: ", datetime.date.today().strftime("%B")
    print "Week number of the year: ", datetime.date.today().strftime("%W")
    print "Weekday of the week: ", datetime.date.today().strftime("%w")
    print "Day of year: ", datetime.date.today().strftime("%j")
    print "Day of the month : ", datetime.date.today().strftime("%d")
    print "Day of week: ", datetime.date.today().strftime("%A")

那会打印出这样的东西:

Time in seconds since the epoch:    1349271346.46
    Current date and time:              2012-10-03 15:35:46.461491
    Or like this:                       12-10-03-15-35
    Current year:                       2012
    Month of year:                      October
    Week number of the year:            40
    Weekday of the week:                3
    Day of year:                        277
    Day of the month :                  03
    Day of week:                        Wednesday