datetime --- Các loại ngày và giờ cơ bản¶
Source code: Lib/datetime.py
Mô-đun datetime 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ợ nhưng 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.
Mẹo
Chuyển tới the format codes.
Xem thêm
- Mô-đun
calendar Các chức năng liên quan đến lịch chung.
- Mô-đun
time Truy cập thời gian và chuyển đổi.
- Mô-đun
zoneinfo Múi giờ cụ thể đại diện cho cơ sở dữ liệu múi giờ IANA.
- Gói dateutil
Thư viện của bên thứ ba với hỗ trợ phân tích cú pháp và múi giờ mở rộng.
- Gói DateType
Ví dụ, thư viện của bên thứ ba giới thiệu các loại tĩnh riêng biệt, cho phép static type checkers phân biệt giữa thời gian ngây thơ và thời gian nhận biết.
Đối tượng nhận thức và ngây thơ¶
Các đối tượng ngày và giờ có thể được phân loại là "nhận thức" 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 có thể áp dụng, chẳng hạn như thông tin về múi giờ và thời gian tiết kiệm ánh sáng ban ngày, một đối tượng aware có thể tự xác định vị trí của mình 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ể mà không thể diễn giải được. [1]
Đối tượng naive 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ơ biểu thị 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 tùy thuộc vào chương trình, giống như việc một số cụ thể biểu thị mét, dặm hay khối lượng là tùy thuộc vào chương trình. Những đối tượng ngây thơ rất dễ hiểu và dễ làm việc nhưng phải trả giá bằng việc 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, các đối tượng datetime và time có thuộc tính thông tin múi giờ tùy chọn, tzinfo, có thể được đặt thành một thể hiện của một lớp con của lớp tzinfo trừu tượng. Các đối tượng tzinfo này nắ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 lớp tzinfo cụ thể, lớp timezone, được cung cấp bởi mô-đun datetime. Lớp timezone có 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ô-đun datetime xuất các hằng số sau:
- datetime.UTC¶
Bí danh cho múi giờ UTC singleton
datetime.timezone.utc.Added in version 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 Gregory hiện tại đã và sẽ luôn có hiệu lực. Các thuộc tính:
year,monthvàday.
- class datetime.time
Một 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.) Thuộc tính:
hour,minute,second,microsecondvàtzinfo.
- class datetime.datetime
Sự kết hợp của ngày và giờ. Thuộc tính:
year,month,day,hour,minute,second,microsecond, vàtzinfo.
- class datetime.timedelta
Khoảng thời gian biểu thị sự khác biệt giữa hai phiên bản
datetimehoặcdatevớ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 các lớp
datetimevàtimesử dụng để cung cấp khái niệm có thể tùy chỉnh về điều chỉnh thời gian (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
Một lớp triển khai lớp cơ sở trừu tượng
tzinfodưới dạng phần bù cố định từ UTC.Added in version 3.2.
Các đối tượng thuộc loại này là bất biến.
Mối quan hệ lớp con:
Thuộc tính chung¶
Các loại date, datetime, time và timezone có chung những đặc điểm chung sau:
Xác định xem một đối tượng có nhận thức hay ngây thơ¶
Các đối tượng thuộc loại date luôn ngây thơ.
Một đối tượng thuộc loại time hoặc datetime có thể nhận biết được hoặc ngây thơ.
Đối tượng datetime d sẽ nhận biết được nếu cả hai điều sau đây đều đúng:
d.tzinfokhông phải làNoned.tzinfo.utcoffset(d)không trả vềNone
Nếu không thì d thật ngây thơ.
Đối tượng time t sẽ nhận biết được nếu cả hai điều sau đây đều đúng:
t.tzinfokhông phải làNonet.tzinfo.utcoffset(None)không trả vềNone.
Nếu không thì t thật ngây thơ.
Sự khác biệt giữa nhận thức và ngây thơ không áp dụng cho các đối tượng timedelta.
đối tượng timedelta¶
Đối tượng timedelta đại diện cho một khoảng thời gian, sự khác biệt giữa hai phiên bản datetime hoặc date.
- class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=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ố thực và có thể dương hoặc âm.
Chỉ days, seconds và microseconds được lưu trữ nội bộ. Các đối số được chuyển đổi thành các đơn vị đó:
Một mili giây được chuyển đổi thành 1000 micro giây.
Một phút được chuyển đổi thành 60 giây.
Một giờ được chuyển đổi thành 3600 giây.
Một tuần được quy đổi thành 7 ngày.
và ngày, giây và micro giây sau đó được chuẩn hóa sao cho biểu diễn là duy nhất, với
0 <= microseconds < 10000000 <= seconds < 3600*24(số giây trong một ngày)-999999999 <= days <= 999999999
Ví dụ sau minh họa cách mọi đối số 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ả đó:
>>> nhập ngày giờ dưới dạng dt >>> delta = dt.timedelta( ... ngày=50, ... giây=27, ... micro giây=10, ... mili giây=29000, ... phút=5, ... giờ=8, ... tuần=2 ... ) >>> # Only ngày, giây và micro giây vẫn còn >>> đồng bằng datetime.timedelta(ngày=64, giây=29156, micro giây=10)
Mẹo
import datetime as dtthay vìimport datetimehoặcfrom datetime import datetimeđể tránh nhầm lẫn giữa mô-đun và lớp. Xem How I Import Python’s datetime Module.Nếu bất kỳ đối số nào là số thực và có phân số micro giây, 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 nhịp từ nửa đến chẵn. Nếu không có đối số nào là float thì quá trình chuyển đổi và chuẩn hóa sẽ diễn ra chính xác (không có thông tin nào bị mất).
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ụ:
>>> nhập ngày giờ dưới dạng dt >>> d = dt.timedelta(micro giây=-1) >>> (d.ngày, d.giây, d.micro giây) (-1, 86399, 999999)
Vì cách biểu diễn chuỗi của các đối tượng
timedeltacó thể gây nhầm lẫn nên hãy sử dụng công thức sau để tạo định dạng dễ đọc hơn:>>> def beautiful_timedelta(td): ... nếu td.days >= 0: ... trả về str(td) ... trả về f'-({-td!s})' ... >>> d = timedelta(giờ=-1) >>> str(d) # not thân thiện với con người '-1 ngày, 23:00:00' >>> beautiful_timedelta(d) '-(1:00:00)'
Thuộc tính lớp:
- timedelta.max¶
Đối tượng
timedeltatích cực nhất,timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999).
- timedelta.resolution¶
Sự khác biệt nhỏ nhất có thể có giữa các đối tượng
timedeltakhông bằng nhau,timedelta(microseconds=1).
Lưu ý rằng, do chuẩn hóa nên timedelta.max lớn hơn -timedelta.min. -timedelta.max không thể biểu thị dưới dạng đối tượng timedelta.
Thuộc tính phiên bản (chỉ đọc):
- timedelta.days¶
Bao gồm từ -999.999.999 đến 999.999.999.
- timedelta.seconds¶
Bao gồm từ 0 đến 86.399.
Cảnh báo
Đây là một lỗi khá phổ biến khi mã vô tình sử dụng thuộc tính này khi nó thực sự nhằm mục đích nhận giá trị
total_seconds():>>> nhập ngày giờ dưới dạng dt >>> thời lượng = dt.timedelta(giây=11235813) >>> thời lượng.ngày, thời lượng.giây (130, 3813) >>> thời lượng.total_seconds() 11235813.0
- timedelta.microseconds¶
Bao gồm từ 0 đến 999.999.
Các hoạt động được hỗ trợ:
hoạt động |
kết quả |
|---|---|
|
Tổng của |
|
Sự khác biệt của |
|
Delta nhân với một số nguyên. Sau đó |
Nói chung |
|
|
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 timedelta.độ phân giải bằng cách sử dụng làm tròn nửa thành chẵn. |
|
Phân chia (3) thời lượng tổng thể |
|
Delta chia cho float hoặc int. Kết quả được làm tròn đến bội số gần nhất của timedelta.độ phân giải bằng cách sử dụng làm tròn nửa thành chẵn. |
|
Sàn được tính toán và phần còn lại (nếu có) sẽ bị vứt đi. 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 là đối tượng |
|
Tính thương và số dư: |
|
Trả về một đối tượng |
|
Tương đương với |
|
Tương đương với |
|
Trả về một chuỗi có dạng |
|
Trả về một chuỗi biểu diễn đối tượng |
Ghi chú:
Điều này là chính xác nhưng có thể tràn.
Điều này là chính xác và không thể tràn.
Chia cho 0 sẽ tăng
ZeroDivisionError.-timedelta.maxkhông được thể hiện dưới dạng đối tượngtimedelta.Biểu diễn chuỗi của các đối tượng
timedeltađượ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 các múi giờ âm. Ví dụ:>>> timedelta(giờ=-5) datetime.timedelta(ngày=-1, giây=68400) >>> in(_) -1 ngày, 19:00:00
Biểu thức
t2 - t3sẽ luôn bằng biểu thứct2 + (-t3)ngoại trừ khi t3 bằngtimedelta.max; trong trường hợp đó cái trước sẽ tạo ra kết quả trong khi cái sau sẽ tràn.
Ngoài các thao tác được liệt kê ở trên, các đối tượng timedelta còn hỗ trợ một số phép cộng và phép trừ nhất định với các đối tượng date và datetime (xem bên dưới).
Thay đổi trong phiên bản 3.2: Việc phân chia tầng và phân chia thực sự của một đối tượng timedelta cho một đối tượng timedelta khác hiện đã được hỗ trợ, cũng như các phép toán còn lại và chức năng divmod(). Hiện đã hỗ trợ phép chia và nhân thực sự của đối tượng timedelta với đối tượng float.
Các đối tượng timedelta hỗ trợ so sánh đẳng thức và thứ tự.
Trong ngữ cảnh Boolean, một đối tượng timedelta được coi là đúng khi và chỉ khi nó không bằng timedelta(0).
Các phương thức sơ thẩm:
- timedelta.total_seconds()¶
Trả về tổng số giây có trong thời lượng. Tương đương với
td / timedelta(seconds=1). Đối với các đơn vị khoảng không phải là giây, hãy sử dụng trực tiếp biểu mẫu chia (ví dụ:td / timedelta(microseconds=1)).Lưu ý rằng trong những khoảng thời gian rất lớn (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 độ chính xác đến micro giây.
Added in version 3.2.
Ví dụ về cách sử dụng: timedelta¶
Một ví dụ bổ sung về chuẩn hóa:
>>> # Components của another_year cộng lại đúng 365 ngày
>>> nhập ngày giờ dưới dạng dt
>>> năm = dt.timedelta(ngày=365)
>>> another_year = dt.timedelta(tuần=40, ngày=84, giờ=23,
... phút=50, giây=600)
>>> năm == another_year
đúng
>>> năm.total_seconds()
31536000.0
Ví dụ về số học timedelta:
>>> nhập ngày giờ dưới dạng dt
>>> năm = dt.timedelta(ngày=365)
>>> mười_năm = 10 * năm
>>> mười_năm
datetime.timedelta(ngày=3650)
>>> ten_year.days // 365
10
>>> chín_năm = mười_năm - năm
>>> chín_năm
datetime.timedelta(ngày=3285)
>>> ba_năm = chín_năm // 3
>>> ba_năm, ba_năm.ngày // 365
(datetime.timedelta(ngày=1095), 3)
đối tượng date¶
Đối tượng date đạ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 gọi là ngày thứ 1, ngày 2 tháng 1 của năm 1 gọi là ngày thứ 2, v.v. [2]
- class datetime.date(year, month, day)¶
Tất cả các đối số đều được yêu cầu. Đối số phải là số nguyên, trong phạm vi sau:
MINYEAR <= year <= MAXYEAR1 <= month <= 121 <= day <= number of days in the given month and year
Nếu một đối số nằm ngoài các phạm vi đó được đưa ra,
ValueErrorsẽ được đưa ra.
Các hàm tạo khác, tất cả các phương thức 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.fromtimestamp(timestamp)¶
Trả về ngày địa phương tương ứng với POSIX timestamp, chẳng hạn như được trả về bởi
time.time().Điều này có thể làm tăng
OverflowErrornếu dấu thời gian nằm ngoài phạm vi giá trị được hỗ trợ bởi hàmlocaltime()của nền tảng C và lỗiOSErrortrênlocaltime(). Đ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 giây nhuận trong khái niệm dấu thời gian của chúng, giây nhuận sẽ bịfromtimestamp()bỏ qua.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 hỗ trợ bởi hàmlocaltime()của nền tảng C. TăngOSErrorthay vìValueErrorkhilocaltime()bị lỗi.
- classmethod date.fromordinal(ordinal)¶
Trả về ngày tương ứng với ordinal Gregorian tiên sinh, trong đó ngày 1 tháng 1 của năm 1 có số thứ tự 1.
ValueErrorđược nâng lên trừ khi1 <= ordinal <= date.max.toordinal(). Cho bất kỳ ngày nàod,date.fromordinal(d.toordinal()) == d.
- classmethod date.fromisoformat(date_string)¶
Trả về một
datetươ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, với các ngoại lệ sau:Ngày chính xác giảm hiện không được hỗ trợ (
YYYY-MM,YYYY).Hiện tại, các biểu diễn ngày mở rộng không được hỗ trợ (
±YYYYYY-MM-DD).Ngày thứ tự hiện không được hỗ trợ (
YYYY-OOO).
Ví dụ:
>>> nhập ngày giờ dưới dạng dt >>> dt.date.fromisoformat('2019-12-04') datetime.date(2019, 12, 4) >>> dt.date.fromisoformat('20191204') datetime.date(2019, 12, 4) >>> dt.date.fromisoformat('2021-W01-1') datetime.date(2021, 1, 4)
Added in version 3.7.
Thay đổi trong phiên bản 3.11: Trước đây, phương pháp này chỉ hỗ trợ định dạng
YYYY-MM-DD.
- classmethod date.fromisocalendar(year, week, day)¶
Trả về
datetương ứng với ngày theo lịch ISO được chỉ định bởi year, week và day. Đây là nghịch đảo của hàmdate.isocalendar().Added in version 3.8.
- classmethod date.strptime(date_string, format)¶
Trả về
datetương ứng với date_string, được phân tích theo format. Điều này tương đương với:ngày(*(time.strptime(date_string, format)[0:3]))
ValueErrorđược tăng lên nếutime.strptime()không thể phân tích chuỗi ngày và định dạng hoặc nếu nó trả về một giá trị không phải là bộ dữ liệu thời gian. Xem thêm hành vi strftime() và strptime() vàdate.fromisoformat().Ghi chú
Nếu format chỉ định một ngày trong tháng mà không có năm thì
DeprecationWarningsẽ được phát ra. Điều này là để tránh lỗi năm nhuận bốn năm một lần trong mã tìm cách phân tích cú pháp chỉ một tháng và ngày vì năm mặc định được sử dụng khi không có năm nhuận trong định dạng không phải là năm nhuận. Các giá trị format như vậy có thể gây ra lỗi kể từ Python 3.15. Cách giải quyết là luôn thêm một năm vào format của bạn. Nếu phân tích cú pháp các giá trị date_string không có năm, hãy thêm rõ ràng một năm là năm nhuận trước khi phân tích cú pháp:>>> nhập ngày giờ dưới dạng dt >>> date_string = "29/02" >>> khi = dt.date.strptime(f"{date_string};1984", "%m/%d;%Y") lỗi năm nhuận # Avoids. >>> when.strftime("%B %d") 'Ngày 29 tháng 2'
Added in version 3.14.
Thuộc tính lớp:
- 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ể có giữa các đối tượng ngày không bằng nhau,
timedelta(days=1).
Thuộc tính phiên bản (chỉ đọc):
- date.month¶
Bao gồm từ 1 đến 12.
- date.day¶
Từ 1 đến số ngày trong tháng nhất định của năm nhất định.
Các hoạt động được hỗ trợ:
hoạt động |
kết quả |
|---|---|
|
|
|
Tính |
|
(3) |
date1 == date2date1 != date2 |
So sánh bình đẳng (4) |
date1 < date2date1 > date2date1 <= date2date1 >= date2 |
So sánh đơn hàng. (5) |
Ghi chú:
date2 được di chuyển về phía trước nếu
timedelta.days > 0hoặc lùi lại nếutimedelta.days < 0. Sau đódate2 - date1 == timedelta.days.timedelta.secondsvàtimedelta.microsecondsbị bỏ qua.OverflowErrorđược tăng lên nếudate2.yearnhỏ hơnMINYEARhoặc lớn hơnMAXYEAR.timedelta.secondsvàtimedelta.microsecondsbị bỏ qua.Điều này là chính xác và không thể tràn.
timedelta.secondsvàtimedelta.microsecondslà 0 vàdate2 + timedelta == date1theo sau.Các đối tượng
datesẽ bằng nhau nếu chúng đại diện cho cùng một ngày.Các đối tượng
datekhông phải là phiên bảndatetimekhông bao giờ bằng đối tượngdatetime, ngay cả khi chúng đại diện cho cùng một ngày.date1 được coi là nhỏ hơn date2 khi date1 đứng trước date2 về mặt thời gian. Nói cách khác,
date1 < date2khi và chỉ nếudate1.toordinal() < date2.toordinal().So sánh thứ tự giữa một đối tượng
datekhông phải là phiên bảndatetimevà một đối tượngdatetimetăngTypeError.
Thay đổi trong phiên bản 3.13: So sánh giữa đối tượng datetime và một phiên bản của lớp con date không phải là lớp con datetime không còn chuyển đổi đối tượng sau thành date, bỏ qua phần thời gian và múi giờ. Hành vi mặc định có thể được thay đổi bằng cách ghi đè các phương thức so sánh đặc biệt trong các lớp con.
Trong ngữ cảnh Boolean, tất cả các đối tượng date đều được coi là đúng.
Các phương thức sơ thẩm:
- date.replace(year=self.year, month=self.month, day=self.day)¶
Trả về một đối tượng
datemới có cùng giá trị nhưng đã cập nhật các tham số đã chỉ định.Ví dụ:
>>> nhập ngày giờ dưới dạng dt >>> d = dt.date(2002, 12, 31) >>> d.replace(day=26) datetime.date(2002, 12, 26)
Hàm chung
copy.replace()cũng hỗ trợ các đối tượngdate.
- date.timetuple()¶
Trả về một
time.struct_timechẳng hạn như được trả về bởitime.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() + 1là 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 tiên sinh 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 đối tượng
dated,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, Thứ Tư. Xem thêmisoweekday().
- 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, Thứ Tư. Xem thêmweekday(),isocalendar().
- date.isocalendar()¶
Trả về một đối tượng named tuple có 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 Gregory. [3]
Năm ISO bao gồm 52 hoặc 53 tuần đầy đủ và 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 năm ISO là tuần theo 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 thứ Năm đó giống với năm Gregory của nó.
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:
>>> nhập ngày giờ dưới dạng dt >>> dt.date(2003, 12, 29).isocalendar() datetime.IsoCalendarDate(năm=2004, tuần=1, ngày trong tuần=1) >>> dt.date(2004, 1, 4).isocalendar() datetime.IsoCalendarDate(năm=2004, tuần=1, ngày trong tuần=7)
Thay đổi trong phiên bản 3.9: Kết quả đã thay đổi từ một bộ dữ liệu thành named tuple.
- date.isoformat()¶
Trả về một chuỗi biểu thị ngày ở định dạng ISO 8601,
YYYY-MM-DD:>>> nhập ngày giờ dưới dạng dt >>> dt.date(2002, 12, 4).isoformat() '2002-12-04'
- date.__str__()¶
Đối với một ngày
d,str(d)tương đương vớid.isoformat().
- date.ctime()¶
Trả về một chuỗi đại diện cho ngày tháng:
>>> nhập ngày giờ dưới dạng dt >>> dt.date(2002, 12, 4).ctime() 'Thứ Tư ngày 4 tháng 12 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 có hàm C
ctime()gốc (màtime.ctime()gọi nhưngdate.ctime()không gọi) tuân thủ tiêu chuẩn C.
- date.strftime(format)¶
Trả về một chuỗi biểu thị ngày tháng, được kiểm soát bởi một chuỗi định dạng rõ ràng. Mã định dạng tham chiếu đến giờ, phút hoặc giây sẽ có giá trị 0. Xem thêm hành vi strftime() và strptime() và
date.isoformat().
- date.__format__(format)¶
Tương tự với
date.strftime()Điều này cho phép chỉ định chuỗi định dạng cho đối tượngdatetrong formatted string literals và khi sử dụngstr.format(). Xem thêm hành vi strftime() và strptime() vàdate.isoformat().
Ví dụ về cách sử dụng: date¶
Ví dụ về đếm số ngày cho một sự kiện:
>>> thời gian nhập khẩu
>>> nhập ngày giờ dưới dạng dt
>>> hôm nay = dt.date.today()
>>> hôm nay
datetime.date(2007, 12, 5)
>>> hôm nay == dt.date.fromtimestamp(time.time())
đúng
>>> my_birthday = dt.date(today.year, 6, 24)
>>> nếu my_birthday < hôm nay:
... my_birthday = my_birthday.replace(year=today.year + 1)
...
>>> sinh nhật của tôi
datetime.date(2008, 6, 24)
>>> time_to_birthday = abs(my_birthday - hôm nay)
>>> time_to_birthday.days
202
Thêm ví dụ về làm việc với date:
>>> nhập ngày giờ dưới dạng dt
>>> d = dt.date.fromorder(730920) # 730920th ngày sau 1. 1. 0001
>>> d
datetime.date(2002, 3, 11)
>>> # Methods liên quan đến định dạng đầu ra chuỗi
>>> d.isoformat()
'2002-03-11'
>>> d.strftime("%d/%m/%y")
'03/11/02'
>>> d.strftime("%A %d. %B %Y")
'Thứ Hai ngày 11 tháng 3 năm 2002'
>>> d.ctime()
'Thứ Hai ngày 11 tháng 3 00:00:00 2002'
>>> '{1} là {0:%d}, {2} là {0:%B}.'.format(d, "day", "month")
'Ngày là 11, tháng là tháng ba.'
>>> # Methods để trích xuất 'thành phần' theo các lịch khác nhau
>>> t = d.timetuple()
>>> cho tôi trong t:
... in(i)
2002 # year
3 # month
11 # day
0
0
0
0 # weekday (0 = Thứ Hai)
Ngày 70 # 70th trong năm
-1
>>> ic = d.isocalendar()
>>> cho i trong ic:
... in(i)
2002 # ISO năm
Số tuần 11 # ISO
1 số ngày # ISO ( 1 = Thứ Hai )
>>> đối tượng ngày # A là bất biến; tất cả các hoạt động tạo ra một đối tượng mới
>>> d.replace(năm=2005)
datetime.date(2005, 3, 11)
đối tượng datetime¶
Đối tượng datetime là một đối tượng chứa tất cả thông tin từ đối tượng date và đối tượng time.
Giống như đối tượng date, datetime giả định lịch Gregory hiện tại được mở rộng theo cả hai hướng; giống như một đối tượng time, datetime giả định 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)¶
Các đối số year, month và day là bắt buộc. tzinfo có thể là
Nonehoặc một phiên bản của lớp contzinfo. Các đối số còn lại phải là số nguyên trong phạm vi sau:MINYEAR <= year <= MAXYEAR,1 <= month <= 12,1 <= day <= number of days in the given month and year,0 <= hour < 24,0 <= minute < 60,0 <= second < 60,0 <= microsecond < 1000000,fold in [0, 1].
Nếu một đối số nằm ngoài các phạm vi đó được đưa ra,
ValueErrorsẽ được đưa ra.Thay đổi trong phiên bản 3.6: Đã thêm tham số fold.
Các hàm tạo khác, tất cả các phương thức lớp:
- classmethod datetime.today()¶
Trả về ngày giờ địa phương hiện tại với
tzinfoNone.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ó tham sốtz.
- classmethod datetime.now(tz=None)¶
Trả về ngày giờ địa phương hiện tại.
Nếu đối số tùy chọn tz là
Nonehoặc không được chỉ định, thì đối số 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 xem qua dấu thời giantime.time()(ví dụ: điều này có thể thực hiện được trên các nền tảng cung cấp chức năng Cgettimeofday()).Nếu tz không phải là
Nonethì đó phải là một phiên bản của lớp contzinfovà 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 ưu tiên hơn
today()vàutcnow().Ghi chú
Các cuộc gọi tiếp theo tới
datetime.now()có thể trả về cùng một thời điểm tùy thuộc vào độ chính xác của đồng hồ cơ bản.
- classmethod datetime.utcnow()¶
Trả về ngày và giờ UTC hiện tại, với
tzinfoNone.Điều này giống như
now(), nhưng trả về ngày và giờ UTC hiện tại, như một đối tượngdatetimengây thơ. Có thể lấy được ngày giờ UTC hiện tại bằng cách gọidatetime.now(timezone.utc). Xem thêmnow().Cảnh báo
Vì các đối tượng
datetimengây thơ được nhiều phương thứcdatetimexử lý như thời gian cục bộ nên nên sử dụng các thời gian nhận biết được để biểu thị thời gian trong UTC. Do đó, cách được khuyến nghị để tạo một đối tượng biểu thị thời gian hiện tại trong UTC là gọidatetime.now(timezone.utc).Sắp loại bỏ từ phiên bản 3.12: Thay vào đó hãy sử dụng
datetime.now()vớiUTC.
- classmethod datetime.fromtimestamp(timestamp, tz=None)¶
Trả về ngày và giờ đị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(). Nếu đối số tùy chọn tz làNonehoặc không được chỉ định, thì dấu thời gian sẽ được chuyển đổi thành ngày và giờ cục bộ của nền tảng và đối tượngdatetimeđược trả về là không có giá trị.Nếu tz không phải là
Nonethì nó phải là một phiên bản của lớp contzinfovà dấu thời gian được chuyển đổi thành múi giờ của tz.fromtimestamp()có thể tăngOverflowErrornếu dấu thời gian nằm ngoài phạm vi giá trị được hỗ trợ bởi các hàmlocaltime()hoặcgmtime()của nền tảng C vàOSErrortrênlocaltime()hoặcgmtime()bị lỗi. Đ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 giây nhuận trong khái niệm dấu thời gian của chúng, các giây nhuận bịfromtimestamp()bỏ qua và khi đó có thể có hai dấu thời gian khác nhau một giây tạo ra các đối tượngdatetimegiống hệt nhau. Phương pháp này được ưa thích hơnutcfromtimestamp().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 hỗ trợ bởi các hàmlocaltime()hoặcgmtime()của nền tảng C. TăngOSErrorthay vìValueErrorkhi lỗilocaltime()hoặcgmtime().Thay đổi trong phiên bản 3.6:
fromtimestamp()có thể trả về các phiên bản cófoldđược đặt thành 1.
- classmethod datetime.utcfromtimestamp(timestamp)¶
Trả về UTC
datetimetương ứng với timestamp POSIX, vớitzinfoNone. (Đối tượng kết quả là ngây thơ.)Điều này có thể làm tăng
OverflowErrornếu dấu thời gian nằm ngoài phạm vi giá trị được hỗ trợ bởi hàmgmtime()của nền tảng C và lỗiOSErrortrêngmtime(). Thông thường điều này sẽ bị giới hạn trong các năm từ 1970 đến 2038.Để nhận biết đối tượng
datetime, hãy gọifromtimestamp():datetime.fromtimestamp(dấu thời gian, timezone.utc)
Trên nền tảng tương thích POSIX, nó tương đương với biểu thức sau:
datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(giây=dấu thời gian)
ngoại trừ công thức sau luôn hỗ trợ phạm vi đầy đủ theo năm: bao gồm từ
MINYEARđếnMAXYEAR.Cảnh báo
Vì các đối tượng
datetimengây thơ được nhiều phương thứcdatetimexử lý như thời gian cục bộ nên nên sử dụng các thời gian nhận biết được để biểu thị thời gian trong UTC. Do đó, cách được khuyến nghị để tạo đối tượng đại diện cho dấu thời gian cụ thể trong UTC là gọidatetime.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 hỗ trợ bởi hàmgmtime()của nền tảng C. TăngOSErrorthay vìValueErrorkhigmtime()bị lỗi.Thay đổi trong phiên bản 3.15: Chấp nhận bất kỳ số thực nào dưới dạng timestamp, không chỉ số nguyên hoặc số float.
Sắp loại bỏ từ phiên bản 3.12: Thay vào đó hãy sử dụng
datetime.fromtimestamp()vớiUTC.
- classmethod datetime.fromordinal(ordinal)¶
Trả về
datetimetương ứng với thứ tự Gregorian tiên sinh, trong đó ngày 1 tháng 1 của năm 1 có thứ tự 1.ValueErrorđược nâng lên trừ khi1 <= ordinal <= datetime.max.toordinal(). Giờ, phút, giây và micro giây của kết quả đều bằng 0 vàtzinfolàNone.
- classmethod datetime.combine(date, time, tzinfo=time.tzinfo)¶
Trả về một đối tượng
datetimemới có thành phần ngày bằng đối tượngdateđã cho và có thành phần thời gian bằng đối tượngtimeđã cho. Nếu đối số tzinfo được cung cấp, giá trị của nó sẽ được sử dụng để đặt thuộc tínhtzinfocủa kết quả, nếu không thì thuộc tínhtzinfocủa đối số time sẽ được sử dụng. Nếu đối số date là đối tượngdatetimethì các thành phần thời gian và thuộc tínhtzinfocủa nó sẽ bị bỏ qua.Đối với mọi đối tượng
datetimed,d == datetime.combine(d.date(), d.time(), d.tzinfo).Thay đổi trong phiên bản 3.6: Đã thêm đối số tzinfo.
- classmethod datetime.fromisoformat(date_string)¶
Trả về
datetimetương ứng với date_string ở bất kỳ định dạng ISO 8601 hợp lệ nào, với các ngoại lệ sau:Độ lệch múi giờ có thể có số giây phân số.
Dấu phân cách
Tcó thể được thay thế bằng bất kỳ ký tự unicode đơn nào.Phân số giờ và phút không được hỗ trợ.
Ngày chính xác giảm hiện không được hỗ trợ (
YYYY-MM,YYYY).Hiện tại, các biểu diễn ngày mở rộng không được hỗ trợ (
±YYYYYY-MM-DD).Ngày thứ tự hiện không được hỗ trợ (
YYYY-OOO).
Ví dụ:
>>> import datetime as dt >>> dt.datetime.fromisoformat('2011-11-04') datetime.datetime(2011, 11, 4, 0, 0) >>> dt.datetime.fromisoformat('20111104') datetime.datetime(2011, 11, 4, 0, 0) >>> dt.datetime.fromisoformat('2011-11-04T00:05:23') datetime.datetime(2011, 11, 4, 0, 5, 23) >>> dt.datetime.fromisoformat('2011-11-04T00:05:23Z') datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc) >>> dt.datetime.fromisoformat('20111104T000523') datetime.datetime(2011, 11, 4, 0, 5, 23) >>> dt.datetime.fromisoformat('2011-W01-2T00:05:23.283') datetime.datetime(2011, 1, 4, 0, 5, 23, 283000) >>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000) >>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283+00:00') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc) >>> dt.datetime.fromisoformat('2011-11-04T00:05:23+04:00') datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
Added in version 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ặcdatetime.isoformat().
- classmethod datetime.fromisocalendar(year, week, day)¶
Trả về
datetimetương ứng với ngày theo lịch ISO được chỉ định bởi year, week và day. Các thành phần không phải ngày của datetime được điền với các giá trị mặc định thông thường của chúng. Đây là nghịch đảo của hàmdatetime.isocalendar().Added in version 3.8.
- classmethod datetime.strptime(date_string, format)¶
Trả về
datetimetương ứng với date_string, được phân tích theo format.Nếu format không chứa thông tin micro giây hoặc múi giờ thì điều này tương đương với:
datetime(*(time.strptime(date_string, format)[0:6]))
ValueErrorđược tăng lên nếutime.strptime()không thể phân tích chuỗi ngày và định dạng hoặc nếu nó trả về một giá trị không phải là bộ dữ liệu thời gian. Xem thêm hành vi strftime() và strptime() vàdatetime.fromisoformat().Thay đổi trong phiên bản 3.13: Nếu format chỉ định một ngày trong tháng mà không có năm thì
DeprecationWarningsẽ được phát ra. Điều này là để tránh lỗi năm nhuận bốn năm một lần trong mã tìm cách phân tích cú pháp chỉ một tháng và ngày vì năm mặc định được sử dụng khi không có năm nhuận trong định dạng không phải là năm nhuận. Các giá trị format như vậy có thể gây ra lỗi kể từ Python 3.15. Cách giải quyết là luôn thêm một năm vào format của bạn. Nếu phân tích cú pháp các giá trị date_string không có năm, hãy thêm rõ ràng một năm là năm nhuận trước khi phân tích cú pháp:>>> nhập ngày giờ dưới dạng dt >>> date_string = "29/02" >>> khi = dt.datetime.strptime(f"{date_string};1984", "%m/%d;%Y") lỗi năm nhuận # Avoids. >>> when.strftime("%B %d") 'Ngày 29 tháng 2'
Thuộc tính lớp:
- datetime.max¶
Đại diện mới nhất là
datetime,datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None).
- datetime.resolution¶
Sự khác biệt nhỏ nhất có thể có giữa các đối tượng
datetimekhông bằng nhau,timedelta(microseconds=1).
Thuộc tính phiên bản (chỉ đọc):
- datetime.month¶
Bao gồm từ 1 đến 12.
- datetime.day¶
Từ 1 đến số ngày trong tháng nhất định của năm nhất định.
- datetime.hour¶
Trong
range(24).
- datetime.minute¶
Trong
range(60).
- datetime.second¶
Trong
range(60).
- datetime.microsecond¶
Trong
range(1000000).
- datetime.tzinfo¶
Đối tượng được truyền dưới dạng đối số tzinfo cho hàm tạo
datetimehoặcNonenếu không có đối số nào được truyền.
- datetime.fold¶
Trong
[0, 1]. Được sử dụng để phân biệt thời gian trên 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ồ được quay ngược vào cuối thời gian 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 và 1 lần lượt biểu thị thời điểm sớm hơn và muộn hơn của hai thời điểm có cùng cách biểu thị thời gian trên tường.Added in version 3.6.
Các hoạt động được hỗ trợ:
hoạt động |
kết quả |
|---|---|
|
(1) |
|
(2) |
|
(3) |
datetime1 == datetime2datetime1 != datetime2 |
So sánh bình đẳng (4) |
datetime1 < datetime2datetime1 > datetime2datetime1 <= datetime2datetime1 >= datetime2 |
So sánh đơn hàng. (5) |
datetime2là khoảng thời giantimedeltabị xóa khỏidatetime1, tiến lên theo thời gian nếutimedelta.days > 0hoặc lùi lại nếutimedelta.days < 0. Kết quả có thuộc tínhtzinfogiống như ngày giờ đầu vào vàdatetime2 - datetime1 == timedeltasau đó.OverflowErrorđược nâng lên nếudatetime2.yearnhỏ hơnMINYEARhoặc lớn hơnMAXYEAR. Lưu ý rằng không có điều chỉnh múi giờ nào được thực hiện ngay cả khi đầu vào là đối tượng nhận biết.Tính
datetime2sao chodatetime2 + timedelta == datetime1. Ngoài ra, kết quả có thuộc tínhtzinfogiống như ngày giờ đầu vào và không thực hiện điều chỉnh múi giờ ngay cả khi đầu vào nhận biết được.Phép trừ
datetimetừdatetimechỉ được xác định nếu cả hai toán hạng đều nguyên hoặc nếu cả hai đều biết. Nếu một người biết và người kia ngây thơ,TypeErrorsẽ được nâng lên.Nếu cả hai đều ngây thơ hoặc cả hai đều biết và có cùng thuộc tính
tzinfothì thuộc tínhtzinfosẽ bị bỏ qua và kết quả là một đối tượngtimedeltatsao chodatetime2 + t == datetime1. Không có điều chỉnh múi giờ nào được thực hiện trong trường hợp này.Nếu cả hai đều biết và có các thuộc tính
tzinfokhác nhau, thìa-bsẽ hoạt động như thểavàblần đầu tiên được chuyển đổi thành các thời gian dữ liệu UTC ngây thơ. Kết quả là(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset())ngoại trừ việc triển khai không bao giờ bị tràn.Các đối tượng
datetimesẽ bằng nhau nếu chúng đại diện cho cùng ngày và giờ, có tính đến múi giờ.Các đối tượng
datetimengây thơ và nhận thức không bao giờ bằng nhau.Nếu cả hai đối tượng so sánh đều nhận biết và có cùng thuộc tính
tzinfothì thuộc tínhtzinfovàfoldsẽ bị bỏ qua và thời gian cơ sở sẽ được so sánh. Nếu cả hai đối tượng so sánh đều nhận biết và có các thuộc tínhtzinfokhác nhau, thì đối tượng so sánh đóng vai trò là đối tượng so sánh lần đầu tiên được chuyển đổi thành thời gian dữ liệu UTC ngoại trừ việc triển khai không bao giờ bị tràn. Các phiên bảndatetimetrong một khoảng thời gian lặp lại không bao giờ bằng các phiên bảndatetimeở múi giờ khác.datetime1 được coi là nhỏ hơn datetime2 khi datetime1 đứng trước datetime2 về mặt thời gian, có tính đến múi giờ.
So sánh thứ tự giữa các đối tượng
datetimengây thơ và nhận thức làm tăngTypeError.Nếu cả hai đối tượng so sánh đều nhận biết và có cùng thuộc tính
tzinfothì thuộc tínhtzinfovàfoldsẽ bị bỏ qua và thời gian cơ sở sẽ được so sánh. Nếu cả hai đối tượng so sánh đều nhận biết và có các thuộc tínhtzinfokhác nhau thì đối tượng so sánh đóng vai trò là đối tượng so sánh lần đầu tiên được chuyển đổi thành thời gian dữ liệu UTC ngoại trừ việc triển khai không bao giờ bị tràn.
Thay đổi trong phiên bản 3.3: So sánh bình đẳng giữa các trường hợp datetime có nhận thức và ngây thơ không làm tăng TypeError.
Thay đổi trong phiên bản 3.13: So sánh giữa đối tượng datetime và một phiên bản của lớp con date không phải là lớp con datetime không còn chuyển đổi đối tượng sau thành date, bỏ qua phần thời gian và múi giờ. Hành vi mặc định có thể được thay đổi bằng cách ghi đè các phương thức so sánh đặc biệt trong các lớp con.
Các phương thức sơ thẩm:
- datetime.time()¶
Trả về đối tượng
timecó cùng giờ, phút, giây, micro giây và gấp lại.tzinfolàNone. Xem thêm phương pháptimetz().Thay đổi trong phiên bản 3.6: Giá trị gấp được sao chép vào đối tượng
timeđược trả về.
- datetime.timetz()¶
Trả về đối tượng
timecó cùng thuộc tính giờ, phút, giây, micro giây, gấp và tzinfo. Xem thêm phương pháptime().Thay đổi trong phiên bản 3.6: Giá trị gấp được sao chép vào đối tượng
timeđượ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)¶
Trả về một đối tượng
datetimemới có cùng thuộc tính nhưng đã cập nhật các tham số đã chỉ định. Lưu ý rằngtzinfo=Nonecó thể được chỉ định để tạo một ngày giờ đơn giản từ một ngày giờ nhận biết mà không cần chuyển đổi dữ liệu ngày và giờ.Các đối tượng
datetimecũng được hỗ trợ bởi hàm chungcopy.replace().Thay đổi trong phiên bản 3.6: Đã thêm tham số fold.
- datetime.astimezone(tz=None)¶
Trả về một đối tượng
datetimevới thuộc tínhtzinfomớ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.Nếu được cung cấp, tz phải là một phiên bản của lớp con
tzinfovà các phương thứcutcoffset()vàdst()của nó không được trả vềNone. Nếu self chưa rõ ràng thì nó được coi là biểu thị thời gian theo 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 là múi giờ đích. Thuộc tính.tzinfocủa phiên bản datetime đã chuyển đổi sẽ được đặt thành phiên bảntimezonevới tên vùng và độ lệch thu được từ HĐH.Nếu
self.tzinfolà tz,self.astimezone(tz)bằng self: không thực hiện điều chỉnh dữ liệu ngày hoặc giờ. Ngược lại, kết quả là giờ địa phương trong múi giờ tz, thể hiện cùng thời gian UTC với self: sauastz = dt.astimezone(tz),astz - astz.utcoffset()sẽ có cùng dữ liệu ngày và giờ vớidt - dt.utcoffset().Nếu bạn chỉ muốn đính kèm một đối tượng
timezonetz vào một dt datetime mà không điều chỉnh dữ liệu ngày và giờ, hãy sử dụngdt.replace(tzinfo=tz). Nếu bạn chỉ muốn xóa đối tượngtimezonekhỏi dt datetime đã biết mà không cần chuyển đổi dữ liệu ngày và giờ, hãy sử dụngdt.replace(tzinfo=None).Lưu ý rằng phương thức
tzinfo.fromutc()mặc định có thể bị ghi đè trong lớp contzinfođể ảnh hưởng đến kết quả được trả về bởiastimezone(). Bỏ qua các trường hợp lỗi,astimezone()hoạt động như sau:def astimezone(self, tz): nếu self.tzinfo là tz: tự trở về # Convert tự thành UTC và đính kèm đối tượng múi giờ mới. utc = (self - self.utcoffset()).replace(tzinfo=tz) # Convert từ UTC đến giờ địa phương của tz. trả về tz.fromutc(utc)
Thay đổi trong phiên bản 3.3: tz bây giờ có thể được bỏ qua.
Thay đổi trong phiên bản 3.6: Phương thức
astimezone()hiện có thể được gọi trên các phiên bản đơn giản được cho là đại diện cho giờ cục bộ của hệ thống.
- datetime.utcoffset()¶
Nếu
tzinfolàNone, trả vềNone, nếu không thì 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 đối tượngtimedeltacó cường độ nhỏ hơn một ngày.Thay đổi trong phiên bản 3.7: Phần bù UTC không bị giới hạn trong toàn bộ số phút.
- datetime.dst()¶
Nếu
tzinfolàNone, trả vềNone, nếu không thì 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 đối tượngtimedeltacó cường độ nhỏ hơn một ngày.Thay đổi trong phiên bản 3.7: Phần bù DST không bị giới hạn trong toàn bộ số phút.
- datetime.tzname()¶
Nếu
tzinfolàNone, trả vềNone, nếu không thì 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ả về một
time.struct_timechẳng hạn như được trả về bởitime.localtime().d.timetuple()tương đương với:time.struct_time((d.year, d.month, d.day, d.giờ, d.phút, d.giây, d.weekday(), yday, dst))
trong đó
yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1là 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_isdstcủa kết quả được đặt theo phương thứcdst():tzinfolàNonehoặcdst()trả vềNone,tm_isdstđược đặt thành-1; ngược lại, nếudst()trả về giá trị khác 0,tm_isdstđược đặt thành 1; nếu không thìtm_isdstđược đặt thành 0.
- datetime.utctimetuple()¶
Nếu phiên bản
datetimedlà ngây thơ thì điều này giống vớid.timetuple()ngoại trừ việctm_isdstbị buộc về 0 bất kểd.dst()trả về giá trị gì. DST không bao giờ có hiệu lực trong thời gian UTC.Nếu
dnhận biết được,dđược chuẩn hóa thành thời gian UTC, bằng cách trừ đid.utcoffset()và trả vềtime.struct_timecho thời gian chuẩn hóa.tm_isdstbị buộc về 0. Lưu ý rằngOverflowErrorcó thể được tăng lên nếud.yearlàMINYEARhoặcMAXYEARvà việc điều chỉnh UTC vượt quá ranh giới một năm.Cảnh báo
Bởi vì các đối tượng
datetimengây thơ được nhiều phương thứcdatetimexử lý như thời gian cục bộ, nên sử dụng các thời gian nhận biết được để biểu thị thời gian trong UTC; do đó, việc sử dụngdatetime.utctimetuple()có thể cho kết quả sai lệch. Nếu bạn có mộtdatetimengây thơ đại diện cho UTC, hãy sử dụngdatetime.replace(tzinfo=timezone.utc)để nhận biết, tại thời điểm đó bạn có thể sử dụngdatetime.timetuple().
- datetime.toordinal()¶
Trả về thứ tự Gregorian tiên tri của ngày. Tương tự với
self.date().toordinal()
- datetime.timestamp()¶
Trả về dấu thời gian POSIX tương ứng với phiên bản
datetime. Giá trị trả về làfloattương tự như giá trị được trả về bởitime.time().Các phiên bản
datetimengây thơ được coi là đại diện cho giờ địa phương và phương pháp này dựa trên hàmmktime()của nền tảng C để thực hiện chuyển đổi. Vìdatetimehỗ trợ phạm vi giá trị rộng hơnmktime()trên nhiều nền tảng nên phương pháp này có thể tăngOverflowErrorhoặcOSErrortrong thời gian xa trong quá khứ hoặc xa trong tương lai.Đối với các phiên bản
datetimeđã biết, giá trị trả về được tính là:(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
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 phiên bản
datetimeđơn giản 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, bạn có thể lấy dấu thời gian POSIX bằng cách cung cấptzinfo=timezone.utc:dấu thời gian = 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
dấu thời gian = (dt - datetime(1970, 1, 1)) / timedelta(giây=1)
Added in version 3.3.
Thay đổi trong phiên bản 3.6: Phương thức
timestamp()sử dụng thuộc tínhfoldđể phân biệt thời gian trong một khoảng thời gian lặp lại.
- datetime.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. Tương tự như
self.date().weekday(). Xem thêmisoweekday().
- 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êmweekday(),isocalendar().
- datetime.isocalendar()¶
Trả về named tuple với ba thành phần:
year,weekvàweekday. Tương tự vớiself.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ếumicrosecondkhác 0YYYY-MM-DDTHH:MM:SS, nếumicrosecondlà 0
Nếu
utcoffset()không trả vềNone, một chuỗi sẽ được nối thêm, tạo ra giá trị bù UTC:YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]], nếumicrosecondkhác 0YYYY-MM-DDTHH:MM:SS+HH:MM[:SS[.ffffff]], nếumicrosecondlà 0
Ví dụ:
>>> nhập ngày giờ dưới dạng dt >>> dt.datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat() '2019-05-18T15:17:08.132263' >>> dt.datetime(2019, 5, 18, 15, 17, tzinfo=dt.timezone.utc).isoformat() '2019-05-18T15:17:00+00:00'
Đối số tùy chọn sep (
'T'mặc định) là dấu phân cách một ký tự, được đặt giữa phần ngày và giờ của kết quả. Ví dụ:>>> nhập ngày giờ dưới dạng dt >>> lớp TZ(dt.tzinfo): ... """Múi giờ có độ lệch -06:39 tùy ý, không đổi.""" ... def utcoffset(tự, khi nào): ... trả về dt.timedelta(giờ=-6, phút=-39) ... >>> dt.datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ') '2002-12-25 00:00:00-06:39' >>> dt.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 tại thời điểm cần đưa vào (mặc định là
'auto'). Nó có thể là một trong những điều sau đây:'auto': Tương tự như'seconds'nếumicrosecondbằng 0, giống'microseconds'nếu không.'hours': Bao gồmhourở định dạngHHhai chữ số.'seconds': Bao gồmhour,minutevàsecondở định dạngHH:MM:SS.'milliseconds': Bao gồm toàn bộ thời gian nhưng cắt ngắn phần thứ hai thành mili giây. định dạngHH:MM:SS.sss.'microseconds': Bao gồm toàn thời gian ở định dạngHH:MM:SS.ffffff.
Ghi chú
Các thành phần thời gian bị loại trừ sẽ bị cắt bớt, không được làm tròn.
ValueErrorsẽ được đưa ra trên đối số timespec không hợp lệ:>>> import datetime as dt >>> dt.datetime.now().isoformat(timespec='minutes') '2002-12-25T00:00' >>> my_datetime = dt.datetime(2015, 1, 1, 12, 30, 59, 0) >>> my_datetime.isoformat(timespec='microseconds') '2015-01-01T12:30:59.000000'
Thay đổi trong phiên bản 3.6: Đã thêm tham số timespec.
- datetime.ctime()¶
Trả về một chuỗi đại diện cho ngày và giờ:
>>> nhập ngày giờ dưới dạng dt >>> dt.datetime(2002, 12, 4, 20, 30, 40).ctime() 'Thứ Tư ngày 4 tháng 12 20:30:40 2002'
Chuỗi đầu ra sẽ not 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 có hàm C
ctime()gốc (màtime.ctime()gọi nhưngdatetime.ctime()không gọi) tuân thủ tiêu chuẩn C.
- datetime.strftime(format)¶
Trả về một chuỗi biểu thị ngày và giờ, được kiểm soát bởi một chuỗi định dạng rõ ràng. Xem thêm hành vi strftime() và strptime() và
datetime.isoformat().
- datetime.__format__(format)¶
Tương tự với
datetime.strftime()Điều này cho phép chỉ định chuỗi định dạng cho đối tượngdatetimetrong formatted string literals và khi sử dụngstr.format(). Xem thêm hành vi strftime() và strptime() vàdatetime.isoformat().
Ví dụ về cách sử dụng: datetime¶
Ví dụ về làm việc với các đối tượng datetime:
>>> nhập ngày giờ dưới dạng dt
>>> # Using datetime.combine()
>>> d = dt.date(2005, 7, 14)
>>> t = dt.time(12, 30)
>>> dt.datetime.combine(d, t)
datetime.datetime(2005, 7, 14, 12, 30)
>>> # Using datetime.now()
>>> dt.datetime.now()
datetime.datetime(2007, 12, 6, 16, 29, 43, 79043) # GMT +1
>>> dt.datetime.now(dt.timezone.utc)
datetime.datetime(2007, 12, 6, 15, 29, 43, 79060, tzinfo=datetime.timezone.utc)
>>> # Using datetime.strptime()
>>> my_datetime = dt.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
>>> my_datetime
datetime.datetime(2006, 11, 21, 16, 30)
>>> # Using datetime.timetuple() để lấy bộ tất cả các thuộc tính
>>> tt = my_datetime.timetuple()
>>> cho nó trong tt:
... in(nó)
...
2006 # year
11 # month
21 # day
16 # hour
30 # minute
0 # second
1 # weekday (0 = Thứ Hai)
325 # number số ngày kể từ ngày 1 tháng 1
-1 # dst - phương thức tzinfo.dst() trả về Không có
>>> # Date ở định dạng ISO
>>> ic = my_datetime.isocalendar()
>>> cho nó trong ic:
... in(nó)
...
2006 # ISO năm
47 # ISO tuần
2 # ISO ngày thường
>>> # Formatting một ngày giờ
>>> my_datetime.strftime("%A, %d. %B %Y %I:%M%p")
'Thứ ba, ngày 21 tháng 11 năm 2006 04:30 chiều'
>>> '{1} là {0:%d}, {2} là {0:%B}, {3} là {0:%I:%M%p}.'.format(my_datetime, "day", "month", "time")
'Ngày là 21, tháng là tháng 11, thời gian là 04:30 chiều.'
Ví dụ bên dưới định nghĩa một lớp con tzinfo 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:
nhập ngày giờ dưới dạng dt
lớp KabulTz(dt.tzinfo):
# Kabul sử dụng +4 cho đến năm 1945 thì họ chuyển sang +4:30
UTC_MOVE_DATE = dt.datetime(1944, 12, 31, 20, tzinfo=dt.timezone.utc)
def utcoffset(tự, khi nào):
nếu khi.năm < 1945:
trả về dt.timedelta(giờ=4)
elif (1945, 1, 1, 0, 0) <= When.timetuple()[:5] < (1945, 1, 1, 0, 30):
# An phạm vi nửa giờ không rõ ràng ("tưởng tượng") đại diện cho
# a 'gấp' đúng lúc do chuyển từ +4 sang +4:30.
# If khi rơi vào phạm vi tưởng tượng, hãy sử dụng gấp để quyết định cách
# to giải quyết. Xem PEP 495.
return dt.timedelta(hours=4, Minutes=(30 if when.fold else 0))
khác:
trả về dt.timedelta(giờ=4, phút=30)
def fromutc(tự, khi nào):
# Follow xác thực tương tự như trong datetime.tzinfo
nếu không phải là phiên bản (khi, dt.datetime):
raise TypeError("fromutc() yêu cầu đối số datetime")
nếu When.tzinfo không phải là chính nó:
raise ValueError("when.tzinfo không phải là self")
Việc triển khai tùy chỉnh # A là bắt buộc đối với fromutc vì
Đầu vào # the cho hàm này là ngày giờ với các giá trị utc
# but với tzinfo được đặt thành self.
# See datetime.astimezone hoặc fromtimestamp.
nếu When.replace(tzinfo=dt.timezone.utc) >= self.UTC_MOVE_DATE:
trở về khi + dt.timedelta(giờ=4, phút=30)
khác:
trở về khi + dt.timedelta(hours=4)
def dst(tự, khi nào):
# Kabul không tuân theo giờ tiết kiệm ánh sáng ban ngày.
trả về dt.timedelta(0)
def tzname(tự, khi nào):
nếu khi >= self.UTC_MOVE_DATE:
quay lại "+04:30"
trả về "+04"
Cách sử dụng KabulTz từ phía trên:
>>> tz1 = KabulTz()
>>> # Datetime trước sự thay đổi
>>> dt1 = dt.datetime(1900, 11, 21, 16, 30, tzinfo=tz1)
>>> in(dt1.utcoffset())
4:00:00
>>> # Datetime sau khi thay đổi
>>> dt2 = dt.datetime(2006, 6, 14, 13, 0, tzinfo=tz1)
>>> in(dt2.utcoffset())
4:30:00
>>> # Convert datetime sang múi giờ khác
>>> dt3 = dt2.astimezone(dt.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
đúng
đối tượng time¶
Đối tượng time đại diện cho thời gian (cục bộ) trong ngày, độc lập với bất kỳ ngày cụ thể nào và có thể điều chỉnh thông qua đối tượng tzinfo.
- class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)¶
Tất cả các đối số là tùy chọn. tzinfo có thể là
Nonehoặc một phiên bản của lớp contzinfo. Các đối số còn lại phải là số nguyên trong phạm vi sau:0 <= hour < 24,0 <= minute < 60,0 <= second < 60,0 <= microsecond < 1000000,fold in [0, 1].
Nếu một đối số nằm ngoài các phạm vi đó được đưa ra,
ValueErrorsẽ được đưa ra. Tất cả mặc định là 0 ngoại trừ tzinfo, mặc định làNone.
Thuộc tính lớp:
- time.resolution¶
Sự khác biệt nhỏ nhất có thể có giữa các đối tượng
timekhông bằng nhau,timedelta(microseconds=1), mặc dù lưu ý rằng số học trên các đối tượngtimekhông được hỗ trợ.
Thuộc tính phiên bản (chỉ đọc):
- time.hour¶
Trong
range(24).
- time.minute¶
Trong
range(60).
- time.second¶
Trong
range(60).
- time.microsecond¶
Trong
range(1000000).
- time.tzinfo¶
Đối tượng được truyền dưới dạng đối số tzinfo cho hàm tạo
timehoặcNonenếu không có đối số nào được truyền.
- time.fold¶
Trong
[0, 1]. Được sử dụng để phân biệt thời gian trên 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ồ được quay ngược vào cuối thời gian 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 và 1 lần lượt biểu thị thời điểm sớm hơn và muộn hơn của hai thời điểm có cùng cách biểu thị thời gian trên tường.Added in version 3.6.
Các đối tượng time hỗ trợ so sánh đẳng thức và thứ tự, trong đó a được coi là nhỏ hơn b khi a đứng trước b về mặt thời gian.
Các đối tượng time ngây thơ và nhận thức không bao giờ bằng nhau. So sánh thứ tự giữa các đối tượng time ngây thơ và nhận thức làm tăng TypeError.
Nếu cả hai đối tượng so sánh đều nhận biết và có cùng thuộc tính tzinfo thì thuộc tính tzinfo và fold sẽ bị bỏ qua và thời gian cơ sở sẽ được so sánh. Nếu cả hai bộ so sánh đều nhận biết và có các thuộc tính tzinfo khác nhau thì trước tiên các bộ so sánh đượ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 time có nhận thức và ngây thơ không làm tăng TypeError.
Trong ngữ cảnh Boolean, đối tượng time luôn được coi là đúng.
Thay đổi trong phiên bản 3.5: Trước Python 3.5, một đối tượng time được coi là sai nếu nó biểu thị nửa đêm trong UTC. Hành vi này được coi là khó hiểu và dễ xảy ra lỗi và đã bị xóa trong Python 3.5. Xem bpo-13936 để biết thêm thông tin.
Các nhà xây dựng khác:
- classmethod time.fromisoformat(time_string)¶
Trả về
timetương ứng với time_string ở bất kỳ định dạng ISO 8601 hợp lệ nào, với các ngoại lệ sau:Độ lệch múi giờ có thể có số giây phân số.
Thàng đầu, thường được yêu cầu trong trường hợp có thể có sự mơ hồ giữa ngày và giờ, là không bắt buộc.Phân số giây có thể có bất kỳ số chữ số nào (bất kỳ số nào vượt quá 6 sẽ bị cắt bớt).
Phân số giờ và phút không được hỗ trợ.
Ví dụ:
>>> nhập ngày giờ dưới dạng dt >>> dt.time.fromisoformat('04:23:01') datetime.time(4, 23, 1) >>> dt.time.fromisoformat('T04:23:01') datetime.time(4, 23, 1) >>> dt.time.fromisoformat('T042301') datetime.time(4, 23, 1) >>> dt.time.fromisoformat('04:23:01.000384') datetime.time(4, 23, 1, 384) >>> dt.time.fromisoformat('04:23:01,000384') datetime.time(4, 23, 1, 384) >>> dt.time.fromisoformat('04:23:01+04:00') datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400))) >>> dt.time.fromisoformat('04:23:01Z') datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc) >>> dt.time.fromisoformat('04:23:01+00:00') datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)
Added in version 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
time.isoformat().
- classmethod time.strptime(date_string, format)¶
Trả về
timetương ứng với date_string, được phân tích theo format.Nếu format không chứa thông tin micro giây hoặc múi giờ thì điều này tương đương với:
time(*(time.strptime(date_string, format)[3:6]))
ValueErrorđược tăng lên nếu date_string và format không thể được phân tích cú pháp bởitime.strptime()hoặc nếu nó trả về một giá trị không phải là bộ dữ liệu thời gian. Xem thêm hành vi strftime() và strptime() vàtime.fromisoformat().Added in version 3.14.
Các 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)¶
Trả về một
timemới có cùng giá trị nhưng đã cập nhật các tham số đã chỉ định. Lưu ý rằngtzinfo=Nonecó thể được chỉ định để tạo mộttimeđơn giản từ mộttimeđã biết mà không cần chuyển đổi dữ liệu thời gian.Các đối tượng
timecũng được hỗ trợ bởi hàm chungcopy.replace().Thay đổi trong phiên bản 3.6: Đã thêm tham số fold.
- time.isoformat(timespec='auto')¶
Trả về một chuỗi biểu thị thời gian ở định dạng ISO 8601, một trong:
HH:MM:SS.ffffff, nếumicrosecondkhác 0HH:MM:SS, nếumicrosecondlà 0HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]], nếuutcoffset()không trả vềNoneHH:MM:SS+HH:MM[:SS[.ffffff]], nếumicrosecondbằng 0 vàutcoffset()không trả vềNone
Đối số tùy chọn timespec chỉ định số lượng thành phần bổ sung tại thời điểm cần đưa vào (mặc định là
'auto'). Nó có thể là một trong những điều sau đây:'auto': Tương tự như'seconds'nếumicrosecondbằng 0, giống'microseconds'nếu không.'hours': Bao gồmhourở định dạngHHhai chữ số.'seconds': Bao gồmhour,minutevàsecondở định dạngHH:MM:SS.'milliseconds': Bao gồm toàn bộ thời gian nhưng cắt ngắn phần thứ hai thành mili giây. định dạngHH:MM:SS.sss.'microseconds': Bao gồm toàn thời gian ở định dạngHH:MM:SS.ffffff.
Ghi chú
Các thành phần thời gian bị loại trừ sẽ bị cắt bớt, không được làm tròn.
ValueErrorsẽ được đưa ra dựa trên đối số timespec không hợp lệ.Ví dụ:
>>> nhập ngày giờ dưới dạng dt >>> dt.time(giờ=12, phút=34, giây=56, micro giây=123456).isoformat(timespec='phút') '12:34' >>> my_time = dt.time(giờ=12, phút=34, giây=56, micro giây=0) >>> my_time.isoformat(timespec='microseconds') '12:34:56.000000' >>> my_time.isoformat(timespec='auto') '12:34:56'
Thay đổi trong phiên bản 3.6: Đã thêm tham số timespec.
- time.__str__()¶
Trong một thời gian
t,str(t)tương đương vớit.isoformat().
- time.strftime(format)¶
Trả về một chuỗi biểu thị thời gian, được kiểm soát bởi một chuỗi định dạng rõ ràng. Xem thêm hành vi strftime() và strptime() và
time.isoformat().
- time.__format__(format)¶
Tương tự với
time.strftime()Điều này cho phép chỉ định chuỗi định dạng cho đối tượngtimetrong formatted string literals và khi sử dụngstr.format(). Xem thêm hành vi strftime() và strptime() vàtime.isoformat().
- time.utcoffset()¶
Nếu
tzinfolàNone, trả vềNone, nếu không thì 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 đối tượngtimedeltacó cường độ nhỏ hơn một ngày.Thay đổi trong phiên bản 3.7: Phần bù UTC không bị giới hạn trong toàn bộ số phút.
- time.dst()¶
Nếu
tzinfolàNone, trả vềNone, nếu không thì 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 đối tượngtimedeltacó cường độ nhỏ hơn một ngày.Thay đổi trong phiên bản 3.7: Phần bù DST không bị giới hạn trong toàn bộ số phút.
- time.tzname()¶
Nếu
tzinfolàNone, trả vềNone, nếu không thì trả vềself.tzinfo.tzname(None)hoặc đư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.
Ví dụ về cách sử dụng: time¶
Ví dụ về cách làm việc với đối tượng time:
>>> nhập ngày giờ dưới dạng dt
>>> lớp TZ1(dt.tzinfo):
... def utcoffset(tự, khi nào):
... trả về dt.timedelta(hour=1)
... def dst(tự, khi nào):
... trả về dt.timedelta(0)
... def tzname(tự, khi nào):
... trả về "+01:00"
... def __repr__(self):
... return f"{self.__class__.__name__}()"
...
>>> t = dt.time(12, 10, 30, tzinfo=TZ1())
>>> t
datetime.time(12, 10, 30, tzinfo=TZ1())
>>> t.isoformat()
'12:10:30+01:00'
>>> t.dst()
datetime.timedelta(0)
>>> t.tzname()
'+01:00'
>>> t.strftime("%H:%M:%S %Z")
'12:10:30 +01:00'
>>> '{} là {:%H:%M}.'.format("time", t)
'Bây giờ là 12:10.'
đối tượng tzinfo¶
- class datetime.tzinfo¶
Đây là abstract base class, có nghĩa là lớp này không nên được khởi tạo trực tiếp. Xác định một lớp con của
tzinfođể nắm bắt thông tin về múi giờ cụ thể.Một phiên bản của (một lớp con cụ thể của)
tzinfocó thể được chuyển tới các hàm tạo cho các đối tượngdatetimevàtime. Các đối tượng sau xem các thuộc tính của chúng theo giờ địa phương và đối tượngtzinfohỗ trợ các phương thức hiển thị độ lệch của giờ địa phương từ UTC, tên của múi giờ và độ lệch DST, tất cả đều liên quan đến đối tượng ngày hoặc giờ được truyền cho chúng.Bạn cần rút ra một lớp con cụ thể và (ít nhất) cung cấp các triển khai của các phương thức
tzinfotiêu chuẩn cần thiết cho các phương thứcdatetimemà bạn sử dụng. Mô-đundatetimecung cấptimezone, một lớp con cụ thể đơn giản củatzinfocó thể biểu thị các múi giờ có độ lệch cố định so với UTC, chẳng hạn như chính UTC hoặc EST và EDT Bắc Mỹ.Yêu cầu đặc biệt đối với việc tẩy: Một lớp con
tzinfophải có một phương thức__init__()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 triển khai các phương thức sau. Chính xác những phương pháp nào là cần thiết tùy thuộc vào việc sử dụng các đối tượngdatetimeđã biết. Nếu nghi ngờ, chỉ cần thực hiện tất cả chúng.
- tzinfo.utcoffset(dt)¶
Trả về độ lệch của giờ địa phương từ UTC, dưới dạng đối tượng
timedeltadương ở phía đông của UTC. Nếu giờ địa phương ở phía tây UTC thì giá trị này sẽ là số âm.Điều này thể hiện phần bù total từ UTC; ví dụ: nếu một đối tượng
tzinfođại diện cho cả điều chỉnh múi giờ và DST, thìutcoffset()sẽ trả về tổng của chúng. Nếu không biết phần bù UTC, hãy trả vềNone. Ngược lại, giá trị được trả về phải là đối tượngtimedeltahoàn toàn nằm trong khoảng từ-timedelta(hours=24)đếntimedelta(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 khaiutcoffset()có thể sẽ giống một trong hai điều sau:trả về lớp CONSTANT # fixed-offset trả về lớp CONSTANT + self.dst(dt) # daylight-aware
Nếu
utcoffset()không trả vềNonethìdst()cũng không trả vềNone.Việc triển khai mặc định của
utcoffset()sẽ tăngNotImplementedError.Thay đổi trong phiên bản 3.7: Phần bù UTC không bị giới hạn trong toàn bộ số phút.
- tzinfo.dst(dt)¶
Trả về điều chỉnh thời gian tiết kiệm ánh sáng ban ngày (DST), dưới dạng đối tượng
timedeltahoặcNonenếu không biết thông tin DST.Trả về
timedelta(0)nếu DST không có hiệu lực. Nếu DST có hiệu lực, hãy trả về phần bù dưới dạng đối tượngtimedelta(xemutcoffset()để 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ởiutcoffset(), vì vậy không cần phải tham khảodst()trừ khi bạn muốn lấy thông tin DST riêng biệt. Ví dụ:datetime.timetuple()gọi phương thứcdst()của thuộc tínhtzinfođể xác định cách đặt cờtm_isdstvàtzinfo.fromutc()gọidst()để giải thích những thay đổi của DST khi vượt qua các múi giờ.Một phiên bản tz của lớp con
tzinfomô hình 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ề kết quả tương tự cho mọi
datetimedt vớidt.tzinfo == tz. Đối với các lớp contzinfolành mạnh, biểu thức này mang lại "độ lệch tiêu 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 triển khaidatetime.astimezone()dựa vào điều này nhưng không thể phát hiện các vi phạm; trách nhiệm của người lập trình là phải đảm bảo điều đó. Nếu lớp contzinfokhông thể đảm bảo điều này, thì nó có thể ghi đè cách triển khai mặc định củatzinfo.fromutc()để hoạt động chính xác vớiastimezone().Hầu hết việc triển khai
dst()có thể sẽ giống một trong hai điều sau:nhập ngày giờ dưới dạng dt def dst(tự, khi nào): Lớp bù cố định # a: không tính đến DST trả về dt.timedelta(0)
hoặc:
nhập ngày giờ dưới dạng dt def dst(tự, khi nào): # Code để đặt dston và dstoff thành DST của múi giờ # transition lần dựa trên đầu vào khi.năm và được biểu thị # in giờ địa phương tiêu chuẩn. if dston <= When.replace(tzinfo=None) < dstoff: trả về dt.timedelta(giờ=1) khác: trả về dt.timedelta(0)
Việc triển khai mặc định của
dst()sẽ tăngNotImplementedError.Thay đổi trong phiên bản 3.7: Phần bù 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 đối tượng
datetimedt, dưới dạng một chuỗi. Không có gì về tên chuỗi được xác định bởi mô-đundatetimevà không có yêu cầu nào về ý nghĩa cụ thể của nó. 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ả về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 một chuỗi cố định vì một số lớp contzinfosẽ 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 lớptzinfotính thời gian ban ngày.Việc triển khai mặc định của
tzname()sẽ tăngNotImplementedError.
Các phương thức này được gọi bởi một đối tượng datetime hoặc time, để đáp ứng với các phương thức cùng tên của chúng. Một đối tượng datetime tự chuyển nó làm đối số và một đối tượng time chuyển None làm đối số. Do đó, các phương thức của lớp con tzinfo phải được chuẩn bị để chấp nhận đối số dt của None hoặ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ề None là phù hợp nếu lớp muốn nói rằng các đối tượng thời gian không tham gia vào các giao thức tzinfo. Có thể hữu ích hơn khi utcoffset(None) trả về giá trị bù UTC tiêu chuẩn, vì không có quy ước nào khác để khám phá giá trị bù tiêu chuẩn.
Khi một đối tượng datetime được truyền để phản hồi lại phương thức datetime, dt.tzinfo là đối tượng giống như self. Các phương thức tzinfo có thể dựa vào điều này, trừ khi mã người dùng gọi trực tiếp các phương thức tzinfo. Mục đích là các phương thức tzinfo diễn giải dt theo giờ địa phương và không cần phải lo lắng về các đối tượng ở các múi giờ khác.
Có thêm một phương thức tzinfo mà một lớp con có thể muốn ghi đè:
- tzinfo.fromutc(dt)¶
Điều này được gọi từ việc triển khai
datetime.astimezone()mặc định. Khi được gọi từ đó,dt.tzinfolà self và dữ liệu ngày và giờ của dt sẽ được xem như thể hiện thời gian UTC. Mục đích củafromutc()là điều chỉnh dữ liệu ngày và giờ, trả về ngày giờ tương đương theo giờ địa phương của self.Hầu hết các lớp con
tzinfođều có thể kế thừa cách triển khaifromutc()mặc định mà không gặp vấn đề gì. Nó đủ mạnh để xử lý các múi giờ có độ lệch cố định và các múi giờ chiếm cả thời gian tiêu chuẩn và thời gian ban ngày, cũng như các múi giờ sau ngay cả khi thời gian chuyển tiếp DST khác nhau trong các năm khác nhau. Một ví dụ về múi giờ mà việc triển khaifromutc()mặc định có thể không xử lý chính xác trong mọi trường hợp là một ví dụ trong đó chênh lệch tiêu 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ủaastimezone()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ờ tính từ thời điểm bù tiêu chuẩn thay đổi.Bỏ qua mã đối với các trường hợp lỗi, việc triển khai
fromutc()mặc định sẽ hoạt động như sau:nhập ngày giờ dưới dạng dt def fromutc(tự, khi nào): # raise Lỗi ValueError nếu When.tzinfo không phải là chính nó dtoff = when.utcoffset() dtdst = khi.dst() # raise ValueError nếu dtoff là Không hoặc dtdst là Không delta = dtoff - dtdst # this là offset tiêu chuẩn của chính nó nếu đồng bằng: khi += delta # convert theo giờ địa phương tiêu chuẩn dtdst = khi.dst() # raise ValueError nếu dtdst không có nếu dtdst: trở lại khi + dtdst khác: trở lại khi
Trong tệp tzinfo_examples.py sau đây có một số ví dụ về các lớp tzinfo:
nhập ngày giờ dưới dạng dt
Lớp # A nắm bắt ý tưởng của nền tảng về giờ địa phương.
# (Có thể dẫn đến giá trị sai ở các thời điểm lịch sử trong
# timezones trong đó phần bù UTC và/hoặc quy tắc DST có
# changed trong quá khứ.)
thời gian nhập khẩu
ZERO = dt.timedelta(0)
HOUR = dt.timedelta(giờ=1)
SECOND = dt.timedelta(giây=1)
STDOFFSET = dt.timedelta(giây=-time.timezone)
nếu thời gian.ánh sáng ban ngày:
DSTOFFSET = dt.timedelta(giây=-time.altzone)
khác:
DSTOFFSET = STDOFFSET
DSTDIFF = DSTOFFSET - STDOFFSET
lớp LocalTimezone(dt.tzinfo):
def fromutc(tự, khi nào):
khẳng định khi nào.tzinfo là chính nó
stamp = (khi - dt.datetime(1970, 1, 1, tzinfo=self)) // SECOND
args = time.localtime(stamp)[:6]
dst_diff = DSTDIFF // SECOND
# Detect gấp
gấp = (args == time.localtime(stamp - dst_diff))
trả về dt.datetime(*args, microsecond=when.microsecond,
tzinfo=tự, gấp=gấp)
def utcoffset(tự, khi nào):
nếu self._isdst(khi):
trả lại DSTOFFSET
khác:
trả lại STDOFFSET
def dst(tự, khi nào):
nếu self._isdst(khi):
trả lại DSTDIFF
khác:
trả lại ZERO
def tzname(tự, khi nào):
return time.tzname[self._isdst(when)]
def _isdst(tự, khi nào):
tt = (khi.năm, khi nào.tháng, khi nào.ngày,
khi.giờ, khi.phút, khi nào.giây,
khi.weekday(), 0, 0)
tem = time.mktime(tt)
tt = time.localtime(stamp)
trả về tt.tm_isdst > 0
Địa phương = LocalTimezone()
# A hoàn thành triển khai các quy tắc DST hiện tại cho các múi giờ chính của Hoa Kỳ.
def first_sunday_on_or_after(khi):
ngày_to_go = 6 - khi.weekday()
nếu ngày_to_go:
khi += dt.timedelta(days_to_go)
trở lại khi
# US DST Quy tắc
#
# This là một bộ quy tắc được đơn giản hóa (nghĩa là sai trong một số trường hợp) dành cho Hoa Kỳ
# DST thời gian bắt đầu và kết thúc. Để có bộ quy tắc DST đầy đủ và cập nhật
định nghĩa múi giờ # and, hãy truy cập Cơ sở dữ liệu Olson (hoặc thử pytz):
# zz000zz
# zz001zz (có thể không cập nhật)
#
# In ở Mỹ, kể từ năm 2007, DST bắt đầu lúc 2 giờ sáng (giờ tiêu chuẩn) vào ngày thứ hai
# Sunday vào tháng 3, tức là Chủ nhật đầu tiên vào hoặc sau ngày 8 tháng 3.
DSTSTART_2007 = dt.datetime(1, 3, 8, 2)
# and kết thúc lúc 2 giờ sáng (giờ DST) vào Chủ nhật đầu tiên của tháng 11.
DSTEND_2007 = dt.datetime(1, 11, 1, 2)
# From 1987 đến 2006, DST thường bắt đầu lúc 2 giờ sáng (giờ tiêu chuẩn) trong lần đầu tiên
# Sunday vào tháng 4 và kết thúc vào lúc 2 giờ sáng (giờ DST) vào ngày cuối cùng
# Sunday của tháng 10, tức là Chủ Nhật đầu tiên vào hoặc sau ngày 25 tháng 10.
DSTSTART_1987_2006 = dt.datetime(1, 4, 1, 2)
DSTEND_1987_2006 = dt.datetime(1, 10, 25, 2)
# From 1967 đến 1986, DST thường bắt đầu lúc 2 giờ sáng (giờ tiêu chuẩn) vào ngày cuối cùng
# Sunday vào tháng 4 (vào hoặc sau ngày 24 tháng 4) và kết thúc lúc 2 giờ sáng (giờ DST)
# on Chủ nhật cuối cùng của tháng 10, tức là Chủ nhật đầu tiên
# on hoặc sau ngày 25 tháng 10.
DSTSTART_1967_1986 = dt.datetime(1, 4, 24, 2)
DSTEND_1967_1986 = DSTEND_1987_2006
def us_dst_range(năm):
Thời gian bắt đầu và kết thúc của # Find dành cho DST của Hoa Kỳ. Trong nhiều năm trước 1967, hãy trở lại
# start = kết thúc không có DST.
nếu 2006 < năm:
dststart, dstend = DSTSTART_2007, DSTEND_2007
Elif 1986 < năm < 2007:
dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_2006
Elif 1966 < năm < 1987:
dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_1986
khác:
trả về (dt.datetime(năm, 1, 1), ) * 2
bắt đầu = first_sunday_on_or_after(dststart.replace(year=year))
end = first_sunday_on_or_after(dstend.replace(year=year))
quay lại bắt đầu, kết thúc
lớp USTimeZone(dt.tzinfo):
def __init__(self,hours,reprname,stname,dstname):
self.stdoffset = dt.timedelta(giờ=giờ)
self.reprname = tên đại diện
self.stdname = tên std
self.dstname = dstname
chắc chắn __repr__(tự):
trả về self.reprname
def tzname(tự, khi nào):
nếu self.dst(khi):
trả về self.dstname
khác:
trả về self.stdname
def utcoffset(tự, khi nào):
trả về self.stdoffset + self.dst(khi)
def dst(tự, khi nào):
nếu khi nào là Không hoặc khi.tzinfo là Không:
Ngoại lệ # An có thể hợp lý ở đây, trong một hoặc cả hai trường hợp.
# It tùy thuộc vào cách bạn muốn đối xử với chúng. Mặc định
Triển khai # fromutc() (được gọi theo mặc định astimezone()
# implementation) chuyển một datetime với when.tzinfo là chính nó.
trả lại ZERO
khẳng định khi nào.tzinfo là chính nó
bắt đầu, kết thúc = us_dst_range(when.year)
# Can không so sánh các đối tượng ngây thơ với các đối tượng nhận thức được, vì vậy hãy loại bỏ múi giờ khỏi
# when đầu tiên.
khi = khi.replace(tzinfo=Không)
nếu bắt đầu + HOUR <= khi < kết thúc - HOUR:
# DST có hiệu lực.
trả lại HOUR
nếu kết thúc - HOUR <= khi < kết thúc:
# Fold (một giờ không rõ ràng): sử dụng when.fold để phân biệt.
trả về ZERO nếu when.fold khác HOUR
nếu bắt đầu <= khi < bắt đầu + HOUR:
# Gap (giờ không tồn tại): đảo ngược quy tắc gấp.
trả về HOUR nếu when.fold khác ZERO
# DST đã tắt.
trả lại ZERO
def fromutc(tự, khi nào):
khẳng định khi nào.tzinfo là chính nó
bắt đầu, kết thúc = us_dst_range(when.year)
bắt đầu = start.replace(tzinfo=self)
end = end.replace(tzinfo=self)
std_time = khi + self.stdoffset
dst_time = std_time + HOUR
nếu kết thúc <= dst_time < kết thúc + HOUR:
# Repeated giờ
trả về std_time.replace(fold=1)
nếu std_time < bắt đầu hoặc dst_time >= kết thúc:
thời gian # Standard
trả về std_time
nếu bắt đầu <= std_time < kết thúc - HOUR:
# Daylight tiết kiệm thời gian
trở về dst_time
Miền Đông = USTimeZone(-5, "Miền Đông", "EST", "EDT")
Trung tâm = USTimeZone(-6, "Trung tâm", "CST", "CDT")
Núi = USTimeZone(-7, "Núi", "MST", "MDT")
Thái Bình Dương = USTimeZone(-8, "Thái Bình Dương", "PST", "PDT")
Lưu ý rằng có sự tinh tế không thể tránh khỏi hai lần mỗi năm trong lớp con tzinfo 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 US Eastern (UTC -0500), trong đó EDT bắt đầu phút sau 1:59 (EST) vào Chủ nhật thứ hai của tháng 3 và kết thúc 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
bắt đầu 22:MM 23:MM 0:MM 1:MM 3:MM 4:MM
cuối 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 sẽ nhảy từ 1:59 lên 3:00. Thời gian 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ới hour == 2 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:
>>> nhập ngày giờ dưới dạng dt
>>> từ tzinfo_examples nhập HOUR, Miền Đông
>>> u0 = dt.datetime(2016, 3, 13, 5, tzinfo=dt.timezone.utc)
>>> cho i trong phạm vi (4):
... u = u0 + i*HOUR
... t = u.astimezone(Miền Đông)
... 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ó thể có một vấn đề tồi tệ hơn: có một giờ không thể đánh vần rõ ràng theo giờ tường địa phương: giờ cuối cùng của thời gian ban ngày. Ở miền Đô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 lại nhảy từ 1:59 (giờ ban ngày) trở lại 1:00 (giờ tiêu chuẩn). 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ụ miền Đô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 miền Đông, nhưng những lần trước đó có thuộc tính fold được đặt thành 0 và những lần sau đó được đặt thành 1. Ví dụ: tại quá trình chuyển đổi Mùa thu năm 2016, chúng tôi nhận được:
>>> nhập ngày giờ dưới dạng dt
>>> từ tzinfo_examples nhập HOUR, Miền Đông
>>> u0 = dt.datetime(2016, 11, 6, 4, tzinfo=dt.timezone.utc)
>>> cho i trong phạm vi (4):
... u = u0 + i*HOUR
... t = u.astimezone(Miền Đông)
... 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 các phiên bản datetime chỉ khác nhau về giá trị của thuộc tính fold đượ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 trên tường nên kiểm tra rõ ràng giá trị của thuộc tính fold hoặc tránh sử dụng các lớp con tzinfo lai; không có sự mơ hồ khi sử dụng timezone hoặc bất kỳ lớp con tzinfo có độ lệch cố định nào khác (chẳng hạn như một lớp chỉ đại diện cho EST (độ lệch cố định -5 giờ) hoặc chỉ EDT (độ lệch cố định -4 giờ)).
Xem thêm
zoneinfoMô-đun
datetimecó lớptimezonecơ bản (để xử lý các giá trị bù cố định tùy ý từ UTC) và thuộc tínhtimezone.utccủa nó (một phiên bản UTCtimezone).
zoneinfođưa IANA time zone database (còn được gọi là cơ sở dữ liệu Olson) vào Python và bạn nên sử dụng nó.
- IANA time zone database
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 thể hiện lịch sử giờ địa phương của nhiều địa điểm đạ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.
đối tượng timezone¶
Lớp timezone là 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 độ lệch cố định từ UTC.
Các đối tượng thuộc lớp này không thể được sử dụng để thể hiện thông tin múi giờ ở những vị trí sử dụng các độ lệch khác nhau vào các ngày khác nhau trong năm hoặc nơi có những thay đổi lịch sử đối với thời gian dân sự.
- class datetime.timezone(offset, name=None)¶
Đối số offset phải được chỉ định làm đối tượng
timedeltathể hiện sự khác biệt giữa giờ địa phương và UTC. Nó phải nằm hoàn toàn giữa-timedelta(hours=24)vàtimedelta(hours=24), nếu không thìValueErrorsẽ được nâng lên.Đối số name là tùy chọn. Nếu được chỉ định thì đó phải là một chuỗi sẽ được sử dụng làm giá trị được phương thức
datetime.tzname()trả về.Added in version 3.2.
Thay đổi trong phiên bản 3.7: Phần bù UTC không bị giới hạn trong toàn bộ số phút.
- timezone.utcoffset(dt)¶
Trả về giá trị cố định được chỉ định khi phiên bản
timezoneđược tạo.Đối số dt bị bỏ qua. Giá trị trả về là một phiên bản
timedeltabằng chênh lệch giữa giờ địa phương và UTC.Thay đổi trong phiên bản 3.7: Phần bù UTC không bị giới hạn trong toàn bộ số phút.
- timezone.tzname(dt)¶
Trả về giá trị cố định được chỉ định khi phiên bản
timezoneđược tạo.Nếu name không được cung cấp trong hàm tạo, tên được trả về bởi
tzname(dt)sẽ được tạo từ giá trị củaoffsetnhư sau. Nếu offset làtimedelta(0)thì tên là "UTC", nếu không thì đó là một chuỗi có định dạngUTC±HH:MM, trong đó ± là dấu củaoffset, HH và MM lần lượt là hai chữ số củaoffset.hoursvàoffset.minutes.Thay đổi trong phiên bản 3.6: Tên được tạo từ
offset=timedelta(0)giờ đây đơn giản là'UTC'chứ không phải'UTC+00:00'.
- timezone.dst(dt)¶
Luôn trả về
None.
- timezone.fromutc(dt)¶
Trả về
dt + offset. Đối số dt phải là một phiên bảndatetimecó thể nhận biết được, vớitzinfođược đặt thànhself.
Thuộc tính lớp:
- timezone.utc¶
Múi giờ UTC,
timezone(timedelta(0)).
hành vi strftime() và strptime()¶
Các đối tượng date, datetime và time đều hỗ trợ phương thức strftime(format), để 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, các phương thức lớp date.strptime(), datetime.strptime() và time.strptime() tạo một đối tượng từ một chuỗi biểu thị thời gian và một chuỗi định dạng tương ứng.
Bảng bên dưới cung cấp sự so sánh cấp cao giữa strftime() và strptime():
|
|
|
|---|---|---|
Cách sử dụng |
Chuyển đổi đối tượng thành chuỗi theo định dạng nhất định |
Phân tích một chuỗi thành một đối tượng có định dạng tương ứng |
Loại phương pháp |
Phương thức sơ thẩm |
Phương thức lớp |
Chữ ký |
|
|
Mã định dạng strftime() và strptime()¶
Các phương thức này chấp nhận mã định dạng có thể được sử dụng để phân tích và định dạng ngày tháng:
>>> nhập ngày giờ dưới dạng dt
>>> dt.datetime.strptime('31/01/22 23:59:59.999999',
... '%d/%m/%y %H:%M:%S.%f')
datetime.datetime(2022, 1, 31, 23, 59, 59, 999999)
>>> _.strftime('%a %d %b %Y, %I:%M%p')
'Thứ Hai, ngày 31 tháng 1 năm 2022, 23:59'
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à các mã này 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ú |
|---|---|---|---|
|
Ngày trong tuần là tên viết tắt của miền địa phương. |
CN, Thứ Hai, ..., Thứ Bảy (en_US);
Vậy, Mơ, ..., Sa (de_DE)
|
(1) |
|
Ngày trong tuần là tên đầy đủ của miền địa phương. |
Chủ Nhật, Thứ Hai, ..., Thứ Bảy (en_US);
Sonntag, Montag, ...,
Samstag (de_DE)
|
(1) |
|
Ngày trong tuần ở dạng số thập phân, trong đó 0 là Chủ Nhật và 6 là Thứ Bảy. |
0, 1, ..., 6 |
|
|
Ngày trong tháng dưới dạng số thập phân không đệm. |
01, 02, ..., 31 |
(9) |
|
Tháng là tên viết tắt của miền địa phương. |
Tháng 1, Tháng 2, ..., Tháng 12 (en_US);
Tháng 1, Tháng 2, ..., Dez (de_DE)
|
(1) |
|
Tháng là tên đầy đủ của miền địa phương. |
Tháng 1, tháng 2, ..., tháng 12 (en_US);
Tháng Giêng, Tháng Hai, ..., Tháng Mười Hai (de_DE)
|
(1) |
|
Tháng dưới dạng số thập phân không đệm. |
01, 02, ..., 12 |
(9) |
|
Năm không có thế kỷ dưới dạng số thập phân không đệm. |
00, 01, ..., 99 |
(9) |
|
Năm với thế kỷ là số thập phân. |
0001, 0002, ..., 2013, 2014, ..., 9998, 9999 |
(2) |
|
Giờ (đồng hồ 24 giờ) dưới dạng số thập phân không đệm. |
00, 01, ..., 23 |
(9) |
|
Giờ (đồng hồ 12 giờ) dưới dạng số thập phân không đệm. |
01, 02, ..., 12 |
(9) |
|
Ngôn ngữ tương đương với AM hoặc PM. |
AM, PM (en_US);
sáng, chiều (de_DE)
|
(1), (3) |
|
Phút dưới dạng số thập phân không đệm. |
00, 01, ..., 59 |
(9) |
|
Thứ hai là số thập phân không đệm. |
00, 01, ..., 59 |
(4), (9) |
|
Micro giây dưới dạng số thập phân, được đệm 0 thành 6 chữ số. |
000000, 000001, ..., 999999 |
(5) |
|
UTC offset ở dạng |
(trống), +0000, -0400, +1030, +063415, -030712.345216 |
(6) |
|
Tên múi giờ (chuỗi trống nếu đối tượng chưa rõ ràng). |
(trống), UTC, GMT |
(6) |
|
Ngày trong năm dưới dạng số thập phân không đệm. |
001, 002, ..., 366 |
(9) |
|
Số tuần trong năm (Chủ nhật là ngày đầu tiên trong 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à ở tuần 0. |
00, 01, ..., 53 |
(7), (9) |
|
Số tuần trong năm (Thứ Hai là ngày đầu tiên trong 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 Thứ Hai đầu tiên được coi là ở tuần 0. |
00, 01, ..., 53 |
(7), (9) |
|
Trình bày ngày và giờ thích hợp của miền địa phương. |
Thứ ba ngày 16 tháng 8 21:30:00 1988 (en_US);
Ngày 16 tháng 8 21:30:00 1988 (de_DE)
|
(1) |
|
Đại diện ngày thích hợp của miền địa phương. |
16/08/88 (Không có);
16/08/1988 (en_US);
08.16.1988 (de_DE)
|
(1) |
|
Đại diện thời gian thích hợp của miền địa phương. |
21:30:00 (en_US);
21:30:00 (de_DE)
|
(1) |
|
Một ký tự |
% |
Một số chỉ thị bổ sung không được yêu cầu bởi 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 giá trị ngày ISO 8601.
chỉ thị |
Ý nghĩa |
Ví dụ |
Ghi chú |
|---|---|---|---|
|
ISO 8601 năm với thế kỷ đại diện cho năm chứa phần lớn tuần ISO ( |
0001, 0002, ..., 2013, 2014, ..., 9998, 9999 |
(8) |
|
ISO 8601 ngày trong tuần dưới dạng số thập phân trong đó 1 là Thứ Hai. |
1, 2, ..., 7 |
|
|
ISO 8601 tuần dưới dạng số thập phân với Thứ Hai là ngày đầu tuần. Tuần 01 là tuần có ngày 4 tháng 1. |
01, 02, ..., 53 |
(8), (9) |
|
UTC offset ở dạng |
(trống), +00:00, -04:00, +10:30, +06:34:15, -03:07:12.345216 |
(6) |
Những thứ này 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 phương pháp strftime(). Chỉ thị ISO 8601 năm và ISO 8601 tuần không thể thay thế được với chỉ thị số năm và số tuần ở trên. Gọi strptime() với các lệnh ISO 8601 không đầy đủ hoặc mơ hồ sẽ tạo ra một ValueError.
Bộ mã định dạng đầy đủ được hỗ trợ khác nhau giữa các nền tảng, vì Python gọi hàm strftime() 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 bộ mã định dạng đầy đủ được hỗ trợ trên nền tảng của bạn, hãy tham khảo tài liệu strftime(3). Ngoài ra còn có sự khác biệt giữa các nền tảng trong việc xử lý các công cụ xác định định dạng không được hỗ trợ.
Added in version 3.6: %G, %u và %V đã được thêm vào.
Added in version 3.12: %:z đã được thêm vào.
Chi tiết kỹ thuật¶
Nói rộng hơn, d.strftime(fmt) hoạt động giống như time.strftime(fmt, d.timetuple()) của mô-đun time mặc dù không phải tất cả các đối tượng đều hỗ trợ phương thức timetuple().
Đối với các phương thức lớp datetime.strptime() và date.strptime(), giá trị mặc định là 1900-01-01T00:00:00.000: mọi thành phần không được chỉ định trong chuỗi định dạng sẽ được lấy từ giá trị mặc định.
Ghi chú
Chuỗi định dạng không có dấu phân cách có thể không rõ ràng khi phân tích cú pháp. Ví dụ: với %Y%m%d, chuỗi 2026111 có thể được phân tích cú pháp thành 2026-11-01 hoặc 2026-01-11. Sử dụng dấu phân cách để đảm bảo dữ liệu đầu vào được phân tích cú pháp như dự định.
Ghi chú
Khi được sử dụng để phân tích một phần ngày thiếu một năm, datetime.strptime() và date.strptime() sẽ tăng lên khi gặp ngày 29 tháng 2 vì năm mặc định 1900 là not một năm nhuận. Luôn thêm năm nhuận mặc định vào chuỗi ngày một phần trước khi phân tích cú pháp.
>>> nhập ngày giờ dưới dạng dt
>>> giá trị = "29/2"
>>> dt.datetime.strptime(giá trị, "%m/%d")
Traceback (cuộc gọi gần đây nhất):
...
ValueError: ngày 29 phải nằm trong phạm vi 1..28 cho tháng 2 năm 1900
>>> dt.datetime.strptime(f"1904 {value}", "%Y %m/%d")
datetime.datetime(1904, 2, 29, 0, 0)
Sử dụng datetime.strptime(date_string, format) tương đương với:
datetime(*(time.strptime(date_string, format)[0:6]))
ngoại trừ khi định dạng bao gồm các thành phần phụ thứ hai hoặc thông tin chênh lệch múi giờ, được hỗ trợ trong datetime.strptime nhưng bị time.strptime loại bỏ.
Đối với đối tượng time, không nên sử dụng mã định dạng cho năm, tháng và ngày vì đối tượng time không có giá trị như vậy. Nếu vẫn sử dụng thì 1900 được thay thế cho năm và 1 cho tháng và ngày.
Đối với đối tượng date, không nên sử dụng mã định dạng cho giờ, phút, giây và micro giây vì đối tượng date không có giá trị như vậy. Nếu chúng vẫn được sử dụng thì số 0 sẽ được 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 ở đầu ra, trong khi trên các nền tảng khác, strftime có thể tăng UnicodeError hoặc thay vào đó trả về một chuỗi trống.
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ự không phải ASCII.
Phương thức
strptime()có thể phân tích các năm trong phạm vi [1, 9999] đầy đủ, nhưng các năm < 1000 phải được điền từ 0 đến 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, phương pháp
strftime()bị giới hạn trong năm >= 1900.Thay đổi trong phiên bản 3.3: Trong phiên bản 3.2, phương pháp
strftime()bị giới hạn ở số năm >= 1000.Khi được sử dụng với phương thức
strptime(), lệnh%pchỉ ảnh hưởng đến trường giờ đầu ra nếu lệnh%Iđược sử dụng để phân tích giờ.Không giống như mô-đun
time, mô-đundatetimekhông hỗ trợ giây nhuận.Khi được sử dụng với phương pháp
strptime(), lệnh%fchấp nhận từ một đến sáu chữ số và số 0 ở bên phải.%flà 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 đơn giản, mã định dạng
%z,%:zvà%Zđược thay thế bằng các chuỗi trống.Đối với đối tượng nhận thức:
%zutcoffset()được chuyển thành một chuỗi có dạng±HHMM[SS[.ffffff]], trong đóHHlà chuỗi 2 chữ số biểu thị số giờ bù UTC,MMlà chuỗi 2 chữ số biểu thị số phút bù UTC,SSlà chuỗi 2 chữ số biểu thị số giây bù UTC vàfffffflà chuỗi 6 chữ số biểu thị số UTC bù micro giây. Phầnffffffbị bỏ qua khi phần bù là số nguyên giây và cả phầnffffffvàSSđều bị bỏ qua khi phần bù là toàn bộ số phút. Ví dụ: nếuutcoffset()trả vềtimedelta(hours=-3, minutes=-30),%zđược thay thế bằng chuỗi'-0330'.
Thay đổi trong phiên bản 3.7: Phần bù UTC không bị giới hạn trong toàn bộ số phút.
Thay đổi trong phiên bản 3.7: Khi lệnh
%zđược cung cấp cho phương thứcstrptime(), độ lệch 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ù một giờ. Ngoài ra, việc cung cấp'Z'cũng giống hệt'+00:00'.%:zHoạt động chính xác như
%znhưng có thêm dấu hai chấm giữa giờ, phút và giây.%ZTrong
strftime(),%Zđược thay thế bằng một chuỗi trống nếutzname()trả vềNone; nếu không thì%Zđược thay thế bằng giá trị trả về, giá trị này phải là một chuỗi.strptime()chỉ chấp nhận các giá trị nhất định cho%Z:bất kỳ giá trị nào trong
time.tznamecho ngôn ngữ máy của bạncác giá trị được mã hóa cứng
UTCvàGMT
Vì vậy, ai đó sống ở Nhật Bản có thể có
JST,UTCvàGMTlà giá trị hợp lệ, nhưng có thể không phải làEST. Nó sẽ tăngValueErrorcho các giá trị không hợp lệ.
Thay đổi trong phiên bản 3.2: Khi lệnh
%zđược cung cấp cho phương thứcstrptime(), một đối tượngdatetimenhận biết sẽ được tạo ra.tzinfocủa kết quả sẽ được đặt thành phiên bảntimezone.Khi được sử dụng với phương pháp
strptime(),%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 tính toán khi ngày trong tuần và năm ISO (%G) được chỉ định trong chuỗi định dạngstrptime(). Cũng lưu ý rằng%Gvà%Ykhông thể thay thế cho nhau.Khi được sử dụng với phương pháp
strptime(), số 0 đứng đầu là tùy chọn cho các định dạng%d,%m,%H,%I,%M,%S,%j,%U,%Wvà%V. Định dạng%yyêu cầu số 0 đứng đầu.Khi phân tích tháng và ngày bằng
strptime(), hãy luôn đưa năm vào định dạng. Nếu giá trị bạn cần phân tích thiếu năm, hãy thêm năm nhuận giả rõ ràng. Nếu không, mã của bạn sẽ đưa ra một ngoại lệ khi gặp ngày nhuận vì năm mặc định được trình phân tích cú pháp sử dụng (1900) không phải là năm nhuận. Người dùng gặp phải lỗi đó vào mỗi năm nhuận.>>> tháng_ngày = "29/02" >>> dt.datetime.strptime(f"{month_day};1984", "%m/%d;%Y") lỗi năm nhuận # No. datetime.datetime(1984, 2, 29, 0, 0)
Không được dùng nữa kể từ phiên bản 3.13, sẽ bị xóa trong phiên bản 3.15: Các cuộc gọi
strptime()sử dụng chuỗi định dạng chứa một ngày trong tháng mà không có năm hiện phát raDeprecationWarning. Trong phiên bản 3.15 trở lên, chúng tôi có thể thay đổi điều này thành lỗi hoặc thay đổi năm mặc định thành năm nhuận. Xem gh-70647.
Chú thích cuối trang