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