How to print date in a regular format in Python?

This is my code:

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

This prints: 2008-11-22 which is exactly what I want BUT....I have a list I'm appending this to and then suddenly everything goes "wonky". Here is the code:

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

This prints the following:

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

How on earth can I get just a simple date like "2008-11-22"?


The WHY: dates are objects

In Python, dates are objects. Therefore, when you manipulate them, you manipulate objects, not strings, not timestamps nor anything.

Any object in Python have TWO string representations:

  • The regular representation that is used by "print", can be get using the str() function. It is most of the time the most common human readable format and is used to ease display. So str(datetime.datetime(2008, 11, 22, 19, 53, 42)) gives you '2008-11-22 19:53:42' .

  • The alternative representation that is used to represent the object nature (as a data). It can be get using the repr() function and is handy to know what kind of data your manipulating while you are developing or debugging. repr(datetime.datetime(2008, 11, 22, 19, 53, 42)) gives you 'datetime.datetime(2008, 11, 22, 19, 53, 42)' .

  • What happened is that when you have printed the date using "print", it used str() so you could see a nice date string. But when you have printed mylist , you have printed a list of objects and Python tried to represent the set of data, using repr() .

    The How: what do you want to do with that?

    Well, when you manipulate dates, keep using the date objects all long the way. They got thousand of useful methods and most of the Python API expect dates to be objects.

    When you want to display them, just use str() . In Python, the good practice is to explicitly cast everything. So just when it's time to print, get a string representation of your date using str(date) .

    One last thing. When you tried to print the dates, you printed mylist . If you want to print a date, you must print the date objects, not their container (the list).

    EG, you want to print all the date in a list :

    for date in mylist :
        print str(date)
    

    Note that in that specific case , you can even omit str() because print will use it for you. But it should not become a habit :-)

    Practical case, using your code

    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
    

    Advanced date formatting

    Dates have a default representation, but you may want to print them in a specific format. In that case, you can get a custom string representation using the strftime() method.

    strftime() expects a string pattern explaining how you want to format your date.

    EG :

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

    All the letter after a "%" represent a format for something :

  • %d is the day number
  • %m is the month number
  • %b is the month abbreviation
  • %y is the year last two digits
  • %Y is the all year
  • etc

    Have a look at the official documentation, or McCutchen's quick reference you can't know them all.

    Since PEP3101, every object can have its own format used automatically by the method format of any string. In the case of the datetime, the format is the same used in strftime. So you can do the same as above like this:

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

    The advantage of this form is that you can also convert other objects at the same time.
    With the introduction of Formatted string literals (since Python 3.6, 2016-12-23) this can be written as

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

    Localization

    Dates can automatically adapt to the local language and culture if you use them the right way, but it's a bit complicated. Maybe for another question on SO(Stack Overflow) ;-)


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

    Edit:

    After Cees suggestion, I have started using time as well:

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

    The date, datetime, and time objects all support a strftime(format) method, to create a string representing the time under the control of an explicit format string.

    Here is a list of the format codes with their directive and meaning.

        %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.
    

    This is what we can do with the datetime and time modules in Python

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

    That will print out something like this:

        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
    
    链接地址: http://www.djcxy.com/p/35106.html

    上一篇: 如何将ISO 8601日期时间字符串转换为Python日期时间对象?

    下一篇: 如何在Python中以常规格式打印日期?