DLACZEGO: daty są obiektami
W Pythonie daty są obiektami. Dlatego manipulując nimi, manipulujesz obiektami, a nie ciągami znaków, nie znacznikami czasu ani niczym innym.
Każdy obiekt w Pythonie ma DWIE reprezentacje ciągu:
Zwykłą reprezentację używaną przez „print” można uzyskać za pomocą str()
funkcji. Jest to najczęściej najpopularniejszy format czytelny dla człowieka i służy do ułatwienia wyświetlania. Więc str(datetime.datetime(2008, 11, 22, 19, 53, 42))
daje '2008-11-22 19:53:42'
.
Alternatywna reprezentacja używana do reprezentowania natury obiektu (jako danych). Można go uzyskać za pomocą repr()
funkcji i jest przydatny, aby wiedzieć, jakie dane manipulujesz podczas tworzenia lub debugowania. repr(datetime.datetime(2008, 11, 22, 19, 53, 42))
daje 'datetime.datetime(2008, 11, 22, 19, 53, 42)'
.
Stało się tak, że kiedy wydrukowałeś datę za pomocą „print”, użyłeś jej str()
, abyś mógł zobaczyć ładny ciąg daty. Ale po wydrukowaniu mylist
wydrukowałeś listę obiektów, a Python próbował reprezentować zestaw danych, używając repr()
.
Jak: co chcesz z tym zrobić?
Cóż, manipulując datami, używaj obiektów daty przez całą drogę. Dostali tysiące przydatnych metod, a większość API Pythona oczekuje, że daty będą obiektami.
Kiedy chcesz je wyświetlić, po prostu użyj str()
. W Pythonie dobrą praktyką jest jawne rzucanie wszystkim. Więc kiedy nadejdzie czas drukowania, uzyskaj ciąg reprezentujący datę za pomocą str(date)
.
Ostatnia rzecz. Podczas próby wydrukowania dat wydrukowano mylist
. Jeśli chcesz wydrukować datę, musisz wydrukować obiekty daty, a nie ich kontener (listę).
Np. Chcesz wydrukować całą datę na liście:
for date in mylist :
print str(date)
Pamiętaj, że w tym konkretnym przypadku możesz nawet pominąć, str()
ponieważ print użyje go za Ciebie. Ale to nie powinno stać się nawykiem :-)
Praktyczny przypadek, używając twojego kodu
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
Zaawansowane formatowanie daty
Daty mają domyślną reprezentację, ale możesz je wydrukować w określonym formacie. W takim przypadku można uzyskać niestandardową reprezentację ciągu przy użyciu strftime()
metody.
strftime()
oczekuje wzorca ciągu wyjaśniającego, jak chcesz sformatować datę.
EG:
print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'
Cała litera po znaku "%"
reprezentuje format czegoś:
%d
to numer dnia
%m
to numer miesiąca
%b
to skrót miesiąca
%y
to rok z ostatnich dwóch cyfr
%Y
jest cały rok
itp
Zajrzyj do oficjalnej dokumentacji lub krótkiej informacji McCutchen, że nie znasz ich wszystkich.
Od wersji PEP3101 każdy obiekt może mieć własny format używany automatycznie przez format metody dowolnego łańcucha. W przypadku daty i godziny format jest taki sam, jak w strftime. Możesz więc zrobić to samo, co powyżej:
print "We are the {:%d, %b %Y}".format(today)
>>> 'We are the 22, Nov 2008'
Zaletą tego formularza jest to, że można również konwertować inne obiekty w tym samym czasie.
Wraz z wprowadzeniem sformatowanych literałów łańcuchowych (od Python 3.6, 2016-12-23) można to zapisać jako
import datetime
f"{datetime.datetime.now():%Y-%m-%d}"
>>> '2017-06-15'
Lokalizacja
Daty mogą automatycznie dostosowywać się do lokalnego języka i kultury, jeśli użyjesz ich we właściwy sposób, ale jest to trochę skomplikowane. Może inne pytanie dotyczące SO (przepełnienie stosu) ;-)
str()
(do każdego elementu listy), ponieważ właśnie toprint
pośrednio zrobiło z twoimtoday
obiektem solo .