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

这是我的代码:

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”这样简单的日期?

    WHY:日期是对象

    在Python中,日期是对象。 因此,当你操纵它们时,你操纵对象,而不是字符串,不是时间戳,也不是任何东西。

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

    • “print”使用的正则表达式可以使用str()函数获得。 这是大多数时间最常见的人类可读的格式,并用于缓解显示。 所以str(datetime.datetime(2008, 11, 22, 19, 53, 42)) '2008-11-22 19:53:42' 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()因为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是天数
    • %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' 

    本土化

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

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

    编辑:

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

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

    日期,日期时间和时间对象都支持一个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 

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

    这一个是你想要的:

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

    这一个考虑到区域设置。 (做这个)

     some_date.strftime('%c') 

    这个更短:

     >>> import time >>> time.strftime("%Y-%m-%d %H:%M") '2013-11-19 09:38' 

    甚至

     from datetime import datetime, date "{:%d.%m.%Y}".format(datetime.now()) 

    出:'25 .12.2013

    要么

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

    出:“今天 – 25.12.2013”

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

    出:“星期三”

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

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

     # 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) 

    OUTPUT

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

    简单的答案 –

     datetime.date.today().isoformat() 

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

    下面的代码为我工作:

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

    让我知道你是否需要任何帮助。

    你可能想把它作为一个字符串追加?

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

    你可以做:

     mylist.append(str(today)) 

    由于print todayprint today返回你想要的东西,这意味着today对象的__str__函数返回你正在寻找的字符串。

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

    您可以使用easy_date简化操作 :

     import date_converter my_date = date_converter.date_to_string(today, '%Y-%m-%d') 

    我的答案是一个快速免责声明 – 我只学习了Python约2周,所以我绝不是专家; 因此,我的解释可能不是最好的,我可能会使用不正确的术语。 无论如何,在这里。

    我注意到在你的代码中,当你today = datetime.date.today()声明了你的变量today = datetime.date.today()你选择用一个内置函数的名字命名你的变量。

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

    一个简单的解决方案,尽管可能不是大多数编码人员在使用日期时间模块时会使用的一种方法,但是要更改变量的名称。

    这是我的尝试:

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

    并打印yyyy-mm-dd

    以下是如何显示日期(年/月/日):

     from datetime import datetime now = datetime.now() print '%s/%s/%s' % (now.year, now.month, now.day) 

    使用格式化字符串文字 (自Python str.format() )以特定于类型的datetime字符串格式(请参阅nk9的回答,使用str.format() 。):

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

    日期/时间格式指令不作为格式字符串语法的一部分,而是在datedatetime timetimestrftime()文档中记录。 这些都是基于1989 C标准,但自从Python 3.6以来包含了一些ISO 8601指令。

     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 

    通过这种方式,您可以像这个例子一样获得日期格式:2017年6月22日

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

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