Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 55

DATETIME~OR~PYTHON

VIETNAMSE.

1
datetime— Các loại ngày và giờ cơ bản
Mã nguồn: Lib/datetime.py

Mô datetime-đun cung cấp các lớp để thao tác ngày và giờ.


Mặc dù số học ngày và giờ được hỗ trợ, trọng tâm của việc triển khai là trích xuất
thuộc tính hiệu quả để định dạng và thao tác đầu ra.

Các đối tượng nhận biết và ngây thơ


Các đối tượng ngày và giờ có thể được phân loại là "nhận biết" hoặc "ngây thơ" tùy thuộc
vào việc chúng có bao gồm thông tin múi giờ hay không.
Với kiến thức đầy đủ về các điều chỉnh thời gian chính trị và thuật toán hiện hành, chẳng hạn
như múi giờ và thông tin về thời gian tiết kiệm ánh sáng ban ngày, một đối tượng nhận biết
có thể định vị chính nó so với các đối tượng nhận biết khác. Một đối tượng nhận thức đại
diện cho một thời điểm cụ thể không thể giải thích được. 1
Một đối tượng ngây thơ không chứa đủ thông tin để định vị chính nó một cách rõ ràng so với
các đối tượng ngày/giờ khác. Việc một đối tượng ngây thơ đại diện cho Giờ phối hợp quốc tế
(UTC), giờ địa phương hay thời gian ở một số múi giờ khác hoàn toàn phụ thuộc vào chương
trình, giống như việc một số cụ thể đại diện cho mét, dặm hay khối lượng hay không là tùy
thuộc vào chương trình. Các đối tượng ngây thơ rất dễ hiểu và dễ làm việc với cái giá phải trả
là bỏ qua một số khía cạnh của thực tế.
Đối với các ứng dụng yêu cầu các đối tượng nhận biết datetimevà time các đối tượng có
thuộc tính thông tin múi giờ tùy chọn, tzinfocó thể được đặt thành một thể hiện của một lớp
con của tzinfolớp trừu tượng. Các đối tượng này tzinfonắm bắt thông tin về độ lệch so
với thời gian UTC, tên múi giờ và liệu thời gian tiết kiệm ánh sáng ban ngày có hiệu lực hay
không.
Chỉ có một tzinfolớp cụ thể, timezonelớp, được cung cấp bởi datetimemô-đun. Lớp này
timezonecó thể biểu thị các múi giờ đơn giản với độ lệch cố định từ UTC, chẳng hạn như
chính UTC hoặc các múi giờ EST và EDT của Bắc Mỹ. Việc hỗ trợ các múi giờ ở mức độ chi
tiết sâu hơn tùy thuộc vào ứng dụng. Các quy tắc điều chỉnh thời gian trên toàn thế giới mang
tính chính trị hơn là hợp lý, thay đổi thường xuyên và không có tiêu chuẩn nào phù hợp cho
mọi ứng dụng ngoài UTC.

Hằng số
Mô datetime-đun xuất các hằng số sau:

2
datetime.MINYEAR¶
Số năm nhỏ nhất được phép trong một datehoặc datetimeđối tượng. MINYEARlà 1.

datetime.MAXYEAR¶
Số năm lớn nhất được phép trong một datehoặc datetimeđối tượng. MAXYEARlà
9999.

datetime.UTC¶
Bí danh cho múi giờ UTC singleton datetime.timezone.utc.
Mới trong phiên bản 3.11.

Các loại có sẵn

class datetime.date
Một ngày ngây thơ được lý tưởng hóa, giả sử lịch Gregorian hiện tại
luôn có hiệu lực. Các thuộc tính: year, month, và day.
class datetime.time
Thời gian lý tưởng hóa, không phụ thuộc vào bất kỳ ngày cụ thể nào,
giả sử rằng mỗi ngày có chính xác 24*60*60 giây. (Không có khái niệm
về “giây nhuận” ở đây.) Các thuộc tính: hour, minute, second,
microsecond, và tzinfo.

class datetime.datetime
Một sự kết hợp của một ngày và một thời gian. Thuộc tính: year,
month, day, hour, minute, second, microsecond, và tzinfo.

class datetime.timedelta
Khoảng thời gian thể hiện sự khác biệt giữa hai date, timehoặc
datetimephiên bản đối với độ phân giải micro giây.

class datetime.tzinfo
Một lớp cơ sở trừu tượng cho các đối tượng thông tin múi giờ. Chúng
được sử dụng bởi các lớp datetimevà timeđể cung cấp khái niệm điều
chỉnh thời gian có thể tùy chỉnh (ví dụ: để tính đến múi giờ và/hoặc
thời gian tiết kiệm ánh sáng ban ngày).
class datetime.timezone

3
Một lớp triển khai tzinfolớp cơ sở trừu tượng dưới dạng phần bù cố
định từ UTC.
Mới trong phiên bản 3.2.
Các đối tượng của các loại này là bất biến.
Mối quan hệ của các lớp con:
object
timedelta
tzinfo
timezone
time
date
datetime

Thuộc tính chung


Các date, datetime, timevà timezonecác loại chia sẻ các tính năng phổ biến sau:

 Các đối tượng của các loại này là bất biến.


 Các đối tượng thuộc loại này có thể băm được , nghĩa là chúng có thể được sử dụng
làm khóa từ điển.
 Các đối tượng thuộc loại này hỗ trợ tẩy hiệu quả thông qua picklemô-đun.

Xác định xem một đối tượng là nhận thức hay ngây thơ
Các đối tượng thuộc dateloại luôn ngây thơ.
Một đối tượng thuộc loại timehoặc datetimecó thể nhận thức hoặc ngây thơ.
Một datetimeđối tượng d nhận biết nếu cả hai điều sau đây đều đúng:
1. d.tzinfokhông phảiNone
2. d.tzinfo.utcoffset(d)không trở lạiNone

Mặt khác, d là ngây thơ.


Một timeđối tượng t nhận biết nếu cả hai điều sau đây đều đúng:
3. t.tzinfokhông phảiNone
4. t.tzinfo.utcoffset(None)không trở lại None.
Nếu không, t là ngây thơ.
Sự khác biệt giữa nhận thức và ngây thơ không áp dụng cho timedelta các đối tượng.

timedeltaĐối tượng

Một timedeltađối tượng đại diện cho một khoảng thời gian, sự khác biệt giữa hai ngày
hoặc thời gian.

4
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0,
minutes=0, hours=0, weeks=0)
ngày giờ của lớp . timedelta ( ngày = 0 , giây = 0 , micro giây =
0 , mili giây = 0 , phút = 0 , giờ = 0 , tuần = 0 )
Tất cả các đối số là tùy chọn và mặc định là 0. Các đối số có thể là
số nguyên hoặc số float và có thể dương hoặc âm.
Chỉ ngày , giây và micro giây được lưu trữ nội bộ. Các đối số được
chuyển đổi thành các đơn vị đó:
o Một phần nghìn giây được chuyển đổi thành 1000 micro
giây.
o Một phút được chuyển thành 60 giây.
o Một giờ được chuyển đổi thành 3600 giây.
o Một tuần được chuyển đổi thành 7 ngày.

 và ngày, giây và micro giây sau đó được chuẩn hóa để biểu diễn
là duy nhất, với
o 0 <= microseconds < 1000000
o 0 <= seconds < 3600*24(số giây trong một ngày)
o -999999999 <= days <= 999999999

 Ví dụ sau đây minh họa cách bất kỳ đối số nào ngoài days ,
seconds và microseconds được “hợp nhất” và chuẩn hóa thành ba
thuộc tính kết quả đó:
 >>>>>> from datetime import timedelta
>>> delta = timedelta(
... days=50,
... seconds=27,
... microseconds=10,
... milliseconds=29000,
... minutes=5,
... hours=8,
... weeks=2
... )
>>> # Only days, seconds, and microseconds remain
>>> delta
datetime.timedelta(days=64, seconds=29156, microseconds=10)

 Nếu bất kỳ đối số nào là số float và có micro giây phân số,


thì micro giây phân số còn lại từ tất cả các đối số sẽ được
kết hợp và tổng của chúng được làm tròn đến micro giây gần
nhất bằng cách sử dụng bộ ngắt kết nối nửa vòng đến chẵn. Nếu
không có đối số nào là float, quá trình chuyển đổi và chuẩn
hóa là chính xác (không có thông tin nào bị mất).

5
 Nếu giá trị chuẩn hóa của ngày nằm ngoài phạm vi được chỉ
định, OverflowErrorsẽ được nâng lên.

 Lưu ý rằng việc chuẩn hóa các giá trị âm lúc đầu có thể gây
ngạc nhiên. Ví dụ:
 >>>>>> from datetime import timedelta
>>> d = timedelta(microseconds=-1)
>>> (d.days, d.seconds, d.microseconds)
(-1, 86399, 999999)

Thuộc tính lớp:

timedelta.min
timedeltaĐối tượng tiêu cực nhất , timedelta(-999999999).

timedelta.max¶
timedeltaĐối tượng tích cực nhất , .timedelta(days=999999999,
hours=23, minutes=59, seconds=59, microseconds=999999)

timedelta.resolution
timedeltaSự khác biệt nhỏ nhất có thể giữa các đối tượng không bằng
nhau , timedelta(microseconds=1).

Lưu ý rằng, do chuẩn hóa, timedelta.max> -timedelta.min. -


timedelta.maxkhông thể biểu diễn như một timedeltađối tượng.

Thuộc tính sơ thẩm (chỉ đọc):

Thuộc tính Giá trị


days Giữa -999999999 và bao gồm cả 999999999
seconds Bao gồm từ 0 đến 86399
microseconds Bao gồm từ 0 đến 999999
Hoạt động được hỗ trợ:

Hoạt động Kết quả


Tổng của t2 và t3 . Sau đó t1 - t2 == t3 và t1 - t3
t1 = t2 + t3
== t2 là đúng. (1)
Sự khác biệt của t2 và t3 . Sau đó t1 == t2 - t3
t1 = t2 - t3
và t2 == t1 + t3 là đúng. (1)(6)
Delta nhân với một số nguyên. Sau đó t1 // i ==
t1 = t2 * i or t1 = i * t2
t2 là đúng, miễn là .i != 0
Nói chung, t1 * i == t1 * (i-1) + t1 là đúng. (1)
Delta nhân với một số float. Kết quả được làm
tròn đến bội số gần nhất của
t1 = t2 * f or t1 = f * t2
timedelta.resolution bằng cách sử dụng nửa-
chẵn.

6
Chia (3) tổng thời lượng t2 cho đơn vị khoảng
f = t2 / t3
thời gian t3 . Trả về một float đối tượng.
Delta chia cho số float hoặc int. Kết quả được
làm tròn đến bội số gần nhất của
t1 = t2 / f or t1 = t2 / i
timedelta.resolution bằng cách sử dụng nửa-
chẵn.
Sàn được tính toán và phần còn lại (nếu có) bị
t1 = t2 // ihoặc t1 = t2 // t3 loại bỏ. Trong trường hợp thứ hai, một số
nguyên được trả về. (3)
Phần còn lại được tính như một
t1 = t2 % t3
timedeltađối tượng. (3)
Tính thương và số dư: (3) và . q là một số
q, r = divmod(t1, t2) nguyên và r là một đối tượng.q = t1 //
t2r = t1 % t2timedelta
Trả về một timedeltađối tượng có cùng giá
+t1
trị. (2)
tương đương với timedelta(- t1.days , -
-t1
t1.seconds , - t1.microseconds ) và t1 * -1. (1)(4)
tương đương với + t khi , và với - t khi .
abs(t)
(2)t.days >= 0t.days < 0
Trả về một chuỗi ở dạng , trong đó D là âm cho
str(t) âm . (5)[D day[s], ]
[H]H:MM:SS[.UUUUUU]t
Trả về một biểu diễn chuỗi của timedeltađối
repr(t) tượng dưới dạng lệnh gọi hàm tạo với các giá
trị thuộc tính chuẩn.
Ghi chú:
5. Điều này là chính xác nhưng có thể tràn.
6. Điều này là chính xác và không thể tràn.
7. Chia cho 0 tăng ZeroDivisionError.
8. - timedelta.max không thể biểu diễn dưới dạng timedeltađối
tượng.
9. Biểu diễn chuỗi của timedeltacác đối tượng được chuẩn hóa tương
tự như biểu diễn bên trong của chúng. Điều này dẫn đến kết quả
hơi bất thường đối với timedelta âm. Ví dụ:
10. >>>>>> timedelta(hours=-5)
datetime.timedelta(days=-1, seconds=68400)
>>> print(_)
-1 day, 19:00:00

11. Biểu thức sẽ luôn bằng biểu thức trừ khi t3 bằng ; trong
trường hợp đó, cái trước sẽ tạo ra kết quả trong khi cái sau
sẽ tràn.t2 - t3t2 + (-t3)timedelta.max
Ngoài các hoạt động được liệt kê ở trên, timedeltacác đối tượng hỗ
trợ các phép cộng và phép trừ nhất định với datevà datetime các đối
tượng (xem bên dưới).

7
Đã thay đổi trong phiên bản 3.2: Giờ đây hỗ trợ phép chia tầng và
phép chia thực của một timedeltađối tượng cho một đối tượng khác ,
cũng như các phép toán còn lại và hàm. Phép chia thực sự và phép
nhân của một đối tượng với một đối tượng hiện đã được hỗ
trợ.timedeltadivmod()timedeltafloat
So sánh timedeltacác đối tượng được hỗ trợ, với một số cảnh báo.
Các phép so sánh ==hoặc != luôn trả về a bool, bất kể loại đối tượng
được so sánh là gì:
>>>>>> from datetime import timedelta
>>> delta1 = timedelta(seconds=57)
>>> delta2 = timedelta(hours=25, seconds=2)
>>> delta2 != delta1
True
>>> delta2 == 5
False

Đối với tất cả các phép so sánh khác (chẳng hạn như <và >), khi một
timedelta đối tượng được so sánh với một đối tượng thuộc loại khác,
TypeError sẽ được nêu ra:

>>>>>> delta2 > delta1


True
>>> delta2 > 5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '>' not supported between instances of 'datetime.timedelta'
and 'int'

In Boolean contexts, a timedelta object is considered to be true if


and only if it isn’t equal to timedelta(0).
Phương thức sơ thẩm:
timedelta.total_seconds()
Trả về tổng số giây có trong khoảng thời gian. Tương đương với td /
timedelta(giây=1). Đối với các đơn vị khoảng cách không phải là giây, hãy
sử dụng trực tiếp biểu mẫu phân chia (ví dụ: td /
timedelta(microseconds=1)).
Lưu ý rằng đối với các khoảng thời gian rất lớn (hơn 270 năm trên hầu hết các nền
tảng), phương pháp này sẽ mất đi độ chính xác của phần triệu giây.

Mới trong phiên bản 3.2.

8
Ví dụ về cách sử dụng: timedelta
Một ví dụ bổ sung về chuẩn hóa:

>>>>>> # Components of another_year add up to exactly 365 days


>>> from datetime import timedelta
>>> year = timedelta(days=365)
>>> another_year = timedelta(weeks=40, days=84, hours=23,
... minutes=50, seconds=600)
>>> year == another_year
True
>>> year.total_seconds()
31536000.0

Ví dụ về timedeltasố học:

>>>>>> from datetime import timedelta


>>> year = timedelta(days=365)
>>> ten_years = 10 * year
>>> ten_years
datetime.timedelta(days=3650)
>>> ten_years.days // 365
10
>>> nine_years = ten_years - year
>>> nine_years
datetime.timedelta(days=3285)
>>> three_years = nine_years // 3
>>> three_years, three_years.days // 365
(datetime.timedelta(days=1095), 3)

date Objects
Một dateđối tượng đại diện cho một ngày (năm, tháng và ngày) trong lịch lý tưởng
hóa, lịch Gregorian hiện tại được mở rộng vô thời hạn theo cả hai hướng.

Ngày 1 tháng 1 của năm 1 được gọi là ngày 1, ngày 2 tháng 1 của năm 1 được gọi là
ngày 2, v.v. 2

class datetime.date(year, month, day)


ngày giờ của lớp . ngày ( năm , tháng , ngày )
Tất cả các đối số là bắt buộc. Các đối số phải là số nguyên, trong
các phạm vi sau:
o MINYEAR <= year <= MAXYEAR
o 1 <= month <= 12
o 1 <= day <= number of days in the given month and year

9
 Nếu một đối số nằm ngoài các phạm vi đó được đưa ra,
ValueErrorsẽ được nêu ra.

Các hàm tạo khác, tất cả các phương thức của lớp:

classmethod date.today()

Trả về ngày địa phương hiện tại.

Điều này tương đương với date.fromtimestamp(time.time()).


classmethod date.fromordinal(ordinal)¶
ngày phương pháp lớp học . fromtimestamp ( dấu thời gian )
Trả về ngày địa phương tương ứng với dấu thời gian POSIX, chẳng hạn
như được trả về bởi time.time().
Điều này có thể tăng OverflowError, nếu dấu thời gian nằm ngoài phạm
vi giá trị được localtime() chức năng nền tảng C hỗ trợ và OSErrorkhi
localtime()không thành công. Điều này thường bị giới hạn trong các
năm từ 1970 đến 2038. Lưu ý rằng trên các hệ thống không phải POSIX
bao gồm các giây nhuận trong khái niệm dấu thời gian, các giây nhuận
bị bỏ qua bởi fromtimestamp().
Đã thay đổi trong phiên bản 3.3: Tăng OverflowErrorthay vì
ValueErrornếu dấu thời gian nằm ngoài phạm vi giá trị được
localtime()chức năng nền tảng C hỗ trợ. Nâng cao OSErrorthay vì
ValueErrorthất localtime()bại.

classmethod date.fromisoformat(date_string)¶
ngày phương pháp lớp học . từ thứ tự ( thứ tự )
Trả về ngày tương ứng với thứ tự Gregorian proleptic, trong đó ngày
1 tháng 1 của năm 1 có thứ tự 1.

ValueError được nâng lên trừ khi 1 <= thứ tự <= date.max.toordinal(). Đối
với bất kỳ ngày d nào, date.fromordinal(d.toordinal()) == d.
classmethod date.fromisocalendar(year, week, day)

Trả về một ngày tương ứng với một date_string được cung cấp ở bất kỳ
định dạng ISO 8601 hợp lệ nào, ngoại trừ các ngày thứ tự (ví dụ: YYYY-
DDD):

New in version 3.8.

10
Date.min
Ngày đại diện sớm nhất, .date(MINYEAR, 1, 1)
Date.max
Ngày đại diện mới nhất, .date(MAXYEAR, 12, 31)
date.resolution¶
Sự khác biệt nhỏ nhất có thể giữa các đối tượng ngày không bằng
nhau, timedelta(days=1).
Thuộc tính sơ thẩm (chỉ đọc):
date.year¶
Giữa MINYEARvà MAXYEARbao gồm.
date.month¶
Từ 1 đến 12 bao gồm.
date.day¶
Giữa 1 và số ngày trong tháng nhất định của năm nhất định.
Hoạt động được hỗ trợ:

Hoạt động Kết quả


date2 sẽ là timedelta.daysngày sau date1 .
date2 = date1 + timedelta
(1)
Tính date2 sao cho . (2)date2 + timedelta
date2 = date1 - timedelta
== date1
timedelta = date1 - date2 (3)
date1 được coi là nhỏ hơn date2 khi date1
date1 < date2
đứng trước date2 về mặt thời gian. (4)
Ghi chú:
1. date2 được di chuyển về phía trước theo thời gian nếu hoặc lùi
lại nếu . Sau đó . và được bỏ qua. được nâng lên nếu sẽ nhỏ
hơn hoặc lớn hơn .timedelta.days > 0timedelta.days < 0date2 -
date1 ==
timedelta.daystimedelta.secondstimedelta.microsecondsOverflowErro
rdate2.yearMINYEARMAXYEAR
2. timedelta.secondsvà timedelta.microsecondsđược bỏ qua.
3. Điều này là chính xác và không thể tràn. timedelta.seconds và
timedelta.microseconds là 0 và date2 + timedelta == date1 sau
đó.
4. Nói cách khác, nếu và chỉ nếu . So sánh ngày tăng lên nếu so
sánh khác cũng không phải là một đối tượng. Tuy nhiên, thay
vào đó, được trả về nếu đối tượng so sánh khác có thuộc tính.
Móc này cung cấp cho các loại đối tượng ngày khác cơ hội thực
hiện so sánh kiểu hỗn hợp. Nếu không, khi một đối tượng được
so sánh với một đối tượng thuộc loại khác, sẽ được nâng lên
trừ khi phép so sánh là hoặc . Các trường hợp sau trả về

11
hoặc , tương ứng.date1 < date2date1.toordinal() <
date2.toordinal()TypeErrordateNotImplementedtimetuple()dateTypeEr
ror==!=FalseTrue

Trong ngữ cảnh Boolean, tất cả datecác đối tượng được coi là đúng.
Phương thức sơ thẩm:
date.replace(year=self.year, month=self.month, day=self.day)
date.timetuple()¶
Trả lại một time.struct_timeví dụ như được trả về bởi
time.localtime().

Giờ, phút và giây là 0 và cờ DST là -1.


d.timetuple()tương đương với:

time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -


1))

trong đó yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1 là số ngày


trong năm hiện tại bắt đầu bằng 1 cho ngày 1 tháng 1.
date.toordinal()
Trả về thứ tự Gregorian proleptic của ngày, trong đó ngày 1 tháng 1
của năm 1 có thứ tự 1. Đối với mọi dateđối tượng
d , .date.fromordinal(d.toordinal()) == d
date.weekday()

Trả về ngày trong tuần dưới dạng số nguyên, trong đó Thứ Hai là 0 và Chủ
nhật là 6. Ví dụ: date(2002, 12, 4).weekday() == 2, a Thứ Tư. Xem thêm
isoweekday().
date.isoweekday()

Trả về ngày trong tuần dưới dạng số nguyên, trong đó Thứ Hai là 1 và Chủ
Nhật là 7. Ví dụ: date(2002, 12, 4).isoweekday() == 3, a Thứ Tư. Xem thêm
ngày trong tuần(), isocalWiki().
date.isocalendar()¶
Trả về một đối tượng tuple được đặt tên với ba thành phần: year,
weekvà weekday.

Lịch ISO là một biến thể được sử dụng rộng rãi của lịch Gregorian. 3
Năm ISO bao gồm 52 hoặc 53 tuần đầy đủ và trong đó một tuần bắt đầu
vào Thứ Hai và kết thúc vào Chủ nhật. Tuần đầu tiên của một năm ISO
là tuần dương lịch (Gregorian) đầu tiên của một năm có Thứ Năm. Đây
được gọi là tuần số 1 và năm ISO của ngày thứ Năm đó giống với năm
Gregorian của nó.

12
Ví dụ: năm 2004 bắt đầu vào Thứ Năm, vì vậy tuần đầu tiên của năm
ISO 2004 bắt đầu vào Thứ Hai, ngày 29 tháng 12 năm 2003 và kết thúc
vào Chủ Nhật, ngày 4 tháng 1 năm 2004:
>>>>>> from datetime import date
>>> date(2003, 12, 29).isocalendar()
datetime.IsoCalendarDate(year=2004, week=1, weekday=1)
>>> date(2004, 1, 4).isocalendar()
datetime.IsoCalendarDate(year=2004, week=1, weekday=7)

Đã thay đổi trong phiên bản 3.9: Kết quả đã thay đổi từ một bộ thành
một bộ có tên .

date.isoformat()¶
Trả về một chuỗi đại diện cho ngày ở định dạng ISO 8601, YYYY-MM-DD:
>>>>>> from datetime import date
>>> date(2002, 12, 4).isoformat()
'2002-12-04'

date.__str__()
Đối với một ngày d , str(d)tương đương với d.isoformat().

date.ctime()¶
Trả về một chuỗi đại diện cho ngày:
>>>>>> from datetime import date
>>> date(2002, 12, 4).ctime()
'Wed Dec 4 00:00:00 2002'

d.ctime()tương đương với:

time.ctime(time.mktime(d.timetuple()))

trên các nền tảng nơi hàm C gốc ctime()(có time.ctime()thể gọi nhưng
date.ctime()không gọi) tuân theo tiêu chuẩn C.

date.strftime(format)¶
Trả về một chuỗi đại diện cho ngày, được kiểm soát bởi một chuỗi
định dạng rõ ràng. Mã định dạng đề cập đến giờ, phút hoặc giây sẽ
thấy giá trị 0. Để biết danh sách đầy đủ các chỉ thị định dạng, hãy
xem hành vi strftime() và strptime() .

13
date.__format__(format)¶
Tương tự như date.strftime(). Điều này giúp có thể chỉ định một chuỗi
định dạng cho một dateđối tượng bằng các ký tự chuỗi được định dạng
và khi sử dụng str.format(). Để biết danh sách đầy đủ các chỉ thị
định dạng, hãy xem hành vi strftime() và strptime() .

Ví dụ về cách sử dụng: date


Ví dụ về đếm số ngày cho một sự kiện:
>>>>>> import time
>>> from datetime import date
>>> today = date.today()
>>> today
datetime.date(2007, 12, 5)
>>> today == date.fromtimestamp(time.time())
True
>>> my_birthday = date(today.year, 6, 24)
>>> if my_birthday < today:
... my_birthday = my_birthday.replace(year=today.year + 1)
>>> my_birthday
datetime.date(2008, 6, 24)
>>> time_to_birthday = abs(my_birthday - today)
>>> time_to_birthday.days
202

Thêm ví dụ về cách làm việc với date:


>>>>>> from datetime import date
>>> d = date.fromordinal(730920) # 730920th day after 1. 1. 0001
>>> d
datetime.date(2002, 3, 11)

>>> # Methods related to formatting string output


>>> d.isoformat()
'2002-03-11'
>>> d.strftime("%d/%m/%y")
'11/03/02'
>>> d.strftime("%A %d. %B %Y")
'Monday 11. March 2002'
>>> d.ctime()
'Mon Mar 11 00:00:00 2002'
>>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, "day", "month")
'The day is 11, the month is March.'

>>> # Methods for to extracting 'components' under different calendars


>>> t = d.timetuple()

14
>>> for i in t:
... print(i)
2002 # year
3 # month
11 # day
0
0
0
0 # weekday (0 = Monday)
70 # 70th day in the year
-1
>>> ic = d.isocalendar()
>>> for i in ic:
... print(i)
2002 # ISO year
11 # ISO week number
1 # ISO day number ( 1 = Monday )

>>> # A date object is immutable; all operations produce a new object


>>> d.replace(year=2005)
datetime.date(2005, 3, 11)

datetimeĐối tượng
Một datetimeđối tượng là một đối tượng duy nhất chứa tất cả thông
tin từ một dateđối tượng và một timeđối tượng.
Giống như một dateđối tượng, datetimegiả sử lịch Gregorian hiện tại
được mở rộng theo cả hai hướng; giống như một timeđối tượng,
datetimegiả sử có chính xác 3600*24 giây mỗi ngày.

Người xây dựng:


class datetime.datetime(year, month, day, hour=0, minute=0,
second=0, microsecond=0, tzinfo=None, *, fold=0)
ngày giờ của lớp . ngày giờ ( năm , tháng , ngày , giờ = 0 , phút =
0 , giây = 0 , micro giây = 0 , tzinfo = Không , * , gấp = 0 )
Các đối số năm , tháng và ngày là bắt buộc. tzinfo có thể là
Nonehoặc một thể hiện của một tzinfolớp con. Các đối số còn lại phải
là số nguyên trong các phạm vi sau:
o MINYEAR <= year <= MAXYEAR,
o 1 <= month <= 12,
o 1 <= day <= number of days in the given month and year,
o 0 <= hour < 24,
o 0 <= minute < 60,
o 0 <= second < 60,

15
o 0 <= microsecond < 1000000,
o fold in [0, 1].

 Nếu một đối số nằm ngoài các phạm vi đó được đưa ra,
ValueErrorsẽ được nêu ra.

 Mới trong phiên bản 3.6: Đã thêm foldđối số.


Các hàm tạo khác, tất cả các phương thức của lớp:
classmethod datetime.today()
Trả về thời gian địa phương hiện tại, với . tzinfo None
Tương đương với:
datetime.fromtimestamp(time.time())

Xem thêm now(), fromtimestamp().


Phương thức này có chức năng tương đương với now(), nhưng không có
tztham số.

classmethod datetime.now(tz=None)
Nếu đối số tùy chọn tz được None chỉ định hoặc không được chỉ định,
thì điều này giống như today(), nhưng, nếu có thể, cung cấp độ chính
xác cao hơn mức có thể nhận được khi đi qua dấu time.time()thời gian
(ví dụ: điều này có thể thực hiện được trên các nền tảng cung cấp
gettimeofday()chức năng C).

Nếu tz không phải là None, thì nó phải là một thể hiện của một
tzinfolớp con và ngày giờ hiện tại được chuyển đổi thành múi giờ của
tz .
Chức năng này được ưa thích hơn today()và utcnow().
classmethod datetime.utcnow()
Trả về ngày và giờ UTC hiện tại, với . tzinfo None
Điều này giống như now(), nhưng trả về ngày và giờ UTC hiện tại,
dưới dạng một datetimeđối tượng ngây thơ. Có thể nhận được thời gian
UTC hiện tại đã biết bằng cách gọi datetime.now(timezone.utc). Xem
thêm now().
Cảnh báo

Bởi vì datetimecác đối tượng ngây thơ được nhiều datetimephương pháp
coi là giờ địa phương, nên sử dụng thời gian nhận thức để biểu thị
thời gian trong UTC. Do đó, cách được đề xuất để tạo một đối tượng

16
biểu thị thời gian hiện tại trong UTC là gọi
datetime.now(timezone.utc).

classmethod datetime.fromtimestamp(timestamp, tz=None)¶


Trả về ngày và giờ cục bộ tương ứng với dấu thời gian POSIX, chẳng
hạn như được trả về bởi time.time(). Nếu đối số tùy chọn tz được
Nonechỉ định hoặc không được chỉ định, dấu thời gian sẽ được chuyển
đổi thành ngày giờ địa phương của nền tảng và datetimeđối tượng được
trả về là ngây thơ.
Nếu tz không phải là None, nó phải là một thể hiện của tzinfolớp con
và dấu thời gian được chuyển đổi thành múi giờ của tz .
fromtimestamp()có thể tăng OverflowError, nếu dấu thời gian nằm ngoài
phạm vi giá trị được nền tảng C localtime()hoặc gmtime()các chức năng
hỗ trợ và OSErrorbật localtime()hoặc gmtime()không thành công. Điều
này thường bị giới hạn trong các năm từ 1970 đến 2038. Lưu ý rằng
trên các hệ thống không phải POSIX bao gồm các giây nhuận trong khái
niệm về dấu thời gian, các giây nhuận bị bỏ qua và sau đó có thể có
hai dấu thời gian khác nhau một fromtimestamp()giây mang lại
datetimecác đối tượng giống hệt nhau. Phương pháp này được ưa thích
hơn utcfromtimestamp().
Đã thay đổi trong phiên bản 3.3: Tăng OverflowErrorthay vì
ValueErrornếu dấu thời gian nằm ngoài phạm vi giá trị được nền tảng
C localtime()hoặc gmtime()các hàm hỗ trợ. Tăng OSError thay vì
ValueErrortrên localtime()hoặc gmtime() thất bại.

Đã thay đổi trong phiên bản 3.6: fromtimestamp() có thể trả về các
phiên bản được foldđặt thành 1.
phương thức lớp ngày giờ. utcfromtimestamp ( dấu thời gian )
Trả về UTC datetimetương ứng với dấu thời gian POSIX, với . (Đối
tượng kết quả là ngây thơ.)tzinfo None
Điều này có thể tăng OverflowError, nếu dấu thời gian nằm ngoài phạm
vi giá trị được gmtime()chức năng nền tảng C hỗ trợ và OSErrorkhi
gmtime()không thành công. Điều này thường bị giới hạn trong các năm
từ 1970 đến 2038.
Để có được một datetimeđối tượng nhận biết, hãy gọi fromtimestamp():
datetime.fromtimestamp(timestamp, timezone.utc)

Trên nền tảng tuân thủ POSIX, nó tương đương với biểu thức sau:
datetime(1970, 1, 1, tzinfo=timezone.utc) +
timedelta(seconds=timestamp)

17
ngoại trừ công thức sau luôn hỗ trợ phạm vi năm đầy đủ: giữa
MINYEARvà MAXYEARbao gồm.

Cảnh báo

Bởi vì datetimecác đối tượng ngây thơ được nhiều datetimephương pháp
coi là giờ địa phương, nên sử dụng thời gian nhận thức để biểu thị
thời gian trong UTC. Do đó, cách được đề xuất để tạo đối tượng đại
diện cho dấu thời gian cụ thể trong UTC là
gọi .datetime.fromtimestamp(timestamp, tz=timezone.utc)
Đã thay đổi trong phiên bản 3.3: Tăng OverflowErrorthay vì
ValueErrornếu dấu thời gian nằm ngoài phạm vi giá trị được
gmtime()chức năng nền tảng C hỗ trợ. Nâng cao OSErrorthay vì
ValueErrorthất gmtime()bại.

classmethod datetime.utcfromtimestamp(timestamp)
Trả về datetimetương ứng với thứ tự Gregorian proleptic, trong đó
ngày 1 tháng 1 của năm 1 có thứ tự 1. ValueErrorđược nâng lên trừ
khi . Giờ, phút, giây và micro giây của kết quả đều bằng 0 và là . 1
<= ordinal <= datetime.max.toordinal()tzinfoNone

classmethod datetime.fromordinal(ordinal)¶
Trả về ngày giờ tương ứng với thứ tự Gregorian tiên nghiệm, trong đó
ngày 1 tháng 1 của năm 1 có thứ tự 1. ValueError được tăng trừ khi 1
<= thứ tự <= datetime.max.toordinal(). Giờ, phút, giây và micro giây
của kết quả đều bằng 0 và tzinfo là Không có.
classmethod datetime.combine(date, time, tzinfo=self.tzinfo)
Trả về một đối tượng mới datetimecó thành phần ngày bằng với dateđối
tượng đã cho và thành phần thời gian bằng với timeđối tượng đã cho.
Nếu đối số tzinfo được cung cấp, thì giá trị của nó được sử dụng để
đặt tzinfothuộc tính của kết quả, nếu không thì tzinfothuộc tính của
đối số thời gian sẽ được sử dụng.

Đối với bất kỳ đối tượng ngày giờ nào d, d == datetime.combine(d.date(),


d.time(), d.tzinfo). Nếu ngày là một đối tượng datetime, các thành phần thời
gian và thuộc tính tzinfo của nó sẽ bị bỏ qua.

Đã thay đổi trong phiên bản 3.6: Đã thêm đối số tzinfo .


classmethod datetime.fromisoformat(date_string)
Trả về một datetimetương ứng với một date_string ở bất kỳ định dạng
ISO 8601 hợp lệ nào, với các ngoại lệ sau:
18
12. Độ lệch múi giờ có thể có giây phân số.
13. Dấu Tphân cách có thể được thay thế bằng bất kỳ ký tự
unicode nào.
14. Ngày thứ tự hiện không được hỗ trợ.
15. Giờ và phút phân số không được hỗ trợ.
Ví dụ:
>>>>>> from datetime import datetime
>>> datetime.fromisoformat('2011-11-04')
datetime.datetime(2011, 11, 4, 0, 0)
>>> datetime.fromisoformat('20111104')
datetime.datetime(2011, 11, 4, 0, 0)
>>> datetime.fromisoformat('2011-11-04T00:05:23')
datetime.datetime(2011, 11, 4, 0, 5, 23)
>>> datetime.fromisoformat('2011-11-04T00:05:23Z')
datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc)
>>> datetime.fromisoformat('20111104T000523')
datetime.datetime(2011, 11, 4, 0, 5, 23)
>>> datetime.fromisoformat('2011-W01-2T00:05:23.283')
datetime.datetime(2011, 1, 4, 0, 5, 23, 283000)
>>> datetime.fromisoformat('2011-11-04 00:05:23.283')
datetime.datetime(2011, 11, 4, 0, 5, 23, 283000)
>>> datetime.fromisoformat('2011-11-04 00:05:23.283+00:00')
datetime.datetime(2011, 11, 4, 0, 5, 23, 283000,
tzinfo=datetime.timezone.utc)
>>> datetime.fromisoformat('2011-11-04T00:05:23+04:00')
datetime.datetime(2011, 11, 4, 0, 5, 23,
tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))

Mới trong phiên bản 3.7.


Đã thay đổi trong phiên bản 3.11: Trước đây, phương pháp này chỉ hỗ
trợ các định dạng có thể được phát ra bởi date.isoformat()hoặc
datetime.isoformat().

classmethod datetime.fromisocalendar(year, week, day)


phương thức lớp ngày giờ. fromisocalendar ( năm , tuần , ngày )
Trả về một datetimetương ứng với ngày theo lịch ISO được chỉ định
theo năm, tuần và ngày. Các thành phần không phải ngày tháng của
ngày giờ được điền bằng các giá trị mặc định bình thường của chúng.
Đây là nghịch đảo của chức năng datetime.isocalendar().
Mới trong phiên bản 3.8.
classmethod datetime.strptime(date_string, format)

19
Trả về datetimetương ứng với date_string , được phân tích cú pháp
theo định dạng .
Điều này tương đương với:
datetime(*(time.strptime(date_string, format)[0:6]))

ValueErrorđược nâng lên nếu không thể phân tích cú pháp chuỗi ngày
và định dạng time.strptime()hoặc nếu nó trả về một giá trị không phải
là bộ thời gian. Để biết danh sách đầy đủ các chỉ thị định dạng, hãy
xem hành vi strftime() và strptime() .
Thuộc tính lớp:
datetime.min
Đại diện sớm nhất datetime, .datetime(MINYEAR, 1, 1, tzinfo=None)
datetime.max
Đại diện mới nhất datetime, .datetime(MAXYEAR, 12, 31, 23, 59, 59,
999999, tzinfo=None)
datetime.resolution
datetimeSự khác biệt nhỏ nhất có thể giữa các đối tượng không bằng
nhau , timedelta(microseconds=1).
Thuộc tính sơ thẩm (chỉ đọc):
datetime.year
ngày giờ. năm
Giữa MINYEARvà MAXYEARbao gồm.
datetime.month
ngày giờ. tháng
Từ 1 đến 12 bao gồm.
datetime.day
ngày giờ. ngày
Giữa 1 và số ngày trong tháng nhất định của năm nhất định.
Datetime.hour
ngày giờ. giờ
Trong range(24).
datetime.minute
ngày giờ. phút
20
Trong range(60).
datetime.second
ngày giờ. thứ hai
Trong range(60).

datetime.microsecond
ngày giờ. micro giây
Trong range(1000000).
datetime.tzinfo
gày giờ. tzinfo ¶
Đối tượng được truyền dưới dạng đối số tzinfo cho datetimehàm tạo
hoặc Nonenếu không có đối số nào được truyền.
datetime.fold
ngày giờ. thứ hai
Trong range(60).
ngày giờ. gấp
Trong . Được sử dụng để phân biệt thời gian tường trong một khoảng
thời gian lặp lại. (Một khoảng thời gian lặp lại xảy ra khi đồng hồ
lùi lại vào cuối giờ tiết kiệm ánh sáng ban ngày hoặc khi độ lệch
UTC cho vùng hiện tại bị giảm vì lý do chính trị.) Giá trị 0 (1)
biểu thị thời điểm sớm hơn (sau đó) trong hai thời điểm với cùng một
đại diện thời gian bức tường.[0, 1]
Mới trong phiên bản 3.6.
Hoạt động được hỗ trợ:

Hoạt động Kết quả


datetime2 = datetime1 + timedelta (1)
datetime2 = datetime1 - timedelta (2)
timedelta = datetime1 - datetime2 (3)
datetime1 < datetime2 So datetimevới datetime. (4)
1. datetime2 là khoảng thời gian của timedelta bị xóa khỏi
datetime1, tiến về phía trước nếu timedelta.days> 0 hoặc lùi
lại nếu timedelta.days< 0. Kết quả có cùng tzinfothuộc tính với
datetime đầu vào và datetime2 - datetime1 == timedelta sau đó.
OverflowErrorđược nâng lên nếu datetime2.year sẽ nhỏ hơn
MINYEARhoặc lớn hơn MAXYEAR. Lưu ý rằng không có điều chỉnh múi

21
giờ nào được thực hiện ngay cả khi đầu vào là một đối tượng
nhận biết.
2. Tính toán datetime2 sao cho datetime2 + timedelta ==
datetime1. Ngoài ra, kết quả có cùng tzinfothuộc tính với ngày
giờ đầu vào và không có điều chỉnh múi giờ nào được thực hiện
ngay cả khi đầu vào biết.
3. Phép trừ a datetimetừ a datetimechỉ được xác định nếu cả hai
toán hạng đều ngây thơ hoặc nếu cả hai đều biết. Nếu một người
biết và người kia ngây thơ, TypeErrorđược nuôi dưỡng.
Nếu cả hai đều ngây thơ hoặc cả hai đều biết và có cùng
một tzinfothuộc tính, các tzinfothuộc tính sẽ bị bỏ qua và kết quả
là một timedelta đối tượng t sao cho . Không có điều chỉnh múi giờ
nào được thực hiện trong trường hợp này. datetime2 + t == datetime1
Nếu cả hai đều biết và có tzinfocác thuộc tính khác nhau, thì a-
bhành động như thể a và b lần đầu tiên được chuyển đổi thành thời
gian biểu UTC ngây thơ trước. Kết quả là ngoại trừ việc triển khai
không bao giờ bị tràn.(a.replace(tzinfo=None) - a.utcoffset()) -
(b.replace(tzinfo=None) - b.utcoffset())

4. datetime1 được coi là nhỏ hơn datetime2 khi datetime1 trước


datetime2 về mặt thời gian.
Nếu một so sánh là ngây thơ và người kia nhận thức được, TypeError
sẽ được nâng lên nếu cố gắng so sánh thứ tự. Để so sánh bình đẳng,
các trường hợp ngây thơ không bao giờ bằng các trường hợp nhận thức
được.
Nếu cả hai đối tượng so sánh đều nhận biết và có cùng tzinfothuộc
tính, thì tzinfothuộc tính chung sẽ bị bỏ qua và thời gian dữ liệu
cơ sở được so sánh. Nếu cả hai bộ so sánh đều nhận biết và có tzinfo
các thuộc tính khác nhau, thì các bộ so sánh trước tiên được điều
chỉnh bằng cách trừ đi độ lệch UTC của chúng (thu được từ
self.utcoffset()).

Đã thay đổi trong phiên bản 3.3: So sánh bình đẳng giữa các trường
hợp nhận biết và ngây thơ datetime không tăng TypeError.

Ghi chú:
Để ngăn việc so sánh quay trở lại sơ đồ so sánh địa chỉ đối tượng
mặc định, so sánh ngày giờ thường tăng lên TypeErrornếu đối tượng so
sánh khác cũng không phải là một datetimeđối tượng. Tuy nhiên, thay
NotImplementedvào đó, được trả về nếu đối tượng so sánh khác có
timetuple()thuộc tính. Móc này cung cấp cho các loại đối tượng ngày
khác cơ hội thực hiện so sánh kiểu hỗn hợp. Nếu không, khi một
datetime đối tượng được so sánh với một đối tượng thuộc loại khác,

22
TypeErrorsẽ được nâng lên trừ khi phép so sánh là ==hoặc !=. Các
trường hợp sau trả về Falsehoặc True, tương ứng.
Phương thức sơ thẩm:
datetime.date()¶
ngày giờ. ngày ( )
Trả về dateđối tượng có cùng năm, tháng và ngày.
datetime.time()
ngày giờ. thời gian ( )
Trả về timeđối tượng có cùng giờ, phút, giây, micro giây và lần.
tzinfolà None. Xem thêm phương pháp timetz().

Đã thay đổi trong phiên bản 3.6: Giá trị của màn hình đầu tiên được
sao chép vào timeđối tượng được trả về.
datetime.timetz()
ngày giờ. múi giờ ( )
Trả về timeđối tượng có cùng thuộc tính giờ, phút, giây, micro giây,
nếp gấp và tzinfo. Xem thêm phương pháp time().
Đã thay đổi trong phiên bản 3.6: Giá trị của màn hình đầu tiên được
sao chép vào timeđối tượng được trả về.
datetime.replace(year=self.year, month=self.month, day=self.day,
hour=self.hour, minute=self.minute, second=self.second,
microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)¶
ngày giờ. thay thế ( năm = self.year , month = self.month , day =
self.day , hour = self.hour , minutes = self.minute , second =
self.second , microsecond = self.microsecond , tzinfo =
self.tzinfo , * , gấp = 0 )
Trả về một ngày giờ có cùng thuộc tính, ngoại trừ những thuộc tính
được cung cấp giá trị mới theo bất kỳ đối số từ khóa nào được chỉ
định. Lưu ý rằng tzinfo=Nonecó thể được chỉ định để tạo một ngày giờ
ngây thơ từ một ngày giờ đã biết mà không cần chuyển đổi dữ liệu
ngày và giờ.
Mới trong phiên bản 3.6: Đã thêm foldđối số.

datetime.astimezone(tz=None)¶
ngày giờ. múi giờ ( tz = Không có )

23
Trả về một đối tượng có thuộc tính datetimemới tz , điều chỉnh dữ
liệu ngày và giờ để kết quả có cùng thời gian UTC với self nhưng
theo giờ địa phương của tz .tzinfo
Nếu được cung cấp, tz phải là một thể hiện của một tzinfolớp con và
các phương thức utcoffset()and của nó dst()không được trả về None.
Nếu bản thân là ngây thơ, thì nó được coi là đại diện cho thời gian
trong múi giờ của hệ thống.
Nếu được gọi mà không có đối số (hoặc với tz=None), múi giờ cục bộ
của hệ thống được giả định cho múi giờ đích. Thuộc .tzinfotính của
phiên bản datetime đã chuyển đổi sẽ được đặt thành một phiên bản
timezone có tên vùng và phần bù nhận được từ HĐH.
Nếu self.tzinfo là tz, thì self.astimezone(tz) bằng self: không thực
hiện điều chỉnh dữ liệu ngày hoặc giờ. Mặt khác, kết quả là giờ địa
phương trong múi giờ tz, biểu thị cùng thời gian UTC với chính mình:
sau astz = dt.astimezone(tz), astz - astz.utcoffset() sẽ có cùng dữ
liệu ngày và giờ với dt - dt.utcoffset ().
Nếu bạn chỉ muốn đính kèm một đối tượng múi giờ tz vào một datetime
dt mà không cần điều chỉnh dữ liệu ngày và giờ, hãy sử dụng
dt.replace(tzinfo=tz). Nếu bạn chỉ muốn xóa đối tượng múi giờ khỏi dt
datetime nhận biết mà không cần chuyển đổi dữ liệu ngày và giờ, hãy
sử dụng dt.replace(tzinfo=None).
Lưu ý rằng tzinfo.fromutc()phương thức mặc định có thể được ghi đè
trong một tzinfolớp con để ảnh hưởng đến kết quả được trả về bởi
astimezone(). Bỏ qua các trường hợp lỗi, astimezone()hành động như:

def astimezone(self, tz):


if self.tzinfo is tz:
return self
# Convert self to UTC, and attach the new time zone object.
utc = (self - self.utcoffset()).replace(tzinfo=tz)
# Convert from UTC to tz's local time.
return tz.fromutc(utc)

Đã thay đổi trong phiên bản 3.3: giờ đây có thể bỏ qua tz .
Đã thay đổi trong phiên bản 3.6: Giờ đây, phương thức này
astimezone()có thể được gọi trên các phiên bản ngây thơ được cho là
đại diện cho giờ địa phương của hệ thống.

datetime.utcoffset()
Nếu tzinfois None, trả về None, other trả về
self.tzinfo.utcoffset(self)và đưa ra một ngoại lệ nếu cái sau không
trả về Nonehoặc một timedeltađối tượng có cường độ nhỏ hơn một ngày.

24
Đã thay đổi trong phiên bản 3.7: Độ lệch UTC không bị giới hạn trong
toàn bộ số phút.

datetime.dst()¶
Nếu tzinfois None, trả về None, other trả về self.tzinfo.dst(self)và
đưa ra một ngoại lệ nếu cái sau không trả về Nonehoặc một
timedeltađối tượng có cường độ nhỏ hơn một ngày.

Đã thay đổi trong phiên bản 3.7: Độ lệch DST không bị giới hạn trong
toàn bộ số phút.
datetime.tzname()¶
Nếu tzinfolà None, trả về None, khác trả về self.tzinfo.tzname(self),
đưa ra một ngoại lệ nếu cái sau không trả về Nonehoặc một đối tượng
chuỗi,
datetime.timetuple()
Trả lại một time.struct_timeví dụ như được trả về bởi
time.localtime().

d.timetuple()tương đương với:

time.struct_time((d.year, d.month, d.day,


d.hour, d.minute, d.second,
d.weekday(), yday, dst))
trong đó yday = d.toordinal() - date(d.year, 1, 1).toordinal() 1 là
số ngày trong năm hiện tại bắt đầu bằng 1 cho ngày 1 tháng 1. Cờ
tm_isdst của kết quả được đặt theo phương thức dst(): tzinfo là
Không có hoặc dst() trả về Không có, tm_isdst được đặt thành -1; mặt
khác nếu dst() trả về giá trị khác 0, tm_isdst được đặt thành 1; mặt
khác tm_isdst được đặt thành 0.
datetime.utctimetuple()¶
Nếu datetimetrường hợp d là ngây thơ, thì điều này cũng giống như
d.timetuple()trường hợp ngoại trừ tm_isdstbị buộc về 0 bất kể
d.dst()kết quả trả về là gì. DST không bao giờ có hiệu lực trong
thời gian UTC.
Nếu d biết, d được chuẩn hóa thành thời gian UTC, bằng cách trừ
d.utcoffset()và a time.struct_timecho thời gian chuẩn hóa được trả
về. tm_isdstbuộc phải bằng 0. Lưu ý rằng an OverflowErrorcó thể tăng
lên nếu d .year là MINYEARhoặc MAXYEARvà điều chỉnh UTC vượt qua
ranh giới năm.

25
Cảnh báo

Bởi vì datetimecác đối tượng ngây thơ được nhiều datetimephương pháp
coi là giờ địa phương, nên sử dụng thời gian nhận biết để biểu thị
thời gian trong UTC; do đó, việc sử dụng datetime.utctimetuple()có
thể cho kết quả sai lệch. Nếu bạn có một datetimeUTC đại diện ngây
thơ, hãy sử dụng datetime.replace(tzinfo=timezone.utc)để làm cho nó
biết, tại thời điểm đó bạn có thể sử dụng datetime.timetuple().
datetime.toordinal()
Trả về thứ tự Gregorian proleptic của ngày. Giống như
self.date().toordinal().

datetime.timestamp()¶
Trả về dấu thời gian POSIX tương ứng với datetime phiên bản. Giá trị
trả về tương floattự như giá trị được trả về bởi time.time().
Các phiên bản ngây thơ datetimeđược giả định là đại diện cho giờ địa
phương và phương pháp này dựa vào mktime() chức năng nền tảng C để
thực hiện chuyển đổi. Vì datetime hỗ trợ phạm vi giá trị rộng hơn so
với mktime()trên nhiều nền tảng nên phương pháp này có thể tăng
OverflowErrortrong thời gian xa trong quá khứ hoặc xa trong tương
lai.
Đối với các phiên bản nhận biết datetime, giá trị trả về được tính
như sau:
(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()

Mới trong phiên bản 3.3.


Đã thay đổi trong phiên bản 3.6: Phương timestamp()thức sử dụng
foldthuộc tính để phân biệt thời gian trong khoảng thời gian lặp
lại.
Ghi chú

Không có phương pháp nào để lấy dấu thời gian POSIX trực tiếp từ một
datetimephiên bản ngây thơ biểu thị thời gian UTC. Nếu ứng dụng của
bạn sử dụng quy ước này và múi giờ hệ thống của bạn không được đặt
thành UTC, thì bạn có thể lấy dấu thời gian POSIX bằng cách cung cấp
tzinfo=timezone.utc:

timestamp = dt.replace(tzinfo=timezone.utc).timestamp()

hoặc bằng cách tính toán dấu thời gian trực tiếp:
26
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)

datetime.weekday()
ngày giờ. ngày trong tuần ( )
Trả về ngày trong tuần dưới dạng số nguyên, trong đó Thứ Hai là 0 và
Chủ Nhật là 6. Tương tự như self.date().weekday(). Xem thêm
isoweekday().

datetime.isoweekday()
Trả về ngày trong tuần dưới dạng số nguyên, trong đó Thứ Hai là 1 và
Chủ Nhật là 7. Tương tự như self.date().isoweekday(). Xem thêm
weekday(), isocalendar().

datetime.isocalendar()
ngày giờ. đẳng lịch ( )
Trả về một bộ được đặt tên với ba thành phần: year, week và weekday.
Giống như self.date().isocalendar().

datetime.isoformat(sep='T', timespec='auto')
Trả về một chuỗi biểu thị ngày và giờ ở định dạng ISO 8601:

 YYYY-MM-DDTHH:MM:SS.ffffff, nếu microsecondkhông phải là 0


 YYYY-MM-DDTHH:MM:SS, nếu microsecondlà 0

Nếu utcoffset()không trả về None, một chuỗi sẽ được thêm vào, tạo ra
phần bù UTC:

 YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]], nếu microsecond


không phải là 0
 YYYY-MM-DDTHH:MM:SS+HH:MM[:SS[.ffffff]], nếu microsecondlà 0

Ví dụ:
>>>>>> from datetime import datetime, timezone
>>> datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat()
'2019-05-18T15:17:08.132263'
>>> datetime(2019, 5, 18, 15, 17, tzinfo=timezone.utc).isoformat()
'2019-05-18T15:17:00+00:00'

Đối số tùy chọn sep (mặc định 'T') là dấu tách một ký tự, được đặt
giữa phần ngày và giờ của kết quả. Ví dụ:
>>>>>> from datetime import tzinfo, timedelta, datetime
>>> class TZ(tzinfo):

27
... """A time zone with an arbitrary, constant -06:39 offset."""
... def utcoffset(self, dt):
... return timedelta(hours=-6, minutes=-39)
...
>>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')
'2002-12-25 00:00:00-06:39'
>>> datetime(2009, 11, 27, microsecond=100, tzinfo=TZ()).isoformat()
'2009-11-27T00:00:00.000100-06:39'

Đối số tùy chọn timespec chỉ định số lượng thành phần bổ sung của
thời gian cần đưa vào (mặc định là 'auto'). Nó có thể là một trong
những điều sau đây:

 'auto': Giống như 'seconds'nếu microsecondlà 0, giống như


'microseconds'nếu không.
 'hours': Bao gồm hourở định dạng hai chữ số HH.
 'minutes': Bao gồm hourvà minutetrong HH:MMđịnh dạng.
 'seconds': Bao gồm hour, minutevà second ở HH:MM:SSđịnh dạng.
 'milliseconds': Bao gồm toàn thời gian, nhưng cắt ngắn phần thứ
hai thành mili giây. HH:MM:SS.sssđịnh dạng.
 'microseconds': Bao gồm toàn thời gian ở HH:MM:SS.ffffffđịnh
dạng.
Ghi chú

Các thành phần thời gian bị loại trừ bị cắt bớt, không được làm
tròn.
ValueErrorsẽ được nêu ra trên một đối số timespec không hợp lệ :

>>>>>> from datetime import datetime


>>> datetime.now().isoformat(timespec='minutes')
'2002-12-25T00:00'
>>> dt = datetime(2015, 1, 1, 12, 30, 59, 0)
>>> dt.isoformat(timespec='microseconds')
'2015-01-01T12:30:59.000000'

Mới trong phiên bản 3.6: Đã thêm đối số thông số thời gian .
datetime.__str__()¶
Ví datetimedụ d , str(d)tương đương với .d.isoformat(' ')
datetime.ctime()
ngày giờ. thời gian ( )
Trả về một chuỗi đại diện cho ngày và giờ:

28
>>>>>> from datetime import datetime
>>> datetime(2002, 12, 4, 20, 30, 40).ctime()
'Wed Dec 4 20:30:40 2002'

Chuỗi đầu ra sẽ không bao gồm thông tin múi giờ, bất kể đầu vào có
nhận biết hay không.
d.ctime()tương đương với:

time.ctime(time.mktime(d.timetuple()))

trên các nền tảng nơi hàm C gốc ctime()(có time.ctime()thể gọi nhưng
datetime.ctime()không gọi) tuân theo tiêu chuẩn C.

datetime.strftime(format)¶
ngày giờ. strftime ( định dạng )
Trả về một chuỗi đại diện cho ngày và giờ, được kiểm soát bởi một
chuỗi định dạng rõ ràng. Để biết danh sách đầy đủ các chỉ thị định
dạng, hãy xem hành vi strftime() và strptime() .
datetime.__format__(format)
ngày giờ. __định dạng__ ( định dạng )
Tương tự như datetime.strftime(). Điều này giúp có thể chỉ định một
chuỗi định dạng cho một datetimeđối tượng bằng các ký tự chuỗi được
định dạng và khi sử dụng str.format(). Để biết danh sách đầy đủ các
chỉ thị định dạng, hãy xem hành vi strftime() và strptime() .

Ví dụ về cách sử dụng: datetime


Ví dụ về làm việc với datetimecác đối tượng:
>>>>>> from datetime import datetime, date, time, timezone

>>> # Using datetime.combine()


>>> d = date(2005, 7, 14)
>>> t = time(12, 30)
>>> datetime.combine(d, t)
datetime.datetime(2005, 7, 14, 12, 30)

>>> # Using datetime.now()


>>> datetime.now()
datetime.datetime(2007, 12, 6, 16, 29, 43, 79043) # GMT +1
>>> datetime.now(timezone.utc)
datetime.datetime(2007, 12, 6, 15, 29, 43, 79060,
tzinfo=datetime.timezone.utc)

29
>>> # Using datetime.strptime()
>>> dt = datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
>>> dt
datetime.datetime(2006, 11, 21, 16, 30)

>>> # Using datetime.timetuple() to get tuple of all attributes


>>> tt = dt.timetuple()
>>> for it in tt:
... print(it)
...
2006 # year
11 # month
21 # day
16 # hour
30 # minute
0 # second
1 # weekday (0 = Monday)
325 # number of days since 1st January
-1 # dst - method tzinfo.dst() returned None

>>> # Date in ISO format


>>> ic = dt.isocalendar()
>>> for it in ic:
... print(it)
...
2006 # ISO year
47 # ISO week
2 # ISO weekday

>>> # Formatting a datetime


>>> dt.strftime("%A, %d. %B %Y %I:%M%p")
'Tuesday, 21. November 2006 04:30PM'
>>> 'The {1} is {0:%d}, the {2} is {0:%B}, the {3} is {0:%I:%M
%p}.'.format(dt, "day", "month", "time")
'The day is 21, the month is November, the time is 04:30PM.'

Ví dụ bên dưới định nghĩa một tzinfolớp con thu thập thông tin múi
giờ cho Kabul, Afghanistan, sử dụng +4 UTC cho đến năm 1945 và sau
đó là +4:30 UTC sau đó:
from datetime import timedelta, datetime, tzinfo, timezone

class KabulTz(tzinfo):
# Kabul used +4 until 1945, when they moved to +4:30
UTC_MOVE_DATE = datetime(1944, 12, 31, 20, tzinfo=timezone.utc)

def utcoffset(self, dt):

30
if dt.year < 1945:
return timedelta(hours=4)
elif (1945, 1, 1, 0, 0) <= dt.timetuple()[:5] < (1945, 1, 1, 0,
30):
# An ambiguous ("imaginary") half-hour range representing
# a 'fold' in time due to the shift from +4 to +4:30.
# If dt falls in the imaginary range, use fold to decide
how
# to resolve. See PEP495.
return timedelta(hours=4, minutes=(30 if dt.fold else 0))
else:
return timedelta(hours=4, minutes=30)

def fromutc(self, dt):


# Follow same validations as in datetime.tzinfo
if not isinstance(dt, datetime):
raise TypeError("fromutc() requires a datetime argument")
if dt.tzinfo is not self:
raise ValueError("dt.tzinfo is not self")

# A custom implementation is required for fromutc as


# the input to this function is a datetime with utc values
# but with a tzinfo set to self.
# See datetime.astimezone or fromtimestamp.
if dt.replace(tzinfo=timezone.utc) >= self.UTC_MOVE_DATE:
return dt + timedelta(hours=4, minutes=30)
else:
return dt + timedelta(hours=4)

def dst(self, dt):


# Kabul does not observe daylight saving time.
return timedelta(0)

def tzname(self, dt):


if dt >= self.UTC_MOVE_DATE:
return "+04:30"
return "+04"

Cách sử dụng KabulTztừ trên:


>>>>>> tz1 = KabulTz()

>>> # Datetime before the change


>>> dt1 = datetime(1900, 11, 21, 16, 30, tzinfo=tz1)
>>> print(dt1.utcoffset())
4:00:00

>>> # Datetime after the change


>>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=tz1)

31
>>> print(dt2.utcoffset())
4:30:00

>>> # Convert datetime to another time zone


>>> dt3 = dt2.astimezone(timezone.utc)
>>> dt3
datetime.datetime(2006, 6, 14, 8, 30, tzinfo=datetime.timezone.utc)
>>> dt2
datetime.datetime(2006, 6, 14, 13, 0, tzinfo=KabulTz())
>>> dt2 == dt3
True

timeĐối tượng
Một timeđối tượng đại diện cho thời gian (cục bộ) trong ngày, không
phụ thuộc vào bất kỳ ngày cụ thể nào và có thể điều chỉnh thông qua
một tzinfođối tượng.
class datetime.time(hour=0, minute=0, second=0, microsecond=0,
tzinfo=None, *, fold=0)
ngày giờ của lớp . thời gian ( giờ = 0 , phút = 0 , giây = 0 , micro
giây = 0 , tzinfo = Không có , * , gấp = 0 )
Tất cả các đối số là tùy chọn. tzinfo có thể là Nonehoặc một thể
hiện của một tzinfolớp con. Các đối số còn lại phải là số nguyên
trong các phạm vi sau:
o 0 <= hour < 24,
o 0 <= minute < 60,
o 0 <= second < 60,
o 0 <= microsecond < 1000000,
o fold in [0, 1].

 Nếu một đối số nằm ngoài các phạm vi đó được đưa ra,
ValueErrorsẽ được nêu ra. Tất cả mặc định ngoại 0trừ tzinfo ,
mặc định là None.
Thuộc tính lớp:

time.min¶
thời gian. phút
Đại diện sớm nhất time, .time(0, 0, 0, 0)

32
time.max¶
thời gian. tối đa
Đại diện mới nhất time, .time(23, 59, 59, 999999)
time.resolution¶
thời gian. độ phân giải
timeSự khác biệt nhỏ nhất có thể có giữa các đối tượng không bằng
nhau , timedelta(microseconds=1)mặc dù lưu ý rằng số học trên timecác
đối tượng không được hỗ trợ.
time.hour
thời gian. giờ
Trong range(24).
time.minute¶
thời gian. phút
Trong range(60).
time.second
thời gian. thứ hai ¶
Trong range(60).
time.microsecond
thời gian. micro giây
Trong range(1000000).
time.tzinfo¶
Đối tượng được truyền dưới dạng đối số tzinfo cho timehàm tạo hoặc
Nonenếu không có đối số nào được truyền.

time.fold¶
Trong . Được sử dụng để phân biệt thời gian tường trong một khoảng
thời gian lặp lại. (Một khoảng thời gian lặp lại xảy ra khi đồng hồ
lùi lại vào cuối giờ tiết kiệm ánh sáng ban ngày hoặc khi độ lệch
UTC cho vùng hiện tại bị giảm vì lý do chính trị.) Giá trị 0 (1)
biểu thị thời điểm sớm hơn (sau đó) trong hai thời điểm với cùng một
đại diện thời gian bức tường.[0, 1]
Mới trong phiên bản 3.6.
timecác đối tượng hỗ trợ so sánh timevới time, trong đó a được coi
là nhỏ hơn b khi a đứng trước b về mặt thời gian. Nếu một so sánh là

33
ngây thơ và người kia nhận thức được, TypeErrorsẽ được nâng lên nếu
cố gắng so sánh thứ tự. Để so sánh bình đẳng, các trường hợp ngây
thơ không bao giờ bằng các trường hợp nhận thức được.
Nếu cả hai đối tượng so sánh đều nhận biết và có cùng tzinfothuộc
tính, thì thuộc tính chung tzinfosẽ bị bỏ qua và thời gian cơ sở
được so sánh. Nếu cả hai bộ so sánh đều nhận biết và có tzinfocác
thuộc tính khác nhau, thì các bộ so sánh trước tiên được điều chỉnh
bằng cách trừ đi độ lệch UTC của chúng (thu được từ
self.utcoffset()). Để ngăn các phép so sánh loại hỗn hợp quay trở lại
phép so sánh mặc định theo địa chỉ đối tượng, khi một timeđối tượng
được so sánh với một đối tượng thuộc loại khác, TypeErrorsẽ được
nâng lên trừ khi phép so sánh là ==hoặc !=. Các trường hợp sau trả
về Falsehoặc True, tương ứng.
Đã thay đổi trong phiên bản 3.3: So sánh bình đẳng giữa các trường
hợp nhận biết và ngây thơ timekhông tăng TypeError.
Trong ngữ cảnh Boolean, một timeđối tượng luôn được coi là đúng.
Đã thay đổi trong phiên bản 3.5: Trước Python 3.5, một timeđối tượng
được coi là sai nếu nó biểu thị nửa đêm theo giờ UTC. Hành vi này
được coi là tối nghĩa và dễ bị lỗi và đã bị xóa trong Python 3.5.
Xem bpo-13936 để biết chi tiết đầy đủ.
Các nhà xây dựng khác:
time.replace(hour=self.hour, minute=self.minute, second=self.second,
microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)
thời gian phương pháp lớp học . fromisoformat ( time_string )
Trả về một timetương ứng với một time_string ở bất kỳ định dạng ISO
8601 hợp lệ nào, với các ngoại lệ sau:
a. Độ lệch múi giờ có thể có giây phân số.
b. Dẫn đầu T, thường được yêu cầu trong trường hợp có thể có
sự mơ hồ giữa ngày và giờ, không bắt buộc.
c. Phân số giây có thể có bất kỳ số lượng chữ số nào (bất kỳ
số nào vượt quá 6 sẽ bị cắt bớt).
d. Giờ và phút phân số không được hỗ trợ.
16. Ví dụ:
17. >>>>>> from datetime import time
>>> time.fromisoformat('04:23:01')
datetime.time(4, 23, 1)
>>> time.fromisoformat('T04:23:01')
datetime.time(4, 23, 1)
>>> time.fromisoformat('T042301')
datetime.time(4, 23, 1)

34
>>> time.fromisoformat('04:23:01.000384')
datetime.time(4, 23, 1, 384)
>>> time.fromisoformat('04:23:01,000')
datetime.time(4, 23, 1, 384)
>>> time.fromisoformat('04:23:01+04:00')
datetime.time(4, 23, 1,
tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
>>> time.fromisoformat('04:23:01Z')
datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)
>>> time.fromisoformat('04:23:01+00:00')
datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)

18. Mới trong phiên bản 3.7.


19. Đã thay đổi trong phiên bản 3.11: Trước đây, phương pháp
này chỉ hỗ trợ các định dạng có thể được phát ra bởi
time.isoformat().

Phương thức sơ thẩm:

time.replace(hour=self.hour, minute=self.minute, second=self.second,


microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)
thời gian. thay thế ( giờ = self.hour , minutes = self.minute ,
second = self.second , microsecond = self.microsecond , tzinfo =
self.tzinfo , * , fold = 0 )
Trả về a timecó cùng giá trị, ngoại trừ các thuộc tính được cung cấp
giá trị mới theo bất kỳ đối số từ khóa nào được chỉ định. Lưu ý rằng
tzinfo=Nonecó thể được chỉ định để tạo ngây thơ timetừ một nhận thức
timemà không cần chuyển đổi dữ liệu thời gian.

Mới trong phiên bản 3.6: Đã thêm foldđối số.


thời gian. isoformat ( timespec = 'auto' )
Trả về một chuỗi biểu thị thời gian ở định dạng ISO 8601, một trong
số:
o HH:MM:SS.ffffff, nếu microsecondkhông phải là 0
o HH:MM:SS, nếu microsecondlà 0
o HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]], nếu utcoffset()không
trở lạiNone
o HH:MM:SS+HH:MM[:SS[.ffffff]], nếu microsecondlà 0 và
utcoffset()không trở lạiNone

 Đối số tùy chọn timespec chỉ định số lượng thành phần bổ sung
của thời gian cần đưa vào (mặc định là 'auto'). Nó có thể là
một trong những điều sau đây:
35
o 'auto': Giống như 'seconds'nếu microsecondlà 0, giống như
'microseconds'nếu không.
o 'hours': Bao gồm hourở định dạng hai chữ số HH.
o 'minutes': Bao gồm hourvà minutetrong HH:MMđịnh dạng.
o 'seconds': Bao gồm hour, minutevà second ở HH:MM:SSđịnh
dạng.
o 'milliseconds': Bao gồm toàn thời gian, nhưng cắt ngắn
phần thứ hai thành mili giây. HH:MM:SS.sssđịnh dạng.
o 'microseconds': Bao gồm toàn thời gian ở
HH:MM:SS.ffffffđịnh dạng.

 Ghi chú


 Các thành phần thời gian bị loại trừ bị cắt bớt, không được
làm tròn.

 ValueErrorsẽ được nâng lên trên một đối số timespec không hợp
lệ .

 Ví dụ:
 >>>>>> from datetime import time
>>> time(hour=12, minute=34, second=56,
microsecond=123456).isoformat(timespec='minutes')
'12:34'
>>> dt = time(hour=12, minute=34, second=56, microsecond=0)
>>> dt.isoformat(timespec='microseconds')
'12:34:56.000000'
>>> dt.isoformat(timespec='auto')
'12:34:56'

 Mới trong phiên bản 3.6: Đã thêm đối số thông số thời gian .

time.__str__()
Trong một thời gian t , str(t)tương đương với t.isoformat().
time.strftime(format)¶
thời gian. strftime ( định dạng )
Trả về một chuỗi đại diện cho thời gian, được kiểm soát bởi một
chuỗi định dạng rõ ràng. Để biết danh sách đầy đủ các chỉ thị định
dạng, hãy xem hành vi strftime() và strptime() .
time.__format__(format)¶

36
thời gian. __định dạng__ ( định dạng )
Tương tự như time.strftime(). Điều này giúp có thể chỉ định một chuỗi
định dạng cho một timeđối tượng bằng các ký tự chuỗi được định dạng
và khi sử dụng str.format(). Để biết danh sách đầy đủ các chỉ thị
định dạng, hãy xem hành vi strftime() và strptime() .

time.utcoffset()¶
Nếu tzinfois None, trả về None, other trả về
self.tzinfo.utcoffset(None)và đưa ra một ngoại lệ nếu cái sau không
trả về Nonehoặc một timedeltađối tượng có cường độ nhỏ hơn một ngày.
Đã thay đổi trong phiên bản 3.7: Độ lệch UTC không bị giới hạn trong
toàn bộ số phút.
time.dst()¶
Nếu tzinfolà None, trả về None, khác trả về self.tzinfo.dst(None)và
đưa ra một ngoại lệ nếu cái sau không trả về Nonehoặc một
timedeltađối tượng có cường độ nhỏ hơn một ngày.

Đã thay đổi trong phiên bản 3.7: Độ lệch DST không bị giới hạn trong
toàn bộ số phút.
time.tzname()
Nếu tzinfolà None, trả về None, khác trả về
self.tzinfo.tzname(None)hoặc tăng ngoại lệ nếu đối tượng sau không
trả về Nonehoặc đối tượng chuỗi.

Ví dụ về cách sử dụng: time


Ví dụ về làm việc với một timeđối tượng:
>>>>>> from datetime import time, tzinfo, timedelta
>>> class TZ1(tzinfo):
... def utcoffset(self, dt):
... return timedelta(hours=1)
... def dst(self, dt):
... return timedelta(0)
... def tzname(self,dt):
... return "+01:00"
... def __repr__(self):
... return f"{self.__class__.__name__}()"
...
>>> t = time(12, 10, 30, tzinfo=TZ1())
>>> t
datetime.time(12, 10, 30, tzinfo=TZ1())
>>> t.isoformat()
'12:10:30+01:00'
37
>>> t.dst()
datetime.timedelta(0)
>>> t.tzname()
'+01:00'
>>> t.strftime("%H:%M:%S %Z")
'12:10:30 +01:00'
>>> 'The {} is {:%H:%M}.'.format("time", t)
'The time is 12:10.'

tzinfo Objects

class datetime.tzinfo
ngày giờ của lớp . tzinfo
Đây là một lớp cơ sở trừu tượng, nghĩa là lớp này không được khởi
tạo trực tiếp. Định nghĩa một lớp con của tzinfođể nắm bắt thông tin
về một múi giờ cụ thể.
Một thể hiện của (một lớp con cụ thể của) tzinfocó thể được truyền
cho các hàm tạo cho datetimevà timecác đối tượng. Các đối tượng thứ
hai xem các thuộc tính của chúng là theo giờ địa phương và tzinfođối
tượng hỗ trợ các phương thức tiết lộ phần bù giờ địa phương từ UTC,
tên của múi giờ và phần bù DST, tất cả đều liên quan đến một đối
tượng ngày hoặc giờ được truyền cho chúng.
Bạn cần lấy được một lớp con cụ thể và (ít nhất) cung cấp các triển
khai của tzinfocác phương thức tiêu chuẩn cần thiết cho datetimecác
phương thức bạn sử dụng. Mô-đun này datetimecung cấp timezone, một
lớp con cụ thể đơn giản trong tzinfođó có thể biểu thị các múi giờ
có độ lệch cố định từ UTC, chẳng hạn như chính UTC hoặc EST và EDT
của Bắc Mỹ.
Yêu cầu đặc biệt đối với việc tẩy: Một tzinfolớp con phải có một
__init__()phương thức có thể được gọi mà không có đối số, nếu không,
nó có thể được chọn nhưng có thể không được giải nén lại. Đây là một
yêu cầu kỹ thuật có thể được nới lỏng trong tương lai.
Một lớp con cụ thể của tzinfocó thể cần thực hiện các phương pháp
sau. Chính xác những phương pháp nào là cần thiết phụ thuộc vào việc
sử dụng datetimecác đối tượng nhận biết. Nếu nghi ngờ, chỉ cần thực
hiện tất cả chúng.

tzinfo.utcoffset(dt)

38
Trả về phần bù của giờ địa phương từ UTC, dưới dạng một timedeltađối
tượng dương ở phía đông của UTC. Nếu giờ địa phương ở phía tây của
UTC, điều này sẽ là số âm.
Điều này thể hiện tổng phần bù từ UTC; ví dụ: nếu một tzinfođối
tượng đại diện cho cả điều chỉnh múi giờ và DST, utcoffset()thì sẽ
trả về tổng của chúng. Nếu không biết phần bù UTC, hãy trả về None.
Mặt khác, giá trị được trả về phải là một timedeltađối tượng hoàn
toàn nằm giữa -timedelta(hours=24)và timedelta(hours=24) (độ lớn của
phần bù phải nhỏ hơn một ngày). Hầu hết các triển khai utcoffset()có
thể sẽ giống như một trong hai cách sau:
return CONSTANT # fixed-offset class
return CONSTANT + self.dst(dt) # daylight-aware class

Nếu utcoffset()không quay lại None, dst()thì cũng không nên quay lại
None.

Việc triển khai mặc định của utcoffset()raise NotImplementedError.


Đã thay đổi trong phiên bản 3.7: Độ lệch UTC không bị giới hạn trong
toàn bộ số phút.

tzinfo.dst(dt)
Trả lại điều chỉnh thời gian tiết kiệm ánh sáng ban ngày (DST), dưới
dạng timedelta đối tượng hoặc Nonenếu thông tin DST không được biết.
Trả lại timedelta(0)nếu DST không có hiệu lực. Nếu DST có hiệu lực,
hãy trả lại phần bù dưới dạng timedeltađối tượng (xem utcoffset()để
biết chi tiết). Lưu ý rằng phần bù DST, nếu có, đã được thêm vào
phần bù UTC được trả về bởi utcoffset(), do đó, không cần tham khảo
dst()trừ khi bạn quan tâm đến việc lấy riêng thông tin DST. Ví dụ:
datetime.timetuple()gọi phương thức tzinfo thuộc tính của nó dst()để
xác định cách tm_isdstđặt cờ và tzinfo.fromutc()gọi dst()để tính đến
các thay đổi DST khi vượt qua các múi giờ.
Một thể hiện tz của một tzinfolớp con mô hình hóa cả thời gian tiêu
chuẩn và thời gian ban ngày phải nhất quán theo nghĩa này:
tz.utcoffset(dt) - tz.dst(dt)
phải trả về cùng một kết quả cho mọi dt với Đối với các lớp con lành
mạnh, biểu thức này mang lại “độ lệch chuẩn” của múi giờ, không phụ
thuộc vào ngày hoặc giờ mà chỉ phụ thuộc vào vị trí địa lý. Việc
thực hiện ỷ lại vào việc này nhưng không phát hiện được vi phạm; lập
trình viên có trách nhiệm đảm bảo điều đó. Nếu một lớp con không thể
đảm bảo điều này, nó có thể ghi đè cài đặt mặc định của để hoạt động

39
chính xác với bất kể.datetime dt.tzinfo ==
tztzinfodatetime.astimezone()tzinfotzinfo.fromutc()astimezone()

Hầu hết các triển khai dst()có thể sẽ giống như một trong hai cách
sau:
def dst(self, dt):
# a fixed-offset class: doesn't account for DST
return timedelta(0)

hoặc:
def dst(self, dt):
# Code to set dston and dstoff to the time zone's DST
# transition times based on the input dt.year, and expressed
# in standard local time.

if dston <= dt.replace(tzinfo=None) < dstoff:


return timedelta(hours=1)
else:
return timedelta(0)

Việc triển khai mặc định của dst()raise NotImplementedError.


Đã thay đổi trong phiên bản 3.7: Độ lệch DST không bị giới hạn trong
toàn bộ số phút.

tzinfo.tzname(dt)¶
Trả về tên múi giờ tương ứng với datetimeđối tượng dt , dưới dạng
một chuỗi. Không có gì về tên chuỗi được datetimemô-đun xác định và
không có yêu cầu rằng nó có nghĩa cụ thể. Ví dụ: “GMT”, “UTC”, “-
500”, “-5:00”, “EDT”, “US/Eastern”, “America/New York” đều là những
câu trả lời hợp lệ. Trả lại Nonenếu không biết tên chuỗi. Lưu ý rằng
đây chủ yếu là một phương thức chứ không phải là một chuỗi cố định
bởi vì một số tzinfo lớp con sẽ muốn trả về các tên khác nhau tùy
thuộc vào giá trị cụ thể của dt được truyền, đặc biệt nếu tzinfolớp
này tính thời gian ban ngày.
Việc triển khai mặc định của tzname()raise NotImplementedError.
Các phương thức này được gọi bởi một datetimehoặc timeđối tượng, để
đáp lại các phương thức cùng tên của chúng. Một datetimeđối tượng
chuyển chính nó làm đối số và một timeđối tượng chuyển Nonethành đối
số. Do đó, các phương thức của lớp tzinfocon nên được chuẩn bị để
chấp nhận đối số dt của Nonehoặc của lớp datetime.
Khi Noneđược thông qua, người thiết kế lớp sẽ quyết định phản hồi
tốt nhất. Ví dụ: trả về Nonelà phù hợp nếu lớp muốn nói rằng các đối
40
tượng thời gian không tham gia vào các tzinfogiao thức. Có thể hữu
ích hơn khi utcoffset(None)trả lại phần bù UTC tiêu chuẩn, vì không
có quy ước nào khác để khám phá phần bù tiêu chuẩn.
Khi một datetimeđối tượng được truyền để phản hồi lại một datetime
phương thức, dt.tzinfothì đối tượng đó cũng giống như self .
tzinfocác phương thức có thể dựa vào điều này, trừ khi mã người dùng
gọi tzinfotrực tiếp các phương thức. Mục đích là tzinfocác phương
thức diễn giải dt theo giờ địa phương và không cần lo lắng về các
đối tượng trong các múi giờ khác.
Có một tzinfophương thức nữa mà một lớp con có thể muốn ghi đè:

tzinfo.fromutc(dt)¶
tzinfo. fromutc ( dt )
Điều này được gọi từ datetime.astimezone() việc thực hiện mặc định.
Khi được gọi từ đó, dữ liệu ngày và giờ dt.tzinfocủa self và dt sẽ
được xem là biểu thị thời gian UTC. Mục đích của fromutc()là điều
chỉnh dữ liệu ngày và giờ, trả về một ngày giờ tương đương theo giờ
địa phương của chính bạn .
Hầu hết tzinfocác lớp con sẽ có thể kế thừa fromutc()việc triển khai
mặc định mà không gặp sự cố. Nó đủ mạnh để xử lý các múi giờ có độ
lệch cố định và các múi giờ tính cả thời gian tiêu chuẩn và thời
gian ban ngày, cũng như thời gian ban ngày ngay cả khi thời gian
chuyển đổi DST khác nhau trong các năm khác nhau. Một ví dụ về múi
giờ mà fromutc() việc triển khai mặc định có thể không xử lý chính
xác trong mọi trường hợp là trường hợp mà độ lệch chuẩn (từ UTC) phụ
thuộc vào ngày và giờ cụ thể đã trôi qua, điều này có thể xảy ra vì
lý do chính trị. Việc triển khai mặc định của astimezone()và
fromutc()có thể không tạo ra kết quả bạn muốn nếu kết quả là một
trong những giờ diễn ra vào thời điểm bù trừ tiêu chuẩn thay đổi.
Bỏ qua mã cho các trường hợp lỗi, fromutc()việc triển khai mặc định
hoạt động như sau:
def fromutc(self, dt):
# raise ValueError error if dt.tzinfo is not self
dtoff = dt.utcoffset()
dtdst = dt.dst()
# raise ValueError if dtoff is None or dtdst is None
delta = dtoff - dtdst # this is self's standard offset
if delta:
dt += delta # convert to standard local time
dtdst = dt.dst()
# raise ValueError if dtdst is None
if dtdst:

41
return dt + dtdst
else:
return dt

In the following tzinfo_examples.py file there are some examples of


tzinfo classes:

from datetime import tzinfo, timedelta, datetime

ZERO = timedelta(0)
HOUR = timedelta(hours=1)
SECOND = timedelta(seconds=1)

# A class capturing the platform's idea of local time.


# (May result in wrong values on historical times in
# timezones where UTC offset and/or the DST rules had
# changed in the past.)
import time as _time

STDOFFSET = timedelta(seconds = -_time.timezone)


if _time.daylight:
DSTOFFSET = timedelta(seconds = -_time.altzone)
else:
DSTOFFSET = STDOFFSET

DSTDIFF = DSTOFFSET - STDOFFSET

class LocalTimezone(tzinfo):

def fromutc(self, dt):


assert dt.tzinfo is self
stamp = (dt - datetime(1970, 1, 1, tzinfo=self)) // SECOND
args = _time.localtime(stamp)[:6]
dst_diff = DSTDIFF // SECOND
# Detect fold
fold = (args == _time.localtime(stamp - dst_diff))
return datetime(*args, microsecond=dt.microsecond,
tzinfo=self, fold=fold)

def utcoffset(self, dt):


if self._isdst(dt):
return DSTOFFSET
else:
return STDOFFSET

def dst(self, dt):


if self._isdst(dt):
return DSTDIFF
else:

42
return ZERO

def tzname(self, dt):


return _time.tzname[self._isdst(dt)]

def _isdst(self, dt):


tt = (dt.year, dt.month, dt.day,
dt.hour, dt.minute, dt.second,
dt.weekday(), 0, 0)
stamp = _time.mktime(tt)
tt = _time.localtime(stamp)
return tt.tm_isdst > 0

Local = LocalTimezone()

# A complete implementation of current DST rules for major US time


zones.

def first_sunday_on_or_after(dt):
days_to_go = 6 - dt.weekday()
if days_to_go:
dt += timedelta(days_to_go)
return dt

# US DST Rules
#
# This is a simplified (i.e., wrong for a few cases) set of rules for
US
# DST start and end times. For a complete and up-to-date set of DST
rules
# and timezone definitions, visit the Olson Database (or try pytz):
# http://www.twinsun.com/tz/tz-link.htm
# https://sourceforge.net/projects/pytz/ (might not be up-to-date)
#
# In the US, since 2007, DST starts at 2am (standard time) on the
second
# Sunday in March, which is the first Sunday on or after Mar 8.
DSTSTART_2007 = datetime(1, 3, 8, 2)
# and ends at 2am (DST time) on the first Sunday of Nov.
DSTEND_2007 = datetime(1, 11, 1, 2)
# From 1987 to 2006, DST used to start at 2am (standard time) on the
first
# Sunday in April and to end at 2am (DST time) on the last
# Sunday of October, which is the first Sunday on or after Oct 25.
DSTSTART_1987_2006 = datetime(1, 4, 1, 2)
DSTEND_1987_2006 = datetime(1, 10, 25, 2)
# From 1967 to 1986, DST used to start at 2am (standard time) on the
last

43
# Sunday in April (the one on or after April 24) and to end at 2am (DST
time)
# on the last Sunday of October, which is the first Sunday
# on or after Oct 25.
DSTSTART_1967_1986 = datetime(1, 4, 24, 2)
DSTEND_1967_1986 = DSTEND_1987_2006

def us_dst_range(year):
# Find start and end times for US DST. For years before 1967,
return
# start = end for no DST.
if 2006 < year:
dststart, dstend = DSTSTART_2007, DSTEND_2007
elif 1986 < year < 2007:
dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_2006
elif 1966 < year < 1987:
dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_1986
else:
return (datetime(year, 1, 1), ) * 2

start = first_sunday_on_or_after(dststart.replace(year=year))
end = first_sunday_on_or_after(dstend.replace(year=year))
return start, end

class USTimeZone(tzinfo):

def __init__(self, hours, reprname, stdname, dstname):


self.stdoffset = timedelta(hours=hours)
self.reprname = reprname
self.stdname = stdname
self.dstname = dstname

def __repr__(self):
return self.reprname

def tzname(self, dt):


if self.dst(dt):
return self.dstname
else:
return self.stdname

def utcoffset(self, dt):


return self.stdoffset + self.dst(dt)

def dst(self, dt):


if dt is None or dt.tzinfo is None:
# An exception may be sensible here, in one or both cases.
# It depends on how you want to treat them. The default
# fromutc() implementation (called by the default

44
astimezone()
# implementation) passes a datetime with dt.tzinfo is self.
return ZERO
assert dt.tzinfo is self
start, end = us_dst_range(dt.year)
# Can't compare naive to aware objects, so strip the timezone
from
# dt first.
dt = dt.replace(tzinfo=None)
if start + HOUR <= dt < end - HOUR:
# DST is in effect.
return HOUR
if end - HOUR <= dt < end:
# Fold (an ambiguous hour): use dt.fold to disambiguate.
return ZERO if dt.fold else HOUR
if start <= dt < start + HOUR:
# Gap (a non-existent hour): reverse the fold rule.
return HOUR if dt.fold else ZERO
# DST is off.
return ZERO

def fromutc(self, dt):


assert dt.tzinfo is self
start, end = us_dst_range(dt.year)
start = start.replace(tzinfo=self)
end = end.replace(tzinfo=self)
std_time = dt + self.stdoffset
dst_time = std_time + HOUR
if end <= dst_time < end + HOUR:
# Repeated hour
return std_time.replace(fold=1)
if std_time < start or dst_time >= end:
# Standard time
return std_time
if start <= std_time < end - HOUR:
# Daylight saving time
return dst_time

Eastern = USTimeZone(-5, "Eastern", "EST", "EDT")


Central = USTimeZone(-6, "Central", "CST", "CDT")
Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")
Pacific = USTimeZone(-8, "Pacific", "PST", "PDT")

Lưu ý rằng có những sự tinh tế không thể tránh khỏi hai lần mỗi năm
trong một tzinfo phân lớp chiếm cả thời gian tiêu chuẩn và thời gian
ban ngày, tại các điểm chuyển tiếp DST. Để cụ thể hơn, hãy xem xét
Miền Đông Hoa Kỳ (UTC -0500), trong đó EDT bắt đầu vào phút sau 1:59

45
(EST) vào Chủ nhật thứ hai của tháng 3 và kết thúc vào phút sau 1:59
(EDT) vào Chủ nhật đầu tiên của tháng 11:
UTC 3:MM 4:MM 5:MM 6:MM 7:MM 8:MM
EST 22:MM 23:MM 0:MM 1:MM 2:MM 3:MM
EDT 23:MM 0:MM 1:MM 2:MM 3:MM 4:MM

start 22:MM 23:MM 0:MM 1:MM 3:MM 4:MM

end 23:MM 0:MM 1:MM 1:MM 2:MM 3:MM

Khi DST bắt đầu (dòng “bắt đầu”), đồng hồ treo tường địa phương nhảy
từ 1:59 đến 3:00. Thời gian treo tường có dạng 2:MM không thực sự có
ý nghĩa vào ngày đó, vì vậy astimezone(Eastern)sẽ không mang lại kết
quả vào ngày DST bắt đầu. Ví dụ: tại chuyển tiếp mùa xuân năm 2016,
chúng tôi nhận được:hour == 2
>>>>>> from datetime import datetime, timezone
>>> from tzinfo_examples import HOUR, Eastern
>>> u0 = datetime(2016, 3, 13, 5, tzinfo=timezone.utc)
>>> for i in range(4):
... u = u0 + i*HOUR
... t = u.astimezone(Eastern)
... print(u.time(), 'UTC =', t.time(), t.tzname())
...
05:00:00 UTC = 00:00:00 EST
06:00:00 UTC = 01:00:00 EST
07:00:00 UTC = 03:00:00 EDT
08:00:00 UTC = 04:00:00 EDT

Khi DST kết thúc (dòng “kết thúc”), có một vấn đề tiềm ẩn tồi tệ
hơn: có một giờ không thể đánh vần rõ ràng theo giờ địa phương: giờ
cuối cùng của giờ ban ngày. Ở phương Đông, đó là thời gian có dạng
5:MM UTC vào ngày kết thúc thời gian ban ngày. Đồng hồ treo tường
địa phương nhảy từ 1:59 (giờ ban ngày) trở lại 1:00 (giờ chuẩn) một
lần nữa. Giờ địa phương có dạng 1:MM không rõ ràng. astimezone()bắt
chước hành vi của đồng hồ địa phương bằng cách ánh xạ hai giờ UTC
liền kề vào cùng một giờ địa phương. Trong ví dụ về phương Đông,
thời gian UTC có dạng 5:MM và 6:MM đều ánh xạ thành 1:MM khi được
chuyển đổi sang phương Đông, nhưng thời gian trước đó có thuộc tính
được đặt thành 0 và thời gian sau đó được đặt thành 1. Ví dụ fold:
tại Fall back transition năm 2016, chúng tôi nhận được:
>>>>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> for i in range(4):
... u = u0 + i*HOUR
... t = u.astimezone(Eastern)

46
... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0

Lưu ý rằng datetimecác trường hợp chỉ khác nhau về giá trị của
foldthuộc tính được coi là bằng nhau khi so sánh.

Các ứng dụng không thể chịu được sự mơ hồ về thời gian nên kiểm tra
rõ ràng giá trị của foldthuộc tính hoặc tránh sử dụng tzinfocác lớp
con kết hợp; không có sự mơ hồ khi sử dụng timezonehoặc bất kỳ
tzinfophân lớp bù cố định nào khác (chẳng hạn như một lớp chỉ đại
diện cho EST (bù cố định -5 giờ) hoặc chỉ EDT (bù cố định -4 giờ)).
Xem thêm
zoneinfo

Mô-đun này datetimecó một timezonelớp cơ bản (để xử lý các giá trị bù
trừ cố định tùy ý từ UTC) và timezone.utc thuộc tính của nó (một thể
hiện múi giờ UTC).
zoneinfođưa cơ sở dữ liệu múi giờ IANA (còn được gọi là cơ sở dữ
liệu Olson) vào Python và việc sử dụng cơ sở dữ liệu này được khuyến
nghị.
Cơ sở dữ liệu múi giờ IANA
Cơ sở dữ liệu Múi giờ (thường được gọi là tz, tzdata hoặc zoneinfo)
chứa mã và dữ liệu biểu thị lịch sử giờ địa phương cho nhiều vị trí
đại diện trên toàn cầu. Nó được cập nhật định kỳ để phản ánh những
thay đổi do các cơ quan chính trị thực hiện đối với ranh giới múi
giờ, độ lệch UTC và quy tắc tiết kiệm ánh sáng ban ngày.

timezone Objects¶
(timezone đối tượng)
Lớp này timezonelà một lớp con của tzinfo, mỗi phiên bản của nó đại
diện cho một múi giờ được xác định bởi một phần bù cố định từ UTC.
Các đối tượng của lớp này không thể được sử dụng để biểu thị thông
tin múi giờ ở những vị trí sử dụng các độ lệch khác nhau trong những
ngày khác nhau trong năm hoặc nơi những thay đổi lịch sử đã được
thực hiện đối với thời gian dân sự.
class datetime.timezone(offset, name=None)¶

47
ngày giờ của lớp . múi giờ ( offset , name = None )
Đối số offset phải được chỉ định làm timedelta đối tượng thể hiện sự
khác biệt giữa giờ địa phương và UTC. Nó phải nằm giữa -
timedelta(hours=24)và timedelta(hours=24), nếu không thì
ValueErrorđược nâng lên.

Đối số tên là tùy chọn. Nếu được chỉ định, nó phải là một chuỗi sẽ
được sử dụng làm giá trị được datetime.tzname()phương thức trả về.
Mới trong phiên bản 3.2.
Đã thay đổi trong phiên bản 3.7: Độ lệch UTC không bị giới hạn trong
toàn bộ số phút.
timezone.utcoffset(dt)
Múi giờ. utcoffset ( dt )
Trả về giá trị cố định được chỉ định khi timezonephiên bản được tạo.
Đối số dt bị bỏ qua. Giá trị trả về là một timedelta thể hiện bằng
với chênh lệch giữa giờ địa phương và UTC.
Đã thay đổi trong phiên bản 3.7: Độ lệch UTC không bị giới hạn trong
toàn bộ số phút.
timezone.tzname(dt)¶
Múi giờ. tzname ( dt )
Trả về giá trị cố định được chỉ định khi timezonephiên bản được tạo.
Nếu tên không được cung cấp trong hàm tạo, tên được trả về bởi
tzname(dt)được tạo từ giá trị offsetnhư sau. Nếu độ lệch là
timedelta(0), tên là “UTC”, nếu không, nó là một chuỗi ở định dạng
UTC±HH:MM, trong đó ± là dấu của offset, HH và MM lần lượt là hai chữ
số của offset.hoursvà offset.minutes.
Đã thay đổi trong phiên bản 3.6: Tên được tạo từ
offset=timedelta(0)giờ là đơn giản 'UTC', không phải 'UTC+00:00'.

timezone.dst(dt)¶
Múi giờ. dst ( dt )
Luôn luôn trở lại None.
timezone.fromutc(dt)¶
Múi giờ. fromutc ( dt )
trở lại . Đối số dt phải là một phiên bản nhận biết, được đặt
thành .dt + offsetdatetimetzinfoself
Thuộc tính lớp:
48
timezone.utc
Múi giờ. utc
Múi giờ UTC, timezone(timedelta(0)).

strftime() and strptime() Behavior¶


strftime()và strptime()Hành vi
date, datetimevà timecác đối tượng đều hỗ trợ một
strftime(format)phương thức, để tạo một chuỗi biểu thị thời gian dưới
sự kiểm soát của một chuỗi định dạng rõ ràng.
Ngược lại, datetime.strptime()phương thức lớp tạo một datetimeđối
tượng từ một chuỗi đại diện cho ngày giờ và một chuỗi định dạng
tương ứng.
Bảng dưới đây cung cấp so sánh cấp cao strftime() so với strptime():
strftime strptime
Chuyển đổi đối tượng thành Phân tích một chuỗi thành một
Cách sử dụng một chuỗi theo một định dạng datetimeđối tượng có định
nhất định dạng tương ứng
Loại phương pháp phương thức sơ thẩm phương pháp lớp
Phương pháp của date; datetime;time datetime
strptime(date_string,
Chữ ký strftime(format)
format)

strftime() and strptime() Format Codes


strftime()và strptime()Mã định dạng
Sau đây là danh sách tất cả các mã định dạng mà tiêu chuẩn C 1989
yêu cầu và chúng hoạt động trên tất cả các nền tảng có triển khai C
tiêu chuẩn.

chỉ thị Nghĩa Ví dụ ghi chú


CN, Mon, …, Sat
Ngày trong tuần là tên (en_US);
%a (1)
viết tắt của ngôn ngữ. Vì vậy, Mo, …, Sa
(de_DE)
Chủ Nhật, Thứ Hai, …,
Ngày trong tuần làm
Thứ Bảy (en_US);
%A tên đầy đủ của ngôn (1)
Sonntag, Montag, …,
ngữ.
Samstag (de_DE)
Ngày trong tuần dưới
dạng số thập phân,
%w 0, 1, …, 6
trong đó 0 là Chủ nhật
và 6 là Thứ bảy.

49
Ngày trong tháng dưới
%d dạng số thập phân 01, 02, …, 31 (9)
không đệm.
Tháng 1, Tháng 2, …,
Tháng là tên viết tắt Tháng 12 (en_US);
%b (1)
của ngôn ngữ. Tháng 1, Tháng 2, …,
Dez (de_DE)
Tháng Giêng, Tháng
Hai, …, Tháng Mười
Tháng là tên đầy đủ Hai (en_US);
%B (1)
của ngôn ngữ. Januar, Februar, …,
Tháng mười hai
(de_DE)
Tháng dưới dạng số
%m 01, 02, …, 12 (9)
thập phân không đệm.
Năm không có thế kỷ
%y dưới dạng số thập 00, 01, …, 99 (9)
phân không đệm.
Năm với thế kỷ dưới 0001, 0002, …, 2013,
%Y (2)
dạng số thập phân. 2014, …, 9998, 9999
Giờ (đồng hồ 24 giờ)
%H dưới dạng số thập 00, 01, …, 23 (9)
phân không đệm.
Giờ (đồng hồ 12 giờ)
%I dưới dạng số thập 01, 02, …, 12 (9)
phân không đệm.
Ngôn ngữ tương
AM, PM (en_US);
%p đương với AM hoặc (1), (3)
sáng, chiều (de_DE)
PM.
Phút dưới dạng số
%M 00, 01, …, 59 (9)
thập phân không đệm.
Thứ hai dưới dạng số
%S 00, 01, …, 59 (4), (9)
thập phân không đệm.
Micro giây dưới dạng
số thập phân, được 000000, 000001, …,
%f (5)
đệm bằng 0 thành 6 999999
chữ số.
UTC offset ở dạng
±HHMM[SS[.ffffff (trống), +0000, -0400,
%z ]](chuỗi trống nếu +1030, +063415, - (6)
đối tượng là ngây 030712.345216
thơ).
Tên múi giờ (chuỗi
%Z trống nếu đối tượng là (trống), UTC, GMT (6)
ngây thơ).
Ngày trong năm dưới
%j dạng số thập phân 001, 002, …, 366 (9)
không đệm.
%U Số tuần của năm (Chủ 00, 01, …, 53 (7), (9)
nhật là ngày đầu tiên

50
của tuần) dưới dạng
số thập phân không
đệm. Tất cả các ngày
trong năm mới trước
Chủ nhật đầu tiên
được coi là trong tuần
0.
Số tuần của năm (Thứ
Hai là ngày đầu tiên
của tuần) dưới dạng
số thập phân không
%W đệm. Tất cả các ngày 00, 01, …, 53 (7), (9)
trong năm mới trước
ngày thứ Hai đầu tiên
được coi là trong tuần
0.
Thứ ba ngày 16 tháng
8 21:30:00 1988
Đại diện ngày và giờ
(en_US);
%c thích hợp của địa (1)
Ngày 16 tháng 8,
phương.
21:30:00, 1988
(de_DE)
16/08/88 (Không có);
Đại diện ngày thích
%x 16/08/1988 (en_US); (1)
hợp của địa phương.
16.08.1988 (de_DE)
Đại diện thời gian
21:30:00 (vi_Mỹ);
%X thích hợp của địa (1)
21:30:00 (de_DE)
phương.
Một '%'nhân vật
%% %
theo nghĩa đen.
Một số chỉ thị bổ sung không bắt buộc theo tiêu chuẩn C89 được đưa
vào để thuận tiện. Tất cả các tham số này đều tương ứng với các giá
trị ngày tháng theo tiêu chuẩn ISO 8601.

chỉ thị Nghĩa Ví dụ ghi chú


Năm ISO 8601 với thế
kỷ đại diện cho năm 0001, 0002, …, 2013,
%G (số 8)
chứa phần lớn tuần 2014, …, 9998, 9999
ISO ( %V).
ISO 8601 ngày trong
tuần dưới dạng số
%u 1, 2, …, 7
thập phân trong đó 1
là thứ Hai.
ISO 8601 tuần dưới
dạng số thập phân với
%V Thứ Hai là ngày đầu 01, 02, …, 53 (8), (9)
tuần. Tuần 01 là tuần
có ngày 04/01.
Chúng có thể không có sẵn trên tất cả các nền tảng khi được sử dụng
với strftime() phương pháp này. Chỉ thị năm và tuần ISO 8601 không

51
thể thay thế cho nhau với chỉ thị số năm và tuần ở trên. Việc gọi
strptime()với các chỉ thị ISO 8601 không đầy đủ hoặc không rõ ràng
sẽ làm tăng lỗi ValueError.
Bộ mã định dạng đầy đủ được hỗ trợ khác nhau giữa các nền tảng, bởi
vì Python gọi strftime()chức năng của thư viện nền tảng C và các
biến thể nền tảng là phổ biến. Để xem toàn bộ mã định dạng được hỗ
trợ trên nền tảng của bạn, hãy tham khảo tài liệu strftime(3) . Cũng
có sự khác biệt giữa các nền tảng trong việc xử lý các thông số định
dạng không được hỗ trợ.
Mới trong phiên bản 3.6:%G và %uđã %Vđược thêm vào.

Technical Detail

Chi Tiết Kỹ Thuật


Nói rộng ra, d.strftime(fmt)hoạt động giống như timemô-đun mặc dù
không phải tất cả các đối tượng đều hỗ trợ một phương
thức.time.strftime(fmt, d.timetuple())timetuple()
Đối với datetime.strptime()phương thức lớp, giá trị mặc định là 1900-
01-01T00:00:00.000: bất kỳ thành phần nào không được chỉ định trong
chuỗi định dạng sẽ được lấy từ giá trị mặc định. 4
Sử dụng tương đương với:datetime.strptime(date_string, format)
datetime(*(time.strptime(date_string, format)[0:6]))

ngoại trừ khi định dạng bao gồm các thành phần giây phụ hoặc thông
tin bù múi giờ, được hỗ trợ trong datetime.strptimenhưng bị loại bỏ
bởi time.strptime.
Đối với timecác đối tượng, không nên sử dụng các mã định dạng cho
năm, tháng và ngày vì timecác đối tượng không có các giá trị như
vậy. Nếu chúng vẫn được sử dụng, 1900chúng sẽ được thay thế cho năm,
1tháng và ngày.

Đối với datecác đối tượng, không nên sử dụng mã định dạng cho giờ,
phút, giây và micro giây vì datecác đối tượng không có giá trị như
vậy. Nếu chúng vẫn được sử dụng, 0hãy thay thế cho chúng.
Vì lý do tương tự, việc xử lý các chuỗi định dạng chứa các điểm mã
Unicode không thể được biểu thị trong bộ ký tự của ngôn ngữ hiện tại
cũng phụ thuộc vào nền tảng. Trên một số nền tảng, các điểm mã như
vậy được giữ nguyên trong đầu ra, trong khi trên các nền tảng khác,
thay vào đó, strftimecó thể tăng UnicodeErrorhoặc trả về một chuỗi
trống.

52
Ghi chú:
Vì định dạng phụ thuộc vào ngôn ngữ hiện tại nên cần thận trọng khi
đưa ra các giả định về giá trị đầu ra. Thứ tự trường sẽ khác nhau
(ví dụ: “tháng/ngày/năm” so với “ngày/tháng/năm”) và đầu ra có thể
chứa các ký tự Unicode được mã hóa bằng mã hóa mặc định của ngôn ngữ
(ví dụ: nếu ngôn ngữ hiện tại là , thì mặc ja_JPđịnh mã hóa có thể
là bất kỳ một trong số eucJP, SJIShoặc utf-8; sử dụng
locale.getlocale() để xác định mã hóa của ngôn ngữ hiện tại).

Phương pháp này strptime()có thể phân tích cú pháp các năm trong
phạm vi [1, 9999] đầy đủ, nhưng các năm < 1000 phải được điền bằng 0
cho chiều rộng 4 chữ số.
Đã thay đổi trong phiên bản 3.2: Trong các phiên bản trước,
strftime()phương thức bị giới hạn trong các năm >= 1900.

Đã thay đổi trong phiên bản 3.3: Trong phiên bản 3.2,
strftime()phương pháp bị giới hạn ở số năm >= 1000.

Khi được sử dụng với strptime()phương thức, %plệnh chỉ ảnh hưởng đến
trường giờ đầu ra nếu %Ilệnh được sử dụng để phân tích cú pháp giờ.
Không giống như timemô-đun, datetimemô-đun không hỗ trợ giây nhảy
vọt.
Khi được sử dụng với strptime()phương thức, %flệnh chấp nhận từ một
đến sáu chữ số và số không ở bên phải. %flà một phần mở rộng cho tập
hợp các ký tự định dạng trong tiêu chuẩn C (nhưng được triển khai
riêng trong các đối tượng ngày giờ và do đó luôn có sẵn).
Đối với một đối tượng ngây thơ, các mã định dạng %zvà %Zđược thay
thế bằng các chuỗi rỗng.
Đối với một đối tượng nhận thức:
%z

a. utcoffset()được chuyển đổi thành một chuỗi có dạng


±HHMM[SS[.ffffff]], trong đó HHlà chuỗi 2 chữ số cho biết
số giờ bù UTC, MMlà chuỗi 2 chữ số cho biết số phút bù
UTC, SSlà chuỗi 2 chữ số cho biết số giờ bù UTC giây và
fffffflà một chuỗi gồm 6 chữ số cho biết số micro giây bù
UTC. Phần ffffffđược bỏ qua khi phần bù là số nguyên của
giây và cả phần ffffffvà SSphần được bỏ qua khi phần bù
là số nguyên của phút. Ví dụ: nếu utcoffset()trả về ,
được thay thế bằng chuỗi .timedelta(hours=-3, minutes=-
30)%z'-0330'

Đã thay đổi trong phiên bản 3.7: Độ lệch UTC không bị giới hạn trong
toàn bộ số phút.

53
Đã thay đổi trong phiên bản 3.7: Khi %zlệnh được cung cấp cho
strptime()phương thức, phần bù UTC có thể có dấu hai chấm làm dấu
phân cách giữa giờ, phút và giây. Ví dụ: '+01:00:00'sẽ được phân
tích cú pháp dưới dạng bù trừ một giờ. Ngoài ra, việc cung cấp
'Z'giống hệt với '+00:00'.
%Z
b. Trong strftime(), %Zđược thay thế bằng một chuỗi trống
nếu tzname()trả về None; mặt khác %Zđược thay thế bằng giá
trị được trả về, giá trị này phải là một chuỗi.
c. strptime()chỉ chấp nhận các giá trị nhất định cho %Z:
i. bất kỳ giá trị nào time.tznamecho ngôn ngữ máy của
bạn
ii. các giá trị được mã hóa cứng UTCvàGMT

d. Vì vậy, ai đó sống ở Nhật Bản có thể có JST, UTC, và


GMTlà các giá trị hợp lệ, nhưng có thể không EST. Nó sẽ
tăng ValueErrorcho các giá trị không hợp lệ.
Đã thay đổi trong phiên bản 3.2: Khi %zlệnh được cung cấp cho
strptime()phương thức, một datetimeđối tượng nhận biết sẽ được tạo.
Kết tzinfoquả sẽ được đặt thành một timezonethể hiện.
Khi được sử dụng với strptime()phương pháp %Uvà %Wchỉ được sử dụng
trong các phép tính khi ngày trong tuần và năm dương lịch ( %Y) được
chỉ định.
Tương tự như %Uvà %W, %Vchỉ được sử dụng trong các phép tính khi
ngày trong tuần và năm ISO ( %G) được chỉ định trong một
strptime()chuỗi định dạng. Cũng lưu ý rằng %Gvà %Ykhông thể hoán đổi
cho nhau.
Khi được sử dụng với strptime()phương pháp này, số 0 đứng đầu là tùy
chọn cho các định dạng %d, %m, %H, %I, %M, %S, %j, %U, %W, và %V.
Định dạng %ykhông yêu cầu số 0 đứng đầu.
chú thích
1
Nghĩa là, nếu chúng ta bỏ qua các tác động của Thuyết tương đối
2
Điều này phù hợp với định nghĩa của lịch “Dergreptic tiên tri” trong
cuốn sách Tính toán lịch của Dershowitz và Reingold , trong đó nó là
lịch cơ sở cho tất cả các phép tính. Xem cuốn sách để biết các thuật
toán chuyển đổi giữa các thứ tự Gregorian proleptic và nhiều hệ
thống lịch khác.

54
3
Xem hướng dẫn của RH van Gent về toán học của lịch ISO 8601 để có
giải thích tốt.
4
Vượt qua sẽ thất bại vì không phải là một năm
nhuận.datetime.strptime('Feb 29', '%b %d')1900

55

You might also like