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


681

这是我的代码:

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


13
简短的答案:通过应用str()(应用于列表的每个元素),因为这正是print隐式对您的独奏today对象所做的事情。
Lutz Prechelt '16

Answers:


945

为什么:日期是对象

在Python中,日期是对象。因此,当您操作它们时,您将操作对象,而不是字符串,时间戳或其他任何对象。

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

  • 可以使用str()函数获取“打印”所使用的常规表示形式。在大多数情况下,它是最常见的人类可读格式,用于简化显示。所以str(datetime.datetime(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)'

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

方法:您想怎么做?

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

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

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

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

for date in mylist :
    print str(date)

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

实际案例,使用您的代码

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'

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

  • %d 是天数
  • %m 是月份号
  • %b 是月份的缩写
  • %y 是年份的后两位数字
  • %Y 是整年

等等

查看官方文档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(堆栈溢出)的另一个问题;-)


3
顺便说一句,几乎在python每个数据类型是一个类(除immutables,但它们可以被继承)stackoverflow.com/questions/865911/...
Yauhen Yakimovich

1
你的意思是“差不多”?str和int具有class属性,其中包含“ type”,因此它们本身就是类,因为它们是类型metaclass的实例。
e-satis 2012年

4
这正是术语的问题:type!= class ?,即具有类型属性(提供类型推断机制以适合对象)是否足够,或者实体应该充当对象就足够了。我试图解决这个我自己在这里programmers.stackexchange.com/questions/164570/...
Yauhen Yakimovich

1
如果您是类的实例,那么您就是对象。为什么需要它变得更复杂?
e-satis 2012年

9
Python中的每个值都是一个对象。每个对象都有一个类型。“ type” ==“ class”正式(也请inspect.isclass确保)。人们倾向于对内置组件说“类型”,对其余部分说“类”,但这并不重要
Kos 2013年

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

编辑:

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

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

6
datetime.datetime
Cees Timmerman

2
您可以使用from datetime import datetime,然后使用print datetime().now().strftime("%Y-%m-%d %H:%M")。只有语法上的差异。
Daniel Magnusson

7
from datetime import date; date.today().strftime("%Y-%m-%d")依旧对我来说仍然不可思议,但这是最好的选择import time。我认为datetime模块用于日期数学。
Cees Timmerman

2
我最喜欢的是from datetime import datetime as dt,现在我们可以玩dt.now()
diewland

164

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

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

    %a  Locales abbreviated weekday name.
    %A  Locales full weekday name.      
    %b  Locales abbreviated month name.     
    %B  Locales full month name.
    %c  Locales 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  Locales 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  Locales appropriate date representation.    
    %X  Locales 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

1
这解决了我的问题,而“更多支持的答案”却没有。但是我的问题与OP不同。我希望将几个月打印为文本(“ 2月”而不是“ 2”)
内森

73

使用date.strftime。格式参数在文档中进行了描述

这是您想要的:

some_date.strftime('%Y-%m-%d')

这一部分考虑了语言环境。(做这个)

some_date.strftime('%c')


26
# convert date time to regular format.

d_date = datetime.datetime.now()
reg_format_date = d_date.strftime("%Y-%m-%d %I:%M:%S %p")
print(reg_format_date)

# some other date formats.
reg_format_date = d_date.strftime("%d %B %Y %I:%M:%S %p")
print(reg_format_date)
reg_format_date = d_date.strftime("%Y-%m-%d %H:%M:%S")
print(reg_format_date)

输出值

2016-10-06 01:21:34 PM
06 October 2016 01:21:34 PM
2016-10-06 13:21:34

25

甚至

from datetime import datetime, date

"{:%d.%m.%Y}".format(datetime.now())

出:'25 .12.2013

要么

"{} - {:%d.%m.%Y}".format("Today", datetime.now())

离开:“今天-2013年12月25日”

"{:%A}".format(date.today())

出:“星期三”

'{}__{:%Y.%m.%d__%H-%M}.log'.format(__name__, datetime.now())

出:'__main ____ 2014.06.09__16-56.log'



8

格式化的字符串文字中使用特定于类型的datetime字符串格式(请参阅nk9的答案str.format()。)(自Python 3.6,2016-12-23起):

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

日期/时间格式指令不会记录为部分格式字符串语法,而是在datedatetimetimestrftime()文档。它们基于1989 C标准,但自Python 3.6起包含一些ISO 8601指令。


请注意,我还将此信息添加到了接受的答案中
处理

strftime并未真正包含“ ISO 8601输出”。有“指令”,但仅针对诸如“星期几”之类的特定标记,而不是整个ISO 8601时间戳,我一直觉得这很烦人。
anarcat

5

您需要将日期时间对象转换为字符串。

以下代码为我工作:

import datetime
collection = []
dateTimeString = str(datetime.date.today())
collection.append(dateTimeString)
print collection

让我知道您是否需要更多帮助。


3
来吧 !不要鼓励新手存储字符串而不是日期对象。他将不知道什么时候是个好主意……
e-satis

e-satis:如果您只需要一个字符串,那有什么大不了的?我们始终将固件构建日期存储为字符串-有时如果您只需要一个简单的时间戳(YAGNI等),则存储整个对象就显得过分了。
HanClinto

3
是的,在某些情况下是这样。我只是说,只有新手才能确定这些案例。因此,让我们从右脚开始:-)
e-satis


3

我讨厌为了方便而导入太多模块的想法。我宁愿使用可用模块,在这种情况下也datetime不愿调用新模块time

>>> a = datetime.datetime(2015, 04, 01, 11, 23, 22)
>>> a.strftime('%Y-%m-%d %H:%M')
'2015-04-01 11:23'

1
我认为这样做更有效,只需一行代码即可完成a = datetime.datetime(2015, 04, 01, 23, 22).strftime('%Y-%m-%d %H:%M)
Dorian Dore

3

考虑到您要求做一些简单的事情来做自己想做的事情,您可以:

import datetime
str(datetime.date.today())

3

对于那些想要基于区域设置的日期而不包括时间的人,请使用:

>>> some_date.strftime('%x')
07/11/2019

2

您可能想将其附加为字符串?

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

2

由于print today返回所需的内容,因此这意味着Today对象的__str__函数将返回您要查找的字符串。

所以你也可以做mylist.append(today.__str__())



1

我的答案免责声明-我只学习Python大约2周,所以我绝不是专家。因此,我的解释可能不是最好的,并且我可能使用了错误的术语。无论如何,就这样。

我在您的代码中注意到,在声明变量时,today = datetime.date.today()您选择使用内置函数的名称来命名变量。

当您的下一行代码mylist.append(today)附加到列表中时,它附加了整个字符串datetime.date.today()(您之前将其设置为today变量的值),而不仅仅是追加了today()

一个简单的解决方案是更改变量的名称,尽管大多数编码人员在使用datetime模块时不会使用该解决方案。

这是我尝试过的:

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

它打印yyyy-mm-dd



1
from datetime import date
def time-format():
  return str(date.today())
print (time-format())

如果那是您想要的,它将打印6-23-2018 :)


-1
import datetime
import time

months = ["Unknown","January","Febuary","Marchh","April","May","June","July","August","September","October","November","December"]
datetimeWrite = (time.strftime("%d-%m-%Y "))
date = time.strftime("%d")
month= time.strftime("%m")
choices = {'01': 'Jan', '02':'Feb','03':'Mar','04':'Apr','05':'May','06': 'Jun','07':'Jul','08':'Aug','09':'Sep','10':'Oct','11':'Nov','12':'Dec'}
result = choices.get(month, 'default')
year = time.strftime("%Y")
Date = date+"-"+result+"-"+year
print Date

这样,您就可以将日期格式设置为以下示例:22-Jun-2017


1
您可能在一行中得到的太多代码。有了%b您,您将获得前三个月的单词以及%B整个月的单词。例如:datetime.datetime.now().strftime("%Y-%b-%d %H:%M:%S")将返回'2018-OCT-04 9时44分08秒'
维克托·洛佩斯

-1

我不太了解,但是可以pandas用来获取正确格式的时间:

>>> import pandas as pd
>>> pd.to_datetime('now')
Timestamp('2018-10-07 06:03:30')
>>> print(pd.to_datetime('now'))
2018-10-07 06:03:47
>>> pd.to_datetime('now').date()
datetime.date(2018, 10, 7)
>>> print(pd.to_datetime('now').date())
2018-10-07
>>> 

和:

>>> l=[]
>>> l.append(pd.to_datetime('now').date())
>>> l
[datetime.date(2018, 10, 7)]
>>> map(str,l)
<map object at 0x0000005F67CCDF98>
>>> list(map(str,l))
['2018-10-07']

但是它存储字符串,但易于转换:

>>> l=list(map(str,l))
>>> list(map(pd.to_datetime,l))
[Timestamp('2018-10-07 00:00:00')]

4
做某件事的整个依赖项python std库有方法要做吗?
Hejazzman,
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.