ЧОМУ: дати - це об’єкти
У 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
. Якщо ви хочете надрукувати дату, ви повинні надрукувати об'єкти дат, а не їх контейнер (список).
EG, ви хочете надрукувати всю дату у списку:
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()
очікує шаблон рядка, що пояснює, як ви хочете відформатувати дату.
EG:
print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'
Весь лист після символу "%"
представляє формат для чогось:
%d
- номер дня
%m
- номер місяця
%b
- абревіатура місяця
%y
- рік, останні дві цифри
%Y
є цілий рік
тощо
Перегляньте офіційну документацію , або швидку довідку МакКушен, ви не можете їх усіх знати.
Починаючи з PEP3101 , кожен об'єкт може мати власний формат, який автоматично використовується форматом методу будь-якого рядка. У випадку з датою формат буде таким самим, як і у стропіллі. Таким чином, ви можете зробити те саме, що вище, як це:
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
об’єкт.