ПОЧЕМУ: даты являются объектами
В 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. Если вы хотите напечатать дату, вы должны напечатать объекты даты, а не их контейнер (список).
Например, вы хотите напечатать всю дату в списке:
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 это весь год
так далее
Взгляните на официальную документацию или краткий справочник Маккатчена, вы не можете знать их все.
Начиная с 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 (переполнение стека) ;-)
str()(к каждому элементу списка), потому что это именно то, чтоprintнеявно поступило с вашим сольнымtodayобъектом.