TẠI SAO: ngày là đối tượng
Trong Python, ngày là đối tượng. Do đó, khi bạn thao tác với chúng, bạn thao tác với các đối tượng, không phải chuỗi, không phải dấu thời gian cũng như bất cứ điều gì.
Bất kỳ đối tượng nào trong Python đều có biểu diễn chuỗi TWO:
Biểu diễn thông thường được sử dụng bởi "in", có thể được sử dụng str()
hàm. Đây là phần lớn định dạng phổ biến nhất của con người và được sử dụng để dễ dàng hiển thị. Vì vậy, str(datetime.datetime(2008, 11, 22, 19, 53, 42))
cung cấp cho bạn '2008-11-22 19:53:42'
.
Biểu diễn thay thế được sử dụng để thể hiện bản chất đối tượng (dưới dạng dữ liệu). Nó có thể được sử dụng repr()
chức năng và thuận tiện để biết loại dữ liệu nào bạn thao tác trong khi bạn đang phát triển hoặc gỡ lỗi. repr(datetime.datetime(2008, 11, 22, 19, 53, 42))
mang đến cho bạn 'datetime.datetime(2008, 11, 22, 19, 53, 42)'
.
Điều gì đã xảy ra là khi bạn đã in ngày bằng cách sử dụng "in", nó được sử dụng str()
để bạn có thể thấy một chuỗi ngày đẹp. Nhưng khi bạn đã in mylist
, bạn đã in một danh sách các đối tượng và Python đã cố gắng biểu diễn tập dữ liệu bằng cách sử dụng repr()
.
Làm thế nào: bạn muốn làm gì với điều đó?
Chà, khi bạn thao túng ngày tháng, hãy tiếp tục sử dụng các đối tượng ngày dài. Họ đã nhận được hàng ngàn phương thức hữu ích và hầu hết API Python dự kiến ngày sẽ là đối tượng.
Khi bạn muốn hiển thị chúng, chỉ cần sử dụng str()
. Trong Python, thực hành tốt là bỏ tất cả mọi thứ. Vì vậy, ngay khi đến lúc in, hãy lấy một chuỗi đại diện cho ngày của bạn bằng cách sử dụng str(date)
.
Một điều cuối cùng. Khi bạn cố in ngày, bạn đã in mylist
. Nếu bạn muốn in một ngày, bạn phải in các đối tượng ngày, không phải thùng chứa của chúng (danh sách).
EG, bạn muốn in tất cả các ngày trong một danh sách:
for date in mylist :
print str(date)
Lưu ý rằng trong trường hợp cụ thể đó , bạn thậm chí có thể bỏ qua str()
vì in sẽ sử dụng nó cho bạn. Nhưng nó không nên trở thành thói quen :-)
Trường hợp thực tế, sử dụng mã của bạn
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
Định dạng ngày nâng cao
Ngày có một đại diện mặc định, nhưng bạn có thể muốn in chúng theo một định dạng cụ thể. Trong trường hợp đó, bạn có thể nhận được một biểu diễn chuỗi tùy chỉnh bằng strftime()
phương thức.
strftime()
mong đợi một mẫu chuỗi giải thích cách bạn muốn định dạng ngày của bạn.
VÍ DỤ :
print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'
Tất cả các chữ cái sau một "%"
đại diện cho một định dạng cho một cái gì đó:
%d
là số ngày
%m
là số tháng
%b
là chữ viết tắt của tháng
%y
là năm cuối cùng của hai chữ số
%Y
là cả năm
Vân vân
Hãy xem tài liệu chính thức hoặc tài liệu tham khảo nhanh của McCutchen mà bạn không thể biết tất cả.
Kể từ PEP3101 , mọi đối tượng có thể có định dạng riêng được sử dụng tự động theo định dạng phương thức của bất kỳ chuỗi nào. Trong trường hợp của datetime, định dạng tương tự được sử dụng trong strftime Vì vậy, bạn có thể làm tương tự như trên như thế này:
print "We are the {:%d, %b %Y}".format(today)
>>> 'We are the 22, Nov 2008'
Ưu điểm của hình thức này là bạn cũng có thể chuyển đổi các đối tượng khác cùng một lúc.
Với việc giới thiệu các chuỗi ký tự được định dạng (kể từ Python 3.6, 2016-12-23), điều này có thể được viết là
import datetime
f"{datetime.datetime.now():%Y-%m-%d}"
>>> '2017-06-15'
Bản địa hóa
Ngày có thể tự động thích ứng với ngôn ngữ và văn hóa địa phương nếu bạn sử dụng chúng đúng cách, nhưng nó hơi phức tạp. Có thể cho một câu hỏi khác về SO (Stack Overflow) ;-)
str()
(cho từng yếu tố của danh sách), vì đó chỉ là những gìprint
ngầm làm chotoday
đối tượng solo của bạn .