Как напечатать дату в обычном формате на 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"?

вопрос задан 22.11.2008
NomadAlien
3035 репутация

20 ответов


  • 778 рейтинг

    ПОЧЕМУ: даты являются объектами

    В Python даты - это объекты. Поэтому, когда вы манипулируете ими, вы манипулируете объектами, а не строками, ни временными метками, ни чем-либо еще.

    Любой объект в Python имеет два строковых представления:

    • Обычное представление, которое используется командой «print», можно получить с помощью функции 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)'.

    Произошло то, что когда вы печатали дату, используя «print», она использовала str(), чтобы вы могли видеть красивую строку даты. Но когда вы напечатали mylist, вы напечатали список объектов, и Python попытался представить набор данных, используя repr().

    Как: что вы хотите с этим делать?

    Хорошо, когда вы манипулируете датами, продолжайте использовать объекты даты все время. Они получили тысячи полезных методов, и большинство API Python ожидают, что даты будут объектами.

    Если вы хотите отобразить их, просто используйте str(). В Python хорошей практикой является явное приведение всех. Поэтому, когда пришло время печатать, получите строковое представление вашей даты, используя str(date).

    И последнее. Когда вы пытались напечатать даты, вы напечатали mylist. Если вы хотите напечатать дату, вы должны напечатать объекты даты, а не их контейнер (список).

    E. G, вы хотите напечатать все даты в списке:

    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() ожидает строковый шаблон, объясняющий, как вы хотите отформатировать дату.

    E. G:

    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'
    

    Локализация

    Даты могут автоматически адаптироваться к местному языку и культуре, если вы используете их правильно, но это немного сложно. Может быть, для другого вопроса о SO (переполнение стека) ;-)

    ответ дан e-satis, с репутацией 342132, 22.11.2008
  • 253 рейтинг
    import datetime
    print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
    

    Редактировать:

    После предложения Cees я тоже начал использовать время:

    import time
    print time.strftime("%Y-%m-%d %H:%M")
    
    ответ дан Daniel Magnusson, с репутацией 7150, 14.01.2013
  • 126 рейтинг

    Все объекты 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

        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
    
    ответ дан Transformer, с репутацией 2306, 22.09.2013
  • 66 рейтинг

    Дата использования. STRFTIME. Аргументы форматирования описаны в документации .

    Это то, что вы хотели:

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

    Это учитывает локаль. (сделать это)

    some_date.strftime('%c')
    
    ответ дан Ali Afshar, с репутацией 32346, 22.11.2008
  • 25 рейтинг

    Это короче:

    >>> import time
    >>> time.strftime("%Y-%m-%d %H:%M")
    '2013-11-19 09:38'
    
    ответ дан Cees Timmerman, с репутацией 7759, 19.11.2013
  • 21 рейтинг
    # 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
    
    ответ дан Waqas Ali, с репутацией 826, 6.10.2016
  • 20 рейтинг

    или даже

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

    Out: '25. 12. 2013

    или

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

    Выход: «Сегодня - 25. 12. 2013 '

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

    Out:' Wednesday '

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

    Out:' __main__ 2014. 06. 09__16-56. журнал '

    ответ дан nk9, с репутацией 1705, 25.12.2013
  • 8 рейтинг

    Простой ответ -

    datetime.date.today().isoformat()
    
    ответ дан Flame of udun, с репутацией 576, 1.02.2015
  • 3 рейтинг

    С типоспецифичным datetime форматирование строки (см. ответ nk9 с использованием str.format() . ) в отформатированном строковом литерале (начиная с Python 3. 6, 2016-12-23):

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

    Директивы формата даты / времени документированы не как часть синтаксиса строки формата , а в документации по документам date, datetime и time strftime() . Они основаны на стандарте C 1989 года, но включают некоторые директивы ISO 8601 начиная с Python 3. 6.

    ответ дан handle, с репутацией 2686, 15.06.2017
  • 2 рейтинг

    Вам необходимо преобразовать объект даты и времени в строку.

    У меня работал следующий код:

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

    Дайте мне знать, если вам нужна дополнительная помощь.

    ответ дан Simon Johnson, с репутацией 6309, 22.11.2008
  • 1 рейтинг

    Вы можете добавить его в строку?

    import datetime 
    mylist = [] 
    today = str(datetime.date.today())
    mylist.append(today) 
    print mylist
    
    ответ дан HanClinto, с репутацией 8234, 22.11.2008
  • 1 рейтинг

    Вы можете сделать:

    mylist.append(str(today))
    
    ответ дан Igal Serban, с репутацией 9127, 22.11.2008
  • 1 рейтинг
    from datetime import date
    def time-format():
      return str(date.today())
    print (time-format())
    

    это напечатает 6-23-2018, если это то, что вы хотите :)

    ответ дан Erix, с репутацией 11, 23.06.2018
  • 1 рейтинг

    Учитывая тот факт, что вы попросили что-то простое, чтобы сделать то, что вы хотели, вы могли бы просто:

    import datetime
    str(datetime.date.today())
    
    ответ дан Ward Taye, с репутацией 11, 3.09.2018
  • 0 рейтинг

    Мне не нравится идея импортировать слишком много модулей для удобства. Я предпочел бы работать с доступным модулем, который в данном случае datetime, а не вызывать новый модуль time.

    >>> a = datetime.datetime(2015, 04, 01, 11, 23, 22)
    >>> a.strftime('%Y-%m-%d %H:%M')
    '2015-04-01 11:23'
    
    ответ дан rickydj, с репутацией 179, 13.04.2015
  • 0 рейтинг

    Быстрый отказ от ответственности за мой ответ - я изучаю 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.

    ответ дан Mark S., с репутацией 14, 21.03.2015
  • 0 рейтинг

    Вот как отобразить дату в виде (год / месяц / день):

    from datetime import datetime
    now = datetime.now()
    
    print '%s/%s/%s' % (now.year, now.month, now.day)
    
    ответ дан Adrian Simon, с репутацией 1, 18.06.2016
  • 0 рейтинг

    Так как print today возвращает то, что вы хотите, это означает, что функция объекта __str__ объекта today возвращает искомую строку.

    Так что вы можете сделать mylist.append(today.__str__()), а также.

    ответ дан Ismail Elouafiq, с репутацией 23, 18.11.2014
  • 0 рейтинг

    Вы можете использовать easy_date для упрощения:

    import date_converter
    my_date = date_converter.date_to_string(today, '%Y-%m-%d')
    
    ответ дан Raphael Amoedo, с репутацией 2194, 10.05.2015
  • -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

    ответ дан tanmayee, с репутацией 7, 22.06.2017