12/08/2018, 13:26

calendar — Work with Dates (Translated Article)

Giới thiệu : Module calendar implement các class làm việc với các giá trị định hướng năm, tháng, tuần. Đầu tiên, module calendar định nghĩa ra class Calendar. Class này đóng gói các tính toán dành cho các giá trị như là ngày của các tuần trong một tháng hoặc một năm cho trước. Thêm vào đó, các ...

Giới thiệu: Module calendar implement các class làm việc với các giá trị định hướng năm, tháng, tuần. Đầu tiên, module calendar định nghĩa ra class Calendar. Class này đóng gói các tính toán dành cho các giá trị như là ngày của các tuần trong một tháng hoặc một năm cho trước. Thêm vào đó, các class TextCalendar và HTMLCalendar có thể tạo ra các output được định dạng trước.

Formatting Examples

Method prmonth() là một hàm đơn giản tạo ra output dạng text của một tháng

Picture 1.png

Ở ví dụ trên, một tuần được thiết lập để bắt đầu vào Chủ Nhật, tuân theo chuẩn Mỹ. Mặc định là tuân theo chuẩn châu Âu, một tuần bắt đầu vào thứ Hai.

Đầu ra của đoạn mã trên:

Picture 2.png

Một bảng HTML tương tự có thể được tạo ra với method formatmonth() của class HTMLCalendar. Output của method này trông đại khái giống với bản text thô, ngoại trừ việc nó được bao bởi các thẻ HTML. Mỗi ô trong bảng sẽ có class tương ứng với ngày trong tuần, do đó chúng có thể được định dạng lại thông qua CSS.

Ngoài các định dạng mặc định, chúng ta có thể tạo ra các output có định dạng khác bằng cách sử dụng module calendar để tính toán các giá trị ngày và sắp xếp chúng vào các dải tuần và tháng, sau đó lặp kết quả này. Các method weekheader(), monthcalendar() và yeardays2calendar() đặc biệt hữu ích trong việc này.

Việc gọi yeardays2calendar() sẽ tạo ra một chuỗi các list "dòng tháng" ("month row"). Mỗi list bao gồm các tháng như là một list khác bao gồm các tuần. Mỗi tuần lại là một list các tuple tạo bởi ngày trong tháng (day number, 1 - 31) và ngày trong tuần (weekday, 0 - 6). Những ngày nằm ngoài tháng sẽ có giá trị day number bằng 0.

Picture 3.png

yeardays2calendar(2015, 3) trả lại dữ liệu năm 2015 với 3 tháng mỗi dòng.

Picture 4.png

Chúng ta có thể thu được kết quả tương tự với method formatyear() của class TextCalendar.

Picture 5.png

Với cùng tham số đầu vào trên, formatyear() trả về kết quả:

Picture 6.png

Các module attribute day_name, day_abbr, month_name và month_abbr hữu ích trong việc tạo ra các output có định dạng tùy biến (ví dụ chúng ta có thể đính kèm link vào output HTML). Chúng được thiết lập mặc định với locale hiện tại.

Locales

Để tạo ra một calendar với định dạng của một locale, chúng ta có thể sử dụng LocaleTextCalendar hoặc LocaleHTMLCalendar

Picture 7.png

Ngày đầu tiên trong tuần không phải là một phần của locale settings. Giá trị này được lấy từ tham số truyền vào khi khởi tạo đối tượng calendar (Calendar, TextCalendar, HTMLCalendar).

Picture 8.png

Calculating Dates

Mặc dù module calendar tập trung chủ yếu vào việc in ra đầy đủ các calendar trong các định dạng khác nhau, nó còn cung cấp các function hữu ích trong việc làm việc với ngày tháng theo các cách khác nhau, ví dụ như tính toán ngày tháng đối với một sự kiện tuần hoàn. Ví dụ, nhóm Python Atlanta User gặp mặt vào thứ Năm thứ hai hàng tháng. Để tính ra các ngày diễn ra các cuộc gặp mặt hàng năm, ta sử dụng giá trị trả về của phương thức monthcalendar().

Picture 9.png

Một số ngày có giá trị 0. Đó là những ngày trong tuần không thuộc tháng đang xét nhưng lại nằm trong một tháng khác.

Picture 10.png

Ngày đầu tiên của một tuần mặc định là thứ Hai. Điều này có thể thay đổi bằng cách gọi method setfirstweekday(). Nhưng bởi vì module calendar bao gồm cách hằng số để đánh chỉ mục cho các dải giá trị tháng trả về bởi monthcalendar(), tốt hơn là bỏ qua bước này ở đây.

Để tính ra các ngày gặp mặt nhóm trong năm 2015, giả sử là ngày thứ Năm thứ hai hàng tháng, các giá trị 0 biểu thị thứ Năm của tuần đầu tiên nằm trong tháng đang xét (hoặc tháng đó bắt đầu vào thứ Sáu)

Picture 11.png

Vậy lịch gặp mặt cho năm 2015 như sau:

Picture 12.png

Nguồn: https://pymotw.com/3/calendar/

0