Python: Date và Time
Có một số cách trong Python để có thể xử lý ngày và giờ (date and time). Chuyển đổi giữa các định dạng ngày tháng là một công việc thường xuyên đối với máy tính. Các mô-đun calendar và time của Python giúp ta có thể làm việc với ngày và giờ.
Tick là gì?
Khoảng thời gian là số dấu phẩy động tính bằng đơn vị giây. Thời gian cụ thể được biểu thị bằng giây bắt đầu từ 00:00:00 giờ ngày 1 tháng 1 năm 1970 (sau công nguyên).
Mô-đun time có sẵn trong Python cung cấp một hàm để làm việc với thời gian đó là hàm time.time() trả về thời gian hệ thống hiện tại tính bằng dấu tích kể từ 00:00:00 giờ ngày 1 tháng 1 năm 1970.
Ví dụ
import time ticks = time.time() print("Số lượng tick tính từ 00:00:00 ngày 01/01/1970:", ticks)
Điều này sẽ tạo ra một kết quả dạng như sau:
Số lượng tick tính từ 00:00:00 ngày 01/01/1970: 1606825328.4482906
Số học ngày tháng rất dễ thực hiện với tick. Tuy nhiên, các ngày trước công nguyên không thể được thể hiện dưới dạng này. Ngày trong tương lai xa cũng không thể được thể hiện theo cách này - điểm giới hạn là đến năm 2038 đối với UNIX và Windows.
TimeTuple là gì?
Nhiều hàm thời gian của Python xử lý thời gian dưới dạng một bộ gồm 9 số, như được hiển thị bên dưới:
Trường | Giá trị |
---|---|
Năm 4 chữ số | 2020 |
Tháng | 1 đến 12 |
Ngày | 1 đến 31 |
Giờ | 0 đến 23 |
Phút | 0 đến 59 |
Giây | 0 đến 61 (60 hoặc 61 là giây nhuận) |
Ngày trong tuần | 0 đến 6 (0 là Thứ Hai) |
Ngày trong năm | 1 đến 366 (ngày Julian) |
Lưu ngày daylight | -1, 0, 1, -1 nghĩa là thư viện xác định DST |
Tuple ở trên tương đương với cấu trúc struct_time. Cấu trúc này có các thuộc tính sau:
Thuộc tính | Giá trị |
---|---|
tm_year | 2020 |
tm_mon | 1 đến 12 |
tm_mday | 1 đến 31 |
tm_hour | 0 đến 23 |
tm_min | 0 đến 59 |
tm_sec | 0 đến 61 (60 hoặc 61 là giây nhuận) |
tm_wday | 0 đến 6 (0 là Thứ Hai) |
tm_yday | 1 đến 366 (ngày Julian) |
tm_isdst | -1, 0, 1, -1 nghĩa là thư viện xác định DST |
Nhận thời gian hiện tại
Để dịch tức thì thời gian từ một giây kể từ giá trị dấu phẩy động của kỷ nguyên thành bộ thời gian, hãy chuyển giá trị dấu phẩy động cho một hàm (ví dụ: localtime) trả về bộ thời gian có tất cả chín mục hợp lệ ở trên.
import time; localtime = time.localtime(time.time()) print "Local current time :", localtime
Điều này sẽ tạo ra kết quả sau, có thể được định dạng ở bất kỳ hình thức nào khác có thể trình bày được:
Thời gian cục bộ hiện thời: time.struct_time(tm_year=2020, tm_mon=12, tm_mday=1, tm_hour=19, tm_min=31, tm_sec=36, tm_wday=1, tm_yday=336, tm_isdst=0)
Nhận định dạng thời gian
Bạn có thể định dạng bất kỳ lúc nào theo yêu cầu của mình, nhưng phương pháp đơn giản để có thời gian ở định dạng có thể đọc được là asctime():
import time; localtime = time.asctime(time.localtime(time.time())) print("Thời gian cục bộ hiện thời:\n", localtime)
Điều này sẽ tạo ra kết quả sau:
Thời gian cục bộ hiện thời: Tue Dec 1 19:33:40 2020
Nhận lịch trong một tháng
Mô-đun calendar cung cấp một loạt các phương thức để thao tác được với lịch năm và tháng. Ở ví dụ sau đây ta sẽ in lịch cho một tháng nhất định (tháng 12 năm 2020):
import calendar cal = calendar.month(2020, 12) print("Lịch của tháng 12/2020:") print("-----------------------") print(cal) print("-----------------------")
Điều này sẽ tạo ra kết quả sau:
Lịch của tháng 12/2020: ----------------------- December 2020 Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 -----------------------
Mô-đun time
Dưới đây là danh sách các phương thức của module time:
time.altzone
Chênh lệch của múi giờ DST cục bộ, tính bằng giây về phía tây của UTC, nếu múi giờ được xác định. Trả về 1 số <0 nếu múi giờ DST địa phương nằm ở phía đông UTC (như ở Tây Âu, bao gồm cả Vương quốc Anh). Chỉ sử dụng phương thức này nếu daylight là ánh sáng ban ngày.
Ví dụ:
import time print("time.altzone:", time.altzone)
Kết quả:
time.altzone: -28800
time.asctime([tupletime])
Chấp nhận bộ tuple thời gian và trả về một chuỗi 24 ký tự có thể đọc được, chẳng hạn như 'Thứ ba ngày 11 tháng 12 18:07:14 2020'.
Ví dụ:
import time t = time.localtime() print("time.asctime(t):", time.asctime(t))
Kết quả:
time.asctime(t): Tue Dec 1 21:40:00 2020
time.ctime()
Phương thức thời gian Python ctime() chuyển đổi thời gian được biểu thị bằng giây kể từ đầu công nguyên thành một chuỗi biểu thị thời gian cục bộ. Nếu giây 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. Hàm này tương đương với asctime(localtime(giây)). Thông tin ngôn ngữ không được sử dụng bởi ctime().
Ví dụ:
import time print("time.ctime():", time.ctime())
Kết quả:
time.ctime(): Thu Dec 3 14:19:03 2020
time.gmtime()
Chấp nhận thời gian được biểu thị bằng giây tính từ sau công nguyên và trả về bộ thời gian t với thời gian UTC. Lưu ý: t.tm_isdst luôn là 0.
Ví dụ:
import time print("time.gmtime():", time.gmtime())
Kết quả:
time.gmtime(): time.struct_time(tm_year=2020, tm_mon=12, tm_mday=3, tm_hour=7, tm_min=23, tm_sec=7, tm_wday=3, tm_yday=338, tm_isdst=0)
time.localtime()
Chấp nhận thời gian được biểu thị bằng giây kể từ sau công nguyên và trả về bộ thời gian t với giờ địa phương (t.tm_isdst là 0 hoặc 1, tùy thuộc vào việc áp dụng DST cho giây tức thì theo quy tắc cục bộ).
Ví dụ:
import time print("time.gmtime():", time.gmtime())
Kết quả:
time.localtime(): time.struct_time(tm_year=2020, tm_mon=12, tm_mday=3, tm_hour=14, tm_min=25, tm_sec=37, tm_wday=3, tm_yday=338, tm_isdst=0)
time.mktime(tupletime)
Chấp nhận thời điểm được biểu thị dưới dạng bộ điều chỉnh thời gian theo giờ địa phương và trả về giá trị dấu phẩy động với thời điểm được biểu thị bằng giây kể từ sau công nguyên.
Ví dụ:
import time t = (2020, 12, 3, 17, 3, 38, 1, 48, 0) secs = time.mktime( t ) print("time.mktime(t):", secs) print("asctime(localtime(secs)):", time.asctime(time.localtime(secs)))
Kết quả:
time.mktime(t): 1606989818.0
asctime(localtime(secs)): Thu Dec 3 17:03:38 2020
time.sleep(second)
Chấp nhận thời điểm được biểu thị dưới dạng bộ điều chỉnh thời gian theo giờ địa phương và trả về giá trị dấu phẩy động với thời điểm được biểu thị bằng giây kể từ sau công nguyên.
Ví dụ:
import time print("Start:", time.ctime()) time.sleep(5) print("End:", time.ctime())
Kết quả:
Start: Thu Dec 3 14:34:58 2020
End: Thu Dec 3 14:35:03 2020
time.strftime(format[, tupletime])
Phương thức strftime() chuyển đổi một tuple hoặc struct_time đại diện cho một thời gian được trả về bởi gmtime() hoặc localtime() thành một chuỗi như được chỉ định bởi đối số định dạng.
Nếu tupletime không được cung cấp thì thời gian hiện tại được trả về bởi localtime() sẽ được sử dụng. format phải là một chuỗi. Ngoại lệ ValueError sẽ được đưa ra nếu bất kỳ trường nào trong tupletime nằm ngoài phạm vi cho phép.
Các chỉ thị
- %a - tên ngày trong tuần viết tắt
- %A - tên đầy đủ các ngày trong tuần
- %b - tên tháng viết tắt
- %B - tên tháng đầy đủ
- %c - đại diện ngày và giờ ưa thích
- %C - số thế kỷ (năm chia cho 100, phạm vi từ 00 đến 99)
- %d - ngày trong tháng (01 đến 31)
- %D - giống như% m /% d /% y
- %e - ngày trong tháng (1 đến 31)
- %g - giống% G, nhưng không có thế kỷ
- %G - năm gồm 4 chữ số tương ứng với số tuần ISO (xem% V).
- %h - giống như% b
- %H - giờ, sử dụng đồng hồ 24 giờ (00 đến 23)
- %I - giờ, sử dụng đồng hồ 12 giờ (01 đến 12)
- %j - ngày trong năm (001 đến 366)
- %m - tháng (01 đến 12)
- %M - phút
- %n - ký tự dòng mới
- %p - sáng hoặc chiều theo giá trị thời gian nhất định
- %r - ký hiệu giờ sáng và chiều
- %R - thời gian trong ký hiệu 24 giờ
- %S - giây
- %t - ký tự tab
- %T - thời gian hiện tại, bằng% H:% M:% S
- %u - ngày trong tuần dưới dạng số (1 đến 7), Thứ Hai = 1. Cảnh báo: In Sun Solaris Sunday = 1
- %U - số tuần của năm hiện tại, bắt đầu từ Chủ nhật đầu tiên là ngày đầu tiên của tuần đầu tiên
- %V - Số tuần ISO 8601 của năm hiện tại (01 đến 53), trong đó tuần 1 là tuần đầu tiên có ít nhất 4 ngày trong năm hiện tại và với Thứ Hai là ngày đầu tiên của tuần
- %W - số tuần của năm hiện tại, bắt đầu với thứ Hai đầu tiên là ngày đầu tiên của tuần đầu tiên
- %w - ngày trong tuần dưới dạng số thập phân, Chủ nhật = 0
- %x - đại diện ngày ưa thích không có thời gian
- %X - biểu diễn thời gian ưa thích không có ngày
- %y - năm không có thế kỷ (phạm vi từ 00 đến 99)
- %Y - năm bao gồm cả thế kỷ
- %Z hoặc%z - múi giờ hoặc tên hoặc chữ viết tắt
- %% - một ký tự % theo nghĩa đen
Ví dụ:
import time t = (2020, 12, 3, 17, 3, 38, 1, 48, 0) t = time.mktime(t) print(time.strftime("%b %d %Y %H:%M:%S", time.gmtime(t)))
Khi chúng tôi chạy chương trình trên, nó tạo ra kết quả sau:
Kết quả:
Dec 03 2020 10:03:38
strptime()
Phương thức strptime() phân tích cú pháp một chuỗi biểu thị thời gian theo một định dạng. Giá trị trả về là struct_time do gmtime() hoặc localtime() trả về.
Tham số định dạng sử dụng các chỉ thị giống như các chỉ thị được sử dụng bởi strftime(); nó mặc định là "%a %b %d %H:%M:%S %Y" khớp với định dạng được trả về bởi ctime().
Nếu chuỗi không thể được phân tích cú pháp theo định dạng hoặc nếu nó có dữ liệu thừa sau khi phân tích cú pháp, thì sẽ phát sinh ngoại lệ ValueError.
Ví dụ:
import time struct_time = time.strptime("30 Nov 20", "%d %b %y") print("returned tuple:", struct_time)
Kết quả:
returned tuple: time.struct_time(tm_year=2020, tm_mon=11, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=335, tm_isdst=-1)
time.time()
Trả về thời gian hiện tại của hệ thống dưới dạng lượng giây dấu phẩy động tính từ sau công nguyên.
Ví dụ:
import time print("Current seconds:", time.time())
Một kết quả:
Current seconds: 1607002913.0474467
time.tzset()
Phương thức tzset() dùng để đặt lại các quy tắc chuyển đổi thời gian được sử dụng bởi các quy trình thư viện. Biến môi trường TZ sẽ chỉ định cách thực hiện điều này.
Định dạng tiêu chuẩn của biến môi trường TZ là (đưa thêm dấu cách cho dễ nhìn):
std offset [dst [offset [,start[/time], end[/time]]]]
- std và dst: Ba hoặc nhiều chữ và số cung cấp các chữ viết tắt của múi giờ, chúng sẽ được truyền vào time.tzname.
- offset: Phần bù có dạng - .hh[:mm[:ss]]. Điều này cho biết giá trị đã thêm vào giờ địa phương để đến UTC. Nếu đứng trước dấu '-' thì múi giờ sẽ ở phía đông Kinh tuyến gốc; ngược lại sẽ là phía tây. Nếu không có điểm bù nào theo sau dst thì giờ mùa hè được giả định là trước giờ chuẩn một giờ.
- start[/time], end[/time]: Cho biết thời điểm thay đổi đến và quay lại từ DST. Định dạng của ngày bắt đầu và ngày kết thúc là một trong những định dạng sau:
- Jn: Ngày Julian thứ n (1 <= n <= 365). Ngày nhuận không được tính, vì vậy trong tất cả các năm, ngày 28 tháng 2 là ngày 59 và ngày 1 tháng 3 là ngày 60.
- n: Ngày Julian dựa trên 0 (0 <= n <= 365). Ngày nhuận được tính, và có thể tham khảo ngày 29 tháng Hai.
- Mm.nd: Ngày thứ d (0 <= d <= 6) hoặc tuần n của tháng m trong năm (1 <= n <= 5, 1 <= m <= 12, trong đó tuần 5 có nghĩa là ' ngày cuối cùng trong tháng m 'có thể xảy ra vào tuần thứ tư hoặc thứ năm). Tuần 1 là tuần đầu tiên xảy ra ngày thứ d. Ngày 0 là Chủ nhật.
- time: Định dạng này có cùng định dạng với offset ngoại trừ việc không cho phép dấu ở đầu ('-' hoặc '+'). Giá trị mặc định nếu không có thời gian là 02:00:00.
Ví dụ:
import time import os os.environ['TZ'] = 'EST+05EDT,M4.1.0,M10.5.0' time.tzset() print(time.strftime('%X %x %Z')) os.environ['TZ'] = 'AEST-10AEDT-11,M10.5.0,M3.5.0' time.tzset() print(time.strftime('%X %x %Z'))
Kết quả:
13:00:40 02/17/09 EST 05:00:40 02/18/09 AEDT
Có hai thuộc tính quan trọng sau đây có sẵn với mô-đun time:
time.timezone
Thuộc tính time.timezone chứa khoảng thời gian chênh lệch tính bằng giây của múi giờ địa phương (không có DST) từ UTC (>0 ở Châu Mỹ; <= 0 ở hầu hết Châu Âu, Châu Á, Châu Phi).
Ví dụ:
import time
print(time.timezone)
Kết quả:
-25200
time.tzname
Thuộc tính time.tzname chứa một cặp chuỗi phụ thuộc ngôn ngữ địa phương, là tên của múi giờ địa phương không có và có DST tương ứng.
Ví dụ:
import time
print(time.tzname)
Kết quả:
('SE Asia Standard Time', 'SE Asia Daylight Time')
Mô-đun calendar
Mô-đun calendar cung cấp các hàm liên quan đến lịch, bao gồm các hàm in lịch văn bản cho một tháng hoặc năm cụ thể.
Theo mặc định, lịch lấy thứ hai là ngày đầu tiên trong tuần và chủ nhật là ngày cuối cùng của tuần. Để thay đổi điều này, hãy gọi hàm calendar.setfirstweekday().
Dưới đây là danh sách các hàm có sẵn với mô-đun calendar:
calendar.calendar(year, w = 2, l = 1, c = 6)
Trả về một chuỗi nhiều dòng có lịch cho năm year được định dạng thành ba cột cách nhau bởi c dấu cách, w là chiều rộng tính bằng ký tự của mỗi ngày; mỗi dòng có độ dài 21 * w + 18 + 2 * c. l là số dòng cho mỗi tuần.
Ví dụ:
import calendar print(calendar.calendar(2020, w = 2, l = 1, c = 6))
Kết quả:
2020 January February March Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 4 5 1 2 1 6 7 8 9 10 11 12 3 4 5 6 7 8 9 2 3 4 5 6 7 8 13 14 15 16 17 18 19 10 11 12 13 14 15 16 9 10 11 12 13 14 15 20 21 22 23 24 25 26 17 18 19 20 21 22 23 16 17 18 19 20 21 22 27 28 29 30 31 24 25 26 27 28 29 23 24 25 26 27 28 29 30 31 April May June Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 4 5 1 2 3 1 2 3 4 5 6 7 6 7 8 9 10 11 12 4 5 6 7 8 9 10 8 9 10 11 12 13 14 13 14 15 16 17 18 19 11 12 13 14 15 16 17 15 16 17 18 19 20 21 20 21 22 23 24 25 26 18 19 20 21 22 23 24 22 23 24 25 26 27 28 27 28 29 30 25 26 27 28 29 30 31 29 30 July August September Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 4 5 1 2 1 2 3 4 5 6 6 7 8 9 10 11 12 3 4 5 6 7 8 9 7 8 9 10 11 12 13 13 14 15 16 17 18 19 10 11 12 13 14 15 16 14 15 16 17 18 19 20 20 21 22 23 24 25 26 17 18 19 20 21 22 23 21 22 23 24 25 26 27 27 28 29 30 31 24 25 26 27 28 29 30 28 29 30 31 October November December Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 4 1 1 2 3 4 5 6 5 6 7 8 9 10 11 2 3 4 5 6 7 8 7 8 9 10 11 12 13 12 13 14 15 16 17 18 9 10 11 12 13 14 15 14 15 16 17 18 19 20 19 20 21 22 23 24 25 16 17 18 19 20 21 22 21 22 23 24 25 26 27 26 27 28 29 30 31 23 24 25 26 27 28 29 28 29 30 31 30
calendar.firstweekday()
Trả về cài đặt hiện tại cho ngày trong tuần bắt đầu mỗi tuần. Theo mặc định, khi lịch được nhập lần đầu tiên, giá trị này là 0, nghĩa là thứ hai.
Ví dụ:
import calendar
print(calendar.firstweekday())
calendar.isleap(year)
Trả về True nếu year là năm nhuận; ngược lại trả về False.
Ví dụ:
import calendar print(calendar.isleap(2020))
Kết quả:
True
calendar.leapdays(y1, y2)
Trả về tổng số ngày nhuận giữa các năm trong phạm vi (y1, y2).
Ví dụ:
import calendar print(calendar.leapdays(2020, 2030))
Kết quả:
3
calendar.month(year, month, w = 2, l = 1)
Trả về một chuỗi nhiều dòng với lịch cho tháng month của năm year, một dòng mỗi tuần cộng với hai dòng tiêu đề; w là chiều rộng tính bằng ký tự của mỗi ngày; mỗi dòng có độ dài 7 * w + 6; l là số dòng cho mỗi tuần.
Ví dụ:
import calendar print(calendar.month(2020, 12, w = 2, l = 1))
Kết quả:
December 2020 Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
calendar.monthcalendar(year, month)
Trả về một danh sách các số nguyên đặt trong cặp ngoặc vuông. Mỗi danh sách phụ biểu thị một tuần. Các ngày bên ngoài tháng month trong năm year được đặt thành 0; các ngày trong tháng được đặt từ 1.
Ví dụ:
import calendar print(calendar.monthcalendar(2010, 12))
Kết quả:
[[0, 0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26], [27, 28, 29, 30, 31, 0, 0]]
calendar.monthrange(year, month)
Trả về hai số nguyên. Số đầu tiên là mã của ngày trong tuần của ngày đầu tiên của tháng trong năm; số thứ hai là số ngày trong tháng. Mã các ngày trong tuần là 0 (Thứ Hai) đến 6 (Chủ Nhật); số tháng là 1 đến 12.
Ví dụ:
import calendar print(calendar.monthrange(2020, 12))
Kết quả:
(1, 31)
calendar.prcal(year, w = 2, l = 1, c = 6)
Tương tự như calendar.calendar().
calendar.prmonth(year, month, w = 2, l = 1)
Tương tự như in calendar.month().
calendar.setfirstweekday(number)
Đặt ngày đầu tiên của mỗi tuần thành number. Mã các ngày trong tuần là 0 (Thứ Hai) đến 6 (Chủ Nhật).
calendar.timegm(tupletime)
Là nghịch đảo của time.gmtime: chấp nhận một thời gian tức thì ở dạng bộ thời gian và trả về cùng một thời điểm dưới dạng một số giây dấu phẩy động tình từ đầu kỷ nguyên sau công nguyên.
Ví dụ:
import calendar tup=(2020, 12, 4, 21, 22, 48) print(calendar.timegm(tup))
Kết quả:
1607116968
calendar.weekday(year, month, day)
Trả về mã ngày trong tuần cho ngày day đã cho. Mã các ngày trong tuần là 0 (Thứ Hai) đến 6 (Chủ Nhật); số tháng là 1 (tháng 1) đến 12 (tháng 12).
Ví dụ:
import calendar print(calendar.weekday(2020, 12, 4))
Kết quả:
4
Các mô-đun & hàm khác
Nếu bạn quan tâm, thì ở đây bạn sẽ tìm thấy danh sách các mô-đun và chức năng quan trọng khác để thao tác với ngày và giờ trong Python:
- Mô-đun datetime
- Mô-đun pytz
- Mô-đun dateutil