ПОЧЕМУ: даты являются объектами
В 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
объектом.