Để thao tác ngày và giờ trong Python, có module datetime. Có hai loại đối tượng date và time: naïve (ngây thơ) và aware (có nhận thức).
Đối với đối tượng naïve, không có đủ thông tin để xác định rõ ràng đối tượng này so với các đối tượng date-time khác. Cách tiếp cận này dùng Thời gian Phối hợp Quốc tế (UTC).
Đối với đối tượng aware, có nhiều thông tin về điều chỉnh thời gian thuật toán và chính trị. Loại đối tượng này dùng để biểu diễn các thời điểm cụ thể.
Để dùng module này, nên nhập bằng:
import datetime
Có nhiều lớp, hằng số và phương thức khác nhau trong module này.
Các hằng số:
| STT | Hằng số & Mô tả |
|---|---|
| 1 | datetime.MINYEAR – Năm nhỏ nhất cho date/datetime. Giá trị 1 |
| 2 | datetime.MAXYEAR – Năm lớn nhất cho date/datetime. Giá trị 9999 |
Các kiểu dữ liệu có sẵn:
| STT | Kiểu dữ liệu & Mô tả |
|---|---|
| 1 | date – Đối tượng kiểu ngày. Dùng lịch Gregory. Có year, month, day. |
| 2 | time – Lớp đối tượng thời gian. Độc lập với ngày cụ thể. Có hour, minute, second, microsecond, tzinfo. |
| 3 | datetime – Tập hợp kết hợp của date và time. |
| 4 | timedelta – Biểu diễn chênh lệch giữa hai date/time/datetime tính bằng microsecond. |
| 5 | tzinfo – Abstract Base Class. Giữ thông tin múi giờ. Dùng bởi datetime và time. |
| 6 | timezone – Triển khai tzinfo. Có offset cố định từ UTC. |
Đối tượng kiểu Date (Date Type Object)
Đối tượng date biểu diễn một ngày. Có phần Ngày, Tháng, Năm. Dùng Lịch Gregory. Theo lịch này, ngày 1 tháng 1 năm 1 gọi là ngày số 1, và cứ thế.
Một số phương thức liên quan đến date:
Phương thức date.date(year, month, day)
Constructor tạo đối tượng date. Tất cả đối số bắt buộc kiểu integer. Year phải trong khoảng MINYEAR ÷ MAXYEAR. Nếu ngày không hợp lệ, ném ValueError.
Phương thức date.today()
Trả về ngày hiện tại cục bộ (local date).
Phương thức date.fromtimestamp(timestamp)
Lấy date từ POSIX timestamp. Nếu timestamp ngoài phạm vi, ném OverflowError.
Phương thức date.fromordinal(ordinal)
Lấy date từ ordinal (số thứ tự) của lịch Gregory tiền đề (proleptic). Dùng để lấy date từ số ngày đếm từ 1/1/năm 1.
Phương thức date.toordinal()
Trả về date dưới dạng ordinal của lịch Gregory tiền đề.
Phương thức date.weekday()
Trả về ngày trong tuần dưới dạng integer từ date. Thứ 2 = 0, Thứ 3 = 1, v.v.
Phương thức date.isoformat()
Trả về date dưới dạng chuỗi ISO 8601. Định dạng YYYY-MM-DD.
Mã ví dụ Date
import datetime as dt
new_date = dt.date(1998, 9, 5) # Lưu ngày 5/9/1998
print("Ngày là: " + str(new_date))
print("Giá trị ordinal của ngày: " + str(new_date.toordinal()))
print("Thứ của ngày: " + str(new_date.weekday())) # Thứ 2 = 0
my_date = dt.date.fromordinal(732698) # Tạo date từ ordinal
print("Ngày từ ordinal: " + str(my_date))
td = my_date - new_date # Tạo timedelta object
print('Kiểu td: ' + str(type(td)) + '\nChênh lệch: ' + str(td))
Kết quả Date
Ngày là: 1998-09-05 Giá trị ordinal của ngày: 729637 Thứ của ngày: 5 Ngày từ ordinal: 2007-01-22 Kiểu td:Chênh lệch: 3061 days, 0:00:00
Đối tượng kiểu Time (Time Object)
Đối tượng time biểu diễn thời gian cục bộ. Có giờ, phút, giây, microsecond, tzinfo. Giờ trong 0-23, phút/giây 0-59, microsecond 0-999999.
Một số phương thức time:
Phương thức time.fromisoformat(time_string)
Lấy time từ chuỗi ISO 8601. Chấp nhận bất kỳ đầu ra nào của time.isoformat().
Phương thức time.replace(hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *fold=0)
Trả về time bằng cách lấy giá trị từ đối số. Nếu không truyền đối số, trả về cùng giá trị time object.
Phương thức time.tzname()
Trả về tên múi giờ. Nếu tzinfo là None, trả về None.
Đối tượng Datetime
Đối tượng datetime giữ cả date và time. Như date object, hỗ trợ lịch Gregory. Như time object, giữ chính xác 3600*24 giây mỗi ngày.
Hỗ trợ tất cả phương thức date và time, một số phương thức riêng cho datetime:
Phương thức datetime.now(tz=None)
Lấy date và time hiện tại. Nếu tz không có hoặc None, trả về giống today().
Phương thức datetime.utcnow()
Lấy date và time UTC hiện tại.
Có hai phương thức khác: strftime() và strptime(). Áp dụng cho cả date, time, và datetime.
Phương thức datetime.strftime(format[, t])
Chuyển tuple hoặc struct_time (từ gmtime()/localtime()) thành chuỗi theo format. Nếu t không cho, dùng localtime(). format phải là string. Ném ValueError nếu trường nào ngoài phạm vi.
Phương thức datetime.strptime(format[, t])
Phân tích chuỗi biểu diễn thời gian theo format. Trả về struct_time. Tham số format dùng các directive giống strftime(); mặc định "%a %b %d %H:%M:%S %Y" khớp với ctime().
Hai phương thức này dùng một số directive. Một số directive dưới đây:
| STT | Directive & Mô tả |
|---|---|
| 1 | %A – Tên thứ đầy đủ |
| 2 | %B – Tên tháng đầy đủ |
| 3 | %d – Ngày trong tháng (01-31) |
| 4 | %S – Giây |
| 5 | %G – Năm 4 chữ số theo tuần ISO |
| 6 | %m – Tháng (01-12) |
| 7 | %M – Phút |
| 8 | %T – Thời gian hiện tại, = %H:%M:%S |
| 9 | %W – Số tuần năm, bắt đầu từ thứ 2 tuần đầu |
| 10 | %w – Thứ trong tuần, CN=0 |
| 11 | %Y – Năm đầy đủ (có thế kỷ) |
| 12 | %Z hoặc %z – Múi giờ hoặc viết tắt |
Mã ví dụ Datetime
import datetime as dt
my_date1 = dt.datetime(2015, 1, 4) # Lưu ngày 4/1/2015
print(my_date1)
print('Thứ của ngày đó: ' + my_date1.strftime('%A'))
my_date2 = dt.datetime.strptime('August-15-2017', '%B-%d-%Y') # Lưu 15/8/2017
print(my_date2)
print('Thứ của ngày đó: ' + my_date2.strftime('%A'))
print('Chênh lệch hai ngày: ' + str(abs(my_date1 - my_date2)))
Kết quả Datetime
2015-01-04 00:00:00 Thứ của ngày đó: Sunday 2017-08-15 00:00:00 Thứ của ngày đó: Tuesday Chênh lệch hai ngày: 954 days, 0:00:00