Hướng dẫn sử dụng Date Time trong Python ***

Xem thêm các chuyên mục:

1- Tổng quan

Python cung cấp cho bạn 4 module có liên quan tới ngày tháng và thời gian.
Module Mô tả
time time là một module chỉ bao gồm các hàm, và các hằng số liên quan tới ngày tháng và thời gian, không có lớp (class) nào được định nghĩa trong module này.
datetime Module này định nghĩa một số lớp đại diện cho ngày tháng và thời gian.
calendar Module này chứa các hàm liên quan đến lịch. Nó cũng định nghĩa ra các lớp đại diện cho Lịch, và exception có liên quan.
locale Module này chứa các hàm sử dụng để định dạng (format), hoặc phân tích (parse) ngày tháng và thời gian dựa trên locale (vùng miền, địa lý).

datetime module:

datetime là một module, được thiết kế dựa trên hướng đối tượng (object oriented) để làm việc với ngày tháng và thời gian trong Python. Nó có một vài lớp đại diện cho ngày tháng và thời gian.
Class Mô tả
datetime.date Một đối tượng date đại diện cho ngày tháng (date), không bao gồm thời gian, theo bộ lịch Gregorian (Dương lịch).
datetime.datetime Một đối tượng datetime đại diện cho ngày tháng (date) và thời gian, theo bộ lịch Gregorian.
datetime.time Một đối tượng time đại diện cho thời gian (time), không bao gồm ngày tháng (date).
datetime.tzinfo Là một lớp cơ sở trừu tượng (base abstract class) cho các đối tượng thông tin múi giờ (timezone).
datetime.timezone Là một lớp con trực tiếp của lớp tzinfo, theo chuẩn UTC (Coordinated Universal Time) (Giờ hợp nhất quốc tế).
datetime.timedelta Đối tượng timedelta mô tả một khoảng thời gian (duration), là khoảng thời gian giữa 2 thời điểm.

calendar module:

calendar là một module cung cấp các hàm, và một vài lớp liên quan tới Lịch, nó hỗ trợ tạo (generate) ra hình ảnh của bộ lịch dưới dạng text, html, ....

2- Khái niệm về Ticks

Trong khoa học máy tính, 12h sáng ngày 1 tháng 1 năm 1970 là một thời điểm đặc biệt, nó được sử dụng để bắt đầu đếm thời gian. Thời điểm đặc biệt này được gọi là epoch (Tạm hiểu là kỷ nguyên máy tính).

Trong Python, khoảng thời gian giữa thời điểm hiện tại và thời điểm đặc biệt nói trên được tính bằng số giây (seconds). Khoảng thời gian đó được gọi là Ticks.
Hàm time() trong module time trả về số giây (seconds) tính từ thời điểm 12h sáng ngày 1 tháng 1 năm 1970 tới hiện tại. Nó trả về một kiểu số chấm động (floating point).
ticketExample.py
# Nhập khẩu module time.
import time;

# Số giây tính từ 12h sáng ngày 1-1-1970 tới hiện tại.
ticks = time.time()


print ("Number of ticks since 12:00am, January 1, 1970: ", ticks)

3- time module

time là một module chỉ bao gồm các hàm, và các hằng số liên quan tới ngày tháng và thời gian, có một vài lớp (class) viết trên C/C++ được định nghĩa trên module này. Chẳng hạn lớp struct_time.
Trên module time, thời gian được đại diện bởi Ticks hoặc struct_time. Nó có các hàm để định dạng (format) Ticks hoặc struct_time thành string, và ngược lại phân tích (parse) một string thành Ticks hoặc struct_time.
Chỉ số Thuộc tính Các giá trị
0 tm_year (Ví dụ, 1993)
1 tm_mon Phạm vi [1, 12]
2 tm_mday Phạm vi [1, 31]
3 tm_hour Phạm vi [0, 23]
4 tm_min Phạm vi [0, 59]
5 tm_sec Phạm vi [0, 61]; Xem thêm mô tả phía dưới
6 tm_wday Phạm vi [0, 6], Thứ hai là 0
7 tm_yday Phạm vi [1, 366]
8 tm_isdst 0, 1 hoặc -1;
N/A tm_zone Viết tắt của tên múi giờ
N/A tm_gmtoff offset east of UTC in seconds
tm_sec
Phạm vi giây (second) thực sự là 0 đến 61; điều này được giải thích là giây nhuận (double leap seconds). Mặc dù rất rất hiếm.
Các hàm của time gọi đến các hàm được viết trên ngôn ngữ C. Dưới đây là danh sách các hàm thông dụng, chi tiết hơn bạn có thể tham khảo tài liệu trên website chính thức của Python.

Ticks ==> struct_time

Hàm Mô tả
time.gmtime([secs]) Chuyển đổi thời gian tính theo giây từ thời điểm spoch thành một struct_time trong UTC, trong đó cờ dst là 0. Nếu tham số secs không được cung cấp hoặc None, nó sẽ có giá trị mặc định trả về bởi hàm time().
time.localtime([secs]) Giống với hàm gmtime() nhưng chuyển đổi thành thời gian địa phương (local time). Và cờ dst có giá trị  là 1.
Hàm gmtime([secs])localtime([secs]) đều trả về kiểu struct_time.
time_gmtimeExample.py
import time

# 1 giây sau kỷ nguyên máy tính (epoch). 
# Hàm này trả về một kiểu struct: struct_time
ts = time.gmtime(1)

print ("1 seconds after epoch: ")

print (ts)


print ("\n")

# Thời điểm hiện tại, giống với time.gmtime( time.time() )
# Hàm này trả về một kiểu struct: struct_time
ts = time.gmtime()


print ("struct_time for current time: ")
print (ts)

struct_time ==> Ticks

Bạn có thể chuyển đổi một struct_time hoặc một Tuple đại diện cho thời gian thành Ticks (Số giây tính từ thời điểm epoch).
time_mktime_example.py
import time

a_struct_time = time.localtime()

print ("Current time as struct_time: ");
print (a_struct_time)

# Chuyển đổi struct_time hoặc Tuple thành Ticks.
ticks = time.mktime(a_struct_time)


print ("Ticks: ", ticks)

# Một Tuple có 9 phần tử.
aTupleTime = ( 2017, 4, 15, 13, 5, 34, 0, 0, 0)

print ("\n")
print ("A Tuple represents time: ")
print (aTupleTime)

# Chuyển đổi struct_time hoặc Tuple thành Ticks.
ticks = time.mktime(aTupleTime)

print ("Ticks: ", ticks)

struct_time, Ticks ==> string

Hàm Mô tả
time.asctime([struct_t]) Chuyển đổi một tuple hoặc struct_time đại diện cho một thời gian như được trả về bởi gmtime() hoặc localtime() thành một string như mẫu sau: 'Sun Jun 20 23:21:05 1993'. Nếu tham số struct_t không được cung cấp, thời điểm hiện tại được trả về bởi localtime() sẽ được sử dụng. Thông tin địa phương (locale) không được sử dụng bởi asctime().
time.ctime([secs]) Chuyển đổi thời gian theo số giây (seconds) từ thời điểm epoch thành một string đại diện cho thời gian máy tính (local time). Nếu tham số secs không được cung cấp hoặc None, thời gian hiện tại được trả về bởi time() sẽ được sử dụng. ctime(secs) tương đương với asctime(localtime(secs)). Thông tin địa phương (locale) không được sử dụng bởi ctime().
time_asctime_ctime_example.py
import time
 
# Một Tuple với 9 phần tử.
# (Year, month, day, hour, minute, second, wday, yday, isdst)
a_tuple_time = (2017, 4, 15 , 22 , 1, 29, 0, 0, 0)

a_timeAsString = time.asctime(a_tuple_time)

print ("time.asctime(a_tuple_time): ", a_timeAsString)


a_struct_time = time.localtime()
print ("a_struct_time: ", a_struct_time)

a_timeAsString = time.asctime(a_struct_time)

print ("time.asctime(a_struct_time): ", a_timeAsString)

# Số giây tính từ 12h sáng ngày 1-1-1970 tới hiện tại.
ticks = time.time()

a_timeAsString = time.ctime(ticks)


print ("time.ctime(ticks): ", a_timeAsString)

Phân tích và định dạng

module time cung cấp một số hàm sử dụng để phân tích (parse) một string thành thời gian. Và ngược lại, định dạng (format) thời gian thành một string.
Hàm Mô tả
time.strptime(string[, format] ) Phân tích một string đại diện một thời gian theo một định dạng. Trả về một struct_time giống như được trả về bởi hàm gmtime() hoặc localtime().
time.strftime(format [, t] ) Chuyển đổi một Tuple hoặc struct_time đại diện thời gian giống như được trả về bởi hàm gmtime() hoặc localtime() thành một string xác định bởi tham số format. Nếu nó không được cung cấp, thời gian hiện tại được trả về bởi localtime() sẽ được sử dụng. Tham số format phải là một string. ValueError có thể được ném ra (throw) nếu một trường (field) nào đó trong tham số 't' nằm ngoài phạm vi cho phép.
Ví dụ phân tích (parse) một string thành thời gian có kiểu struct_time.
time_strptime_example.py
import time

# Một string đại diện thời gian.
aStringTime = "22-12-2007 23:30:59"


a_struct_time = time.strptime(aStringTime, "%d-%m-%Y %H:%M:%S")

print ("a_struct_time:")

print (a_struct_time)
Xem thêm về module time:

4- datetime module

datetime là một module, được thiết kế theo hướng đối tượng để làm việc với ngày tháng và thời gian trong Python. Nó định nghĩa một vài lớp đại diện cho ngày tháng và thời gian.
Class Mô tả
datetime.date Một đối tượng date đại diện cho một ngày tháng (date), không bao gồm thời gian, theo bộ lịch Gregorian.
datetime.datetime Một đối tượng datetime đại diện cho một ngày tháng (date) và thời gian, theo bộ lịch Gregorian.
datetime.time Một đối tượng time đại diện cho thời gian (time), không bao gồm ngày tháng (date).
datetime.tzinfo Là một lớp cơ sở trừu tượng (base abstract class) cho các đối tượng thông tin múi giờ.
datetime.timezone Là một lớp con trực tiếp của lớp tzinfo, theo chuẩn UTC (Coordinated Universal Time) (Giờ hợp nhất quốc tế).
datetime.timedelta A timedelta object represents a duration, the difference between two dates or times.

5- datetime.timedelta

timedelta là một lớp nằm trong module datetime, nó mô tả một khoảng thời gian. Là sự khác biệt giữa 2 thời gian.
Lớp timedelta có 7 thuộc tính (attribute), đều có giá trị mặc định là 0.
Thuộc tính Mô tả Phạm vi
days   -999999999 : 999999999
seconds   0 : 86399
microseconds 1 seconds = 1000,000 microseconds 0 : 999999
milliseconds 1 seconds = 1000 milliseconds  
minutes    
hours    
weeks    

Các toán tử hỗ trợ.

Toán tử Ví dụ
t1 = t2 + t3 t2 = (hours = 10, seconds= 2)
t3 = (hours = 1, minutes = 3)
--> t1 = (hours= 11, minutes = 3, seconds = 2)
t1 = t2 - t3 t2 = (hours = 10, seconds= 2)
t3 = (hours = 1, minutes = 3)
--> t1 = (hours= 8, minutes = 57, seconds = 2)
t1 = t2 * i
t1 = i * t2
t2 = (hours = 10, seconds= 2)
i = 3
--> t1 = (days =1, hours = 6, seconds= 6)
   
t1 = t2 t2 = (hours = 25, seconds= 2)
--> t1 = (days: 1, hours: 1, seconds: 2)
+t1 return t1
-t1 t1 = (hours = 10, seconds= 2)
--> -t1 = (days = -1, hours = 13, minutes = 59, seconds= 58)
abs(t) Giá trị tuyệt đối, tương đương với +t khi t.days >= 0, và là -t khi  t.days < 0.

t = (hours= -25, minutes = 3)
--> t = (days =  -2, hours = 23, minutes = 3)
--> abs(t) = (days =  1, hours = 0, minutes = 57)
str(t) Trả về string theo mẫu [D day[s], ][H]H:MM:SS[.UUUUUU], D có thể nhận giá trị âm.
repr(t) Trả về string theo mẫu datetime.timedelta(D[, S[, U]]), D có thể nhận giá trị âm

6- datetime.date

datetime.date là một lớp, đối tượng của nó đại diện cho ngày tháng (date), không bao gồm thông tin thời gian

Phương thức khởi tạo (Constructor)

** constructor **
# MINYEAR <= year <= MAXYEAR
# 1 <= month <= 12
# 1 <= day <= số ngày cho bởi year và month.
date (year, month, day)
Constructor của lớp date có thể phát ra lỗi ValueError nếu các giá trị truyền vào không hợp lệ (nằm ngoài phạm vi cho phép).

Các hằng số:

Hằng số Mô tả
date.min Biểu thị ngày đầu tiên trong phạm vi của lớp date, date(MINYEAR, 1, 1).
date.max Biểu thị ngày cuối cùng trong phạm vi của lớp date, date(MAXYEAR, 12, 31).
date.resolution Sự khác biệt nhỏ nhất giữa các đối tượng date không bằng nhau, timedelta(days=1).

Các toán tử

Toán tử Mô tả
date2 = date1 + timedelta Cộng thêm một khoảng thời gian, timedelta
date2 = date1 - timedelta Trừ một khoảng thời gian, timedelta
timedelta = date1 - date2 Trừ hai đối tượng date.
date1 < date2 So sánh hai đối tượng date.

Các phương thức:

Phương thức Mô tả
date.replace(year=self.year, month=self.month, day=self.day) Trả về một đối tượng date với cùng giá trị, ngoại trừ các giá trị bị thay thế cho bởi tham số.

Ví dụ:
d == date(2002, 12, 31),  d.replace(day=26) == date(2002, 12, 26).
date.timetuple() Trả về một time.struct_time như được trả về bởi time.localtime(). Trong đó giờ, phút và giây bằng 0, và cờ DST là -1.

d.timetuple() tương đương với time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1)), trong đó yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1 là số thứ tự ngày trong năm, ngày 1-1 được gọi là ngày thứ 1.
date.toordinal() Trả về số thứ tự của ngày theo lịch Gregorian, theo đó ngày 1 tháng 1 của năm 1 có thứ tự là 1.

Đối với một đối tượng date bất kỳ d, date.fromordinal(d.toordinal()) == d.
date.weekday() Trả về ngày trong tuần có kiểu integer, với thứ hai là 0, thứ ba là 1, .. và chủ nhật là 6.

Ví dụ, date(2002, 12, 4).weekday() == 2, thứ tư. Xem thêm isoweekday().
date.isoweekday() Trả về ngày trong tuần là số có kiểu integer (Theo tiêu chuẩn ISO), với thứ hai là 1, thứ ba là 2 và chủ nhật là 7.

Ví dụ, date(2002, 12, 4).isoweekday() == 3, Thứ tư. Xem thêm weekday(), isocalendar().
date.isocalendar() Trả về một Tuple có 3 phần tử, (ISO year, ISO week number, ISO weekday).
date.isoformat() Trả về một String đại diện ngày tháng theo định dạng ISO 8601, ‘YYYY-MM-DD’.

Ví dụ, date(2002, 12, 4).isoformat() == '2002-12-04'.
date.__str__() Đối với đối tượng date d, str(d) tương đương với d.isoformat().
date.ctime() Trả về String đại diện date, ví dụ date(2002, 12, 4).ctime() == 'Wed Dec 4 00:00:00 2002'.

d.ctime() tương đương với time.ctime(time.mktime(d.timetuple())). Hàm ctime() được gọi phù hợp với tiêu chuẩn C khi chạy trên các nền tảng (flatform).
date.strftime(format) Trả về string đại diện date, theo định dạng (format) cho bởi tham số. Các mã định dạng cho giờ phút giây có giá tri 0.

Xem thêm hàm strftime()strptime() của module time.
date.__format__(format) Tương tự với date.strftime()

Xem thêm các chuyên mục: