整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          calendar - 日歷相關│Python標準庫

          calendar - 日歷相關│Python標準庫

          情提示: 測試代碼中,右尖括號(>)表示命令行中輸入的命令; 單獨一行并以井字符(#)開頭的為輸出內容; 庫的導入僅在本文的第一個測試代碼中展現,其他代碼塊均省略庫的導入代碼。

          • 系統類型: Windows 10
          • python 版本: Python 3.9.0

          calendar 模塊提供了與日歷有關的函數與類。其中既包含了可方便用于計算或信息處理的日歷格式,也包含了可直觀展示的日歷格式,甚至有用于網頁展示的 html 格式.

          calendar 模塊提供了三個類,也提供了一些屬性和函數進行快捷操作。calendar 模塊提供的函數將分布在同功能的類中介紹。

          calendar 模塊提供了 4 個屬性,所有屬性返回的數據都是可迭代對象:

          • calendar.day_name : 在當前語言環境下表示星期幾的數組
          • calendar.day_abbr : 在當前語言環境下表示星期幾縮寫的數組
          • calendar.month_name : 在當前語言環境下表示一年中月份的數組。這里為了現實習慣,一月的月號為 1,所以此數組的元素個數為 13 個,其中索引值為 0 的元素的值為空
          • calendar.month_abbr : 在當前語言環境下表示月份簡寫的數組。這里為了現實習慣,一月的月號為 1,所以此數組的元素個數為 13 個,其中索引值為 0 的元素的值為空
          print(list(calendar.day_name))
          # ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
          print(list(calendar.day_abbr))
          # ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
          print(list(calendar.month_name))
          # ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
          print(list(calendar.month_abbr))
          # ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
          

          Calendar 類

          class calendar.Calendar(firstweekday=0)
          參數:
              firstweekday: int, 指定一周的第一天, 0 表示星期一, 6 表示星期天, 默認為 0
          

          創建已 Calendar 對象,Calendar 對象提供了一些方法,這些方法可以用于各種場景的與日歷有關的數據,得到的數據并不便于查看,但方便計算。

          iterweekdays()

          iterweekdays()
          返回值:
              可迭代對象
          

          返回一個可迭代對象,包含一星期對應的枚舉值,排序在第一個元素的枚舉值與類參數 firstweekday 的值一致。

          import calendar
          
          cc=calendar.Calendar(1)
          print(list(cc.iterweekdays()))
          # [1, 2, 3, 4, 5, 6, 0]
          
          cc=calendar.Calendar(4)
          print(list(cc.iterweekdays()))
          # [4, 5, 6, 0, 1, 2, 3]
          

          PS: 無論一周的第一天設置為星期幾,這與七天中每天對應的枚舉值無關。星期一的枚舉值一定是 0,星期二的枚舉值一定是 1,以此類推,星期天的枚舉值一定是 6。

          itermonthdates()

          itermonthdates(year, month)
          參數:
              year: 年
              month: 月
          返回值:
              可迭代對象
          

          返回一個可迭代對象,包含某年某月當月的全部日期,日期對象為 datetime 對象。

          若本月月初和月末不是一個完整的周,也會返回其他月份的日期用于組成一個完整的日期。也就是說某一周的日期里,包含指定月份的日期,也包含其他月份的日期,那么本方法返回的日期中也包含這些在同一周內的其他月份的日期。

          cc=calendar.Calendar(0)
          print(list(cc.itermonthdates(2021, 1)))
          # [
          # datetime.date(2020, 12, 28), datetime.date(2020, 12, 29),
          # datetime.date(2020, 12, 30), datetime.date(2020, 12, 31),
          # datetime.date(2021, 1, 1), datetime.date(2021, 1, 2),
          # ......
          # datetime.date(2021, 1, 30), datetime.date(2021, 1, 31)
          # ]
          

          PS: 此模塊的一些方法返回值內容過多,此文章將會省略一部分返回內容。

          itermonthdays()

          itermonthdays(year, month)
          itermonthdays2(year, month)
          itermonthdays3(year, month)
          itermonthdays4(year, month)
          參數:
              year: 年
              month: 月
          返回值:
              可迭代對象
          

          本方法是四胞胎兄弟,它們都返回一個可迭代對象,包含某年某月當月的全部日期。但是它們返回的元素的內容卻不盡相同。

          它們與 itermonthdates() 函數類似,在返回的日期中,月初和月末那一周種同周不同月的日期也會展出出來,但是與 itermonthdates() 函數不同的是,不在指定月份的日期對象展示的日期的值是 0。

          itermonthdays() 函數,可稱呼為一號函數,可迭代對象的元素為日期對應的天數。

          itermonthdays2() 函數,可稱呼為二號函數,可迭代對象的元素為由日期對應的天數和當天星期幾的枚舉值組成的元組。例如: (1, 5) 表示本月的一號,星期五。

          itermonthdays3() 函數,可稱呼為三號函數,可迭代對象的元素為由年、月、日組成的元組。例如: (2021, 1, 1) 表示2021年1月1日。

          itermonthdays4() 函數,可稱呼為四號函數,可迭代對象的元素為由年、月、日和當天星期表示的枚舉值組成的元組。例如: (2021, 1, 1, 5) 表示2021年1月1日周六。

          cc=calendar.Calendar(0)
          '''一號函數'''
          print(list(cc.itermonthdays(2021, 1)))
          # [0, 0, 0, 0, 1, 2, ......, 30, 31]
          
          '''二號函數'''
          print(list(cc.itermonthdays2(2021, 1)))
          # [(0, 0), (0, 1), (0, 2), (0, 3), (1, 4), (2, 5), ......, (30, 5), (31, 6)]
          
          '''三號函數'''
          print(list(cc.itermonthdays3(2021, 1)))
          # [(2020, 12, 28), (2020, 12, 29), (2020, 12, 30), (2020, 12, 31), (2021, 1, 1),
          #  (2021, 1, 2), (2021, 1, 3), (2021, 1, 4), (2021, 1, 5),
          # ......
          #  (2021, 1, 28), (2021, 1, 29), (2021, 1, 30), (2021, 1, 31)]
          
          '''四號函數'''
          print(list(cc.itermonthdays4(2021, 1)))
          # [(2020, 12, 28, 0), (2020, 12, 29, 1), (2020, 12, 30, 2),
          #  (2020, 12, 31, 3), (2021, 1, 1, 4), (2021, 1, 2, 5),
          # ......
          #  (2021, 1, 29, 4), (2021, 1, 30, 5), (2021, 1, 31, 6)]
          

          獲取指定年月的周列表

          monthdatescalendar(year, month)
          monthdays2calendar(year, month)
          monthdayscalendar(year, month)
          參數:
              year: 年
              month: 月
          返回值:
              列表, 一個多維列表
          

          以上三個函數都返回指定年月的日期數據,所返回的數據是一個列表,在列表內部,列表的元素是以周為單位分割的子列表,子列表中的元素才是日期數據。

          以上三個函數的不同點就在子列表中的日期數據:

          monthdatescalendar() 函數可以簡稱為 日期數據函數,因為這個函數的返回值內的日期數據是以 datetime.date 對象展示的。

          monthdayscalendar() 函數可以簡稱為 一號函數,這個函數的返回值內的日期數據是以代表日期的數字的形式展示的。

          monthdays2calendar() 函數可以簡稱為 二號函數,這個函數的返回值內的日期數據是以代表日期的數字和當天星期表示的枚舉值組成的二元元組的形式展示的。

          在 一號函數 和 二號函數 中,如果某個日期數據不是指定年月內的日期,那么代表日期的數字將是 0。

          cc=calendar.Calendar(0)
          
          '''返回 datetime.date'''
          print(cc.monthdatescalendar(2021, 1))
          # [
          #   [datetime.date(2020, 12, 28), ......, datetime.date(2021, 1, 3)],
          #   ......
          #   [datetime.date(2021, 1, 25), ......, datetime.date(2021, 1, 31)]
          # ]
          
          '''返回日期代表的數字'''
          print(cc.monthdayscalendar(2021, 1))
          # [
          #   [0, 0, 0, 0, 1, 2, 3], ......, [25, 26, 27, 28, 29, 30, 31]
          # ]
          
          '''返回日期代表的數字與當天星期表示的枚舉值組成的二元元組'''
          print(cc.monthdays2calendar(2021, 1))
          # [
          #   [(0, 0), (0, 1), (0, 2), (0, 3), (1, 4), (2, 5), (3, 6)],
          #   ......
          #   [(25, 0), (26, 1), (27, 2), (28, 3), (29, 4), (30, 5), (31, 6)]
          # ]
          

          在 calendar 模塊中,calendar.monthcalendar(year, month) 快捷函數與 monthdayscalendar() 方法類似,返回值相同。

          獲取可用于格式化的指定年的數據

          yeardatescalendar(year, width=3)
          yeardayscalendar(year, width=3)
          yeardays2calendar(year, width=3)
          參數:
              year: 年
              width: 關鍵字參數, 每幾個月分為一組, 默認為 3
          返回值:
              列表, 多維列表
          

          返回一個多維列表,列表內容為指定年的日期數據。列表的元素是以參數 width 設定的月份分組,指定數量的月份為一組,所以列表的元素個數就是分組個數,為了方便區分多維度(層級)的列表,我們可以將整個列表稱為 年列表,年列表 下代表月份分組的子列表稱為 月分組子列表。當前格式為: [[月分組子列表], ......, [月分組子列表]]。

          月分組子列表 的元素就是屬于本組的月份,月份數據格式也是列表,可以稱為 月子列表。月分組子列表 格式為: [[月子列表], ......, [月子列表]]。

          月子列表 的元素是屬于本月的周,周的數據格式依舊是列表,可以稱為 周子列表。月子列表 格式為: [[周子列表], ......, [月子列表]]。

          對于三個函數而言,以上部分數據格式都相同,三個函數不同的就是 周子列表 中的元素,沒錯,就是日期數據。這里的 周子列表 中的周數據也是秉承著 Calendar 類的特定,屬于本周但是不屬于本月的日期也會展示,但是若是展示日期代表的數字時,會展示為 0。

          yeardatescalendar() 函數返回值中的日期數據格式為 datetime.date 對象格式。yeardayscalendar() 函數返回值中日期數據為日期代表的數字。 yeardays2calendar() 函數返回值中日期數據為日期代表的數字與當天星期表示的枚舉值組成的二元元組。

          '''備注: 返回數據過于龐大, 受限于篇幅, 測試示例中僅具體展示了列表格式'''
          cc=calendar.Calendar(0)
          
          '''日期數據為日期代表的數字'''
          print(cc.yeardayscalendar(2021, width=2))
          # [
          #     [
          #         [
          #             [0, 0, 0, 0, 1, 2, 3], ......, [25, 26, 27, 28, 29, 30, 31],
          #         ],
          #         [
          #             [1, 2, 3, 4, 5, 6, 7], ......, [22, 23, 24, 25, 26, 27, 28],
          #         ],
          #     ],
          #     ......,
          #     [
          #         [
          #             [1, 2, 3, 4, 5, 6, 7], ......, [29, 30, 0, 0, 0, 0, 0],
          #         ],
          #         [
          #             [0, 0, 1, 2, 3, 4, 5], ......, [27, 28, 29, 30, 31, 0, 0],
          #         ],
          #     ],
          # ]
          
          '''日期數據為是以代表日期的數字和當天星期表示的枚舉值組成的二元元組'''
          print(cc.yeardays2calendar(2021, width=2))
          # [
          #     [
          #         [
          #             [(0, 0), ......, (3, 6)], ......, [(25, 0), ......, (31, 6)],
          #         ],
          #         [
          #             [(1, 0), ......, (7, 6)], ......, [(22, 0), ......, (28, 6)],
          #         ],
          #     ],
          #     ......,
          #     [
          #         [
          #             [(1, 0), ......, (7, 6)], ......, [(29, 0), ......, (0, 6)],
          #         ],
          #         [
          #             [(0, 0), ......, (5, 6)], ......, [(27, 0), ......, (0, 6)],
          #         ],
          #     ],
          # ]
          
          '''日期數據為 datatime.data 對象'''
          print(cc.yeardatescalendar(2021, width=2))
          # [
          #     [
          #         [
          #             [datetime.date(2020, 12, 28), ......, datetime.date(2021, 1, 3),],
          #             ......,
          #             [datetime.date(2021, 1, 25), ......, datetime.date(2021, 1, 31),],
          #         ],
          #         [
          #             [datetime.date(2021, 2, 1)), ......, datetime.date(2021, 2, 7),],
          #             ......,
          #             [datetime.date(2021, 2, 22), ......, datetime.date(2021, 2, 28),],
          #         ],
          #     ],
          #     ......,
          #     [
          #         [
          #             [datetime.date(2021, 11, 1), ......, datetime.date(2021, 11, 7),],
          #             ......,
          #             [datetime.date(2021, 11, 29), ......, datetime.date(2021, 12, 5),],
          #         ],
          #         [
          #             [datetime.date(2021, 11, 29), ......, datetime.date(2021, 12, 5),],
          #             ......,
          #             [datetime.date(2021, 12, 27), ......, datetime.date(2022, 1, 2),],
          #         ],
          #     ],
          # ]
          

          TextCalendar 類

          class calendar.TextCalendar(firstweekday=0)
          參數:
              firstweekday: int, 指定一周的第一天, 0 表示星期一, 6 表示星期天, 默認為 0
          

          TextCalendar 實例化對象,可通過 TextCalendar 實例化對象提供的方法獲取純文本的日歷數據,通常用于查看,無法用于計算。

          獲取一個月的日歷數據

          formatmonth(theyear, themonth, w=0, l=0)
          prmonth(theyear, themonth, w=0, l=0)
          參數
              theyear: 年份
              themonth: 月份
              w: 日期寬度, 日期內容始終為居中
              l: 每星期占用的行數
          

          formatmonth() 函數與 prmonth() 函數的目的都是給出指定年月當月的日歷數據,但是 formatmonth() 函數是以返回值的方式反饋的,prmonth() 函數則是直接打印數據。

          tc=calendar.TextCalendar(0)
          
          '''返回值'''
          print(tc.formatmonth(2021, 1))
          #     January 2021
          # 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
          
          '''直接打印'''
          tc.prmonth(2021, 1)
          #     January 2021
          # 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 模塊的快捷函數中,calendar.prmonth(theyear, themonth, w=0, l=0) 與 prmonth() 方法相同,都是直接打印出整個月的日歷; 另一個快捷函數 calendar.month(theyear, themonth, w=0, l=0) 與 formatmonth() 方法相同,是返回指定月份的日歷。

          獲取一年的日歷數據

          formatyear(theyear, w=2, l=1, c=6, m=3)
          pryear(theyear, w=2, l=1, c=6, m=3)
          參數:
              theyear: 年份
              w: 日期寬度, 日期內容始終為居中
              l: 每星期占用的行數
              c: 月與月之間的間隔大小
              m: 每列可展示多少個月份
          

          formatyear() 函數與 pryear() 函數的目的都是給出指定年的日歷數據,但是 formatyear() 函數是以返回值的方式反饋的,pryear() 函數則是直接打印數據。

          年日歷數據格式可以看做是 12 個月日歷數據的匯總,因篇幅原因就不展示測試示例了。

          同獲取指定月份日歷數據的兩個方法一樣,獲取指定年份的日歷數據也有兩個對應的快捷函數,calendar.prcal(year, w=0, l=0, c=6, m=3) 快捷函數對應 pryear() 方法,calendar.calendar(year, w=2, l=1, c=6, m=3) 快捷函數對應 formatyear() 方法。

          HTMLCalendar 類

          class calendar.HTMLCalendar(firstweekday=0)
          參數:
              firstweekday: int, 指定一周的第一天, 0 表示星期一, 6 表示星期天, 默認為 0
          

          HTMLCalendar 實例化對象,可以通過 HTMLCalendar 實例化對象提供的方法生成可以在網頁中展示的 HTML 日歷。并且也提供了一些屬性來修改各種標簽的類名,便于修改樣式。

          formatmonth() 方法獲取一個展示指定月份日歷的 HTML 表格。

          formatmonth(theyear, themonth, withyear=True)
          參數:
              theyear: 年
              themonth: 月
              withyear: 布爾值, 默認為 True, 若為 True, 則表頭內容會包含年份, 否則不包含
          返回值:
              str, 一個 table 標簽, 包含指定月份日歷數據
          

          formatyear() 方法獲取一個展示指定年份日歷的 HTML 表格。

          formatyear(theyear, width=3)
          參數:
              theyear: 年
              width: 默認值為 3, 表示一行可顯示的月份數量
          返回值:
              str, 一個 table 標簽, 包含指定年份日歷數據
          

          formatyearpage() 方法返回一個完整的 HTML 頁面,其中主要內容就是指定年份日歷數據。

          formatyearpage(theyear, width=3, css='calendar.css', encoding=None)
          參數:
              theyear: 年
              width: 默認值為 3, 表示一行可顯示的月份數量
              css: 導入的 css 文件, 用于豐富日歷表樣式
              encoding: 編碼, 若為 None 則使用系統默認編碼
          返回值:
              str, 一個完整的 HTML 頁面代碼
          

          使用以上方法生成的 HTML 代碼中,每個標簽都會有 class 屬性,這些 class 屬性是系統默認的,可能會對項目產生沖突或者命名規則不匹配等情況,HTMLCalendar 類給出了一系列可修改屬性來改變這些標簽上的 class 屬性。

          • cssclasses : 對應星期一到星期天的 class 名稱列表,列表元素必須有 7 個,默認為: ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
          • cssclass_noday : 在某周內,某日期在上月或下月時,此日期 td 標簽的 class
          • cssclasses_weekday_head : 正常日期的 td 標簽的 class,默認為當前日期代表的星期幾對應的 class 名。
          • cssclass_month_head: 月歷的表頭 class,默認為 month
          • cssclass_month : 月歷的 table 標簽的 class,默認為 month
          • cssclass_year : 年歷的 table 標簽的 class,默認為 year
          • cssclass_year_head : 年歷的表頭 class,默認為 year

          將以下 css 復制粘貼到某個 css 文件中,并 python 代碼,在瀏覽器中打開生成的 HTML 文件,來查看使用 python 生成的日歷。

          PS: 此 css 是在網絡中尋找的,使用的都是標簽名,對 HTMLCalendar 類中 class 相關內容無學習效果。

          table {width: 100%;}
          table tr th {text-align: center;font-size: 16px;background-color: #316497;color: #99ccff;}
          table tr td {width: 10%;border: 1px solid #555;vertical-align: top;height: 120px;padding: 2px;}
          td.noday {background-color: #eee;}
          td.filled {background-color: #99ccff;}
          td.today {border: 4px solid #316497;}
          .dayNumber {font-size: 16px !important;font-weight: bold;}
          a {font-size: 10px;}
          

          運行以下 python 代碼:

          hc=calendar.HTMLCalendar(0)
          
          with open('./test.html', 'wb') as f:
              f.write(hc.formatyearpage(2021, css='calendar.css'))
          

          在運行目錄下,會生成一個名稱為 test.html 的文件,在瀏覽器打開這個文件即可看到效果。

          快捷函數

          在類的介紹中,共有 5 個快捷函數與類中的方法含義一致,就直接在對應方法的介紹中說明了,沒有注意到的小伙伴可以向上翻閱回顧一下。剩余的快捷函數就留到這里一起介紹吧。

          setfirstweekday() 函數設置一周是以周幾為起點計算的。設置時可以使用代表星期的常量或者枚舉值。

          calendar.setfirstweekday(weekday)
          參數:
              weekday: 表示星期的常量或枚舉值, 枚舉值即對應的數字, 星期一到星期日的
                       常量則分別為:MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY 和 SUNDAY
          返回值:
              None
          

          firstweekday() 函數獲取一周的第一天是周幾。無論設置時使用的是代表星期的常量還是代表星期的枚舉值,返回的一定是枚舉值。

          calendar.firstweekday()
          返回值:
              int, 代表星期的枚舉值
          

          isleap() 函數判斷指定年是否是閏年,如果是閏年則返回 True,否則返回 False。

          calendar.isleap(year)
          參數:
              year: 年份
          返回值:
              布爾值
          

          leapdays() 函數獲取某個范圍年份(y1 至 y2 年之間)的閏年數量。

          calendar.leapdays(y1, y2)
          參數:
              y1, y2: 年份
          返回值:
              int
          

          weekday() 函數獲取某年某月某日是星期幾,返回代表星期的枚舉值。

          calendar.weekday(year, month, day)
          參數:
              year: 年
              month: 月
              day: 日
          返回值:
              int, 代表星期的枚舉值
          

          weekheader() 函數列出所有星期的英文縮寫頭,可以使用參數 n 來指定縮寫單詞的字母數量。返回一個字符串,每個英文縮寫頭以雙空格隔開。

          calendar.weekheader(n)
          參數:
              n: 縮寫字母的數量
          返回值:
              str, 每個縮寫以雙空格隔開
          

          monthrange() 函數獲取指定年月當月第一天是星期幾,并獲取當月天數。將兩個數據組合成一個元組返回.

          calendar.monthrange(year, month)
          參數:
              year: 年
              month: 月
          返回值:
              二元元組,某月第一天星期對應的枚舉值和當月天數組成
          

          參考資料

          官方文檔: https://docs.python.org/zh-cn/3/library/calendar.html#calendar.HTMLCalendar

          源代碼: Lib/calendar.py

          公眾號 : 「python雜貨鋪」,專注于 python 語言及其相關知識。發掘更多原創文章,期待您的關注。


          處理網頁數據時,我們經常需要從HTML中提取日期信息。日期格式多樣,從HTML文檔中準確地提取并驗證這些信息是一項挑戰。本文將詳細介紹如何使用正則表達式從HTML中提取日期,并用Python代碼進行有效性驗證。

          一、正則表達式基礎

          概念:

          正則表達式是用于文本搜索和替換的強大工具,它能夠描述復雜的模式。

          基本語法元素:

          字符集:[0-9]匹配任意數字,[a-zA-Z]匹配任意字母。

          量詞:*(零次或多次)、+(一次或多次)等。

          特殊字符:.匹配任意單個字符,\d匹配任意數字。

          分組:(19|20)\d\d匹配以19或20開頭的年份。

          二、從HTML中提取日期

          HTML結構分析:

          檢查網頁源代碼,找到包含日期的標簽或屬性。

          日期可能以不同格式存在,比如文本形式或屬性值。

          構建正則表達式:

          針對YYYY-MM-DD、DD-MM-YYYY、MM/DD/YYYY等格式編寫正則表達式。

          考慮HTML文檔結構的差異,調整正則表達式以提高匹配的準確性。

          三、驗證日期的有效性

          日期格式驗證:

          確保提取的字符串符合日期格式,但還需要進一步驗證日期的實際有效性。

          正則表達式初步驗證:

          使用正則表達式確保日期組件在合理范圍內,如月份應在01至12之間。

          編程驗證日期有效性:

          使用Python的datetime模塊進行進一步驗證。

          考慮特殊情況,如閏年和每月的實際天數。

          四、實際案例分析

          案例演示:

          選取具有代表性的網頁HTML樣本,標識其中的日期信息。

          編寫適用的正則表達式來匹配這些日期。

          代碼實現:

          使用Python演示如何應用正則表達式提取日期。

          展示如何使用datetime模塊驗證日期有效性。

          五、總結與展望

          總結:

          正則表達式是提取HTML中日期信息的有效工具,但還需通過編程驗證其有效性。

          未來應用:

          探討正則表達式在數據分析、日志處理等領域的應用。

          小結

          本文提供了一個全面的指南,說明了如何使用正則表達式從HTML文檔中提取日期,并通過Python代碼進行驗證。這些技能對于數據抓取和文本處理領域非常重要。

          Python 代碼示例

          1. 正則表達式提取日期

          python

          import re

          from datetime import datetime

          # 示例HTML內容

          html_content="""

          <p>發表日期:2020-12-15</p>

          <p>更新日期:2021/01/20</p>

          <p>活動日期:31-01-2022</p>

          """

          # 正則表達式匹配不同的日期格式

          date_patterns=[

          r'\d{4}-\d{2}-\d{2}', # YYYY-MM-DD

          r'\d{2}/\d{2}/\d{4}', # DD/MM/YYYY

          r'\d{2}-\d{2}-\d{4}' # DD-MM-YYYY

          ]

          # 提取日期

          extracted_dates=[]

          for pattern in date_patterns:

          matches=re.findall(pattern, html_content)

          extracted_dates.extend(matches)

          print("Extracted Dates:", extracted_dates)

          2. 驗證日期有效性

          python

          # 驗證日期有效性

          def validate_date(date_str):

          for fmt in ("%Y-%m-%d", "%d/%m/%Y", "%d-%m-%Y"):

          try:

          datetime.strptime(date_str, fmt)

          return True

          except ValueError:

          continue

          return False

          # 驗證提取的日期

          valid_dates=[date for date in extracted_dates if validate_date(date)]

          print("Valid Dates:", valid_dates)

          在這個例子中,我們首先使用正則表達式從HTML內容中提取日期,然后使用Python的datetime模塊驗證這些日期的有效性。這種方法適用于不同格式的日期,并能有效地識別和排除無效日期。

          天給大家分享一款超全功能的跨瀏覽器平臺甘特圖表庫DHTMLXGantt

          dhtmlx-gantt DHTMLX公司開源的 JavaScript 甘特圖/橫道圖/條狀圖類庫。用來快速構建顯示項目、進度,和隨著時間關聯的相關進展情況。

          說明

          dhtmlx-Gantt 由位于俄羅斯圣彼得堡DHTMLX公司開發的甘特圖組件,適用于B/S模式的Web應用開發。被廣泛應用于項目管理、建筑、IT軟件、汽車等領域。

          快速創建

          <!DOCTYPE html>
          <html>
          <head>
          	<meta http-equiv="Content-type" content="text/html; charset=utf-8">
          	<title>gantt demo</title>
          	<script src="dhtmlxgantt.js?v=6.0.0"></script>
          	<link rel="stylesheet" href="dhtmlxgantt.css?v=6.0.0">
          	<style>
          		html, body {
          			height: 100%;
          			padding: 0px;
          			margin: 0px;
          			overflow: hidden;
          		}
          	</style>
          </head>
          <body>
          <div id="gantt_here" style='width:100%; height:100%;'></div>
          <script>
          	var taskList={
          		data: [
          			{
          				id: 1, text: "Project #2", start_date: "01-04-2018", duration: 18, order: 10,
          				progress: 0.4, open: true
          			},
          			{
          				id: 2, text: "Task #1", start_date: "02-04-2018", duration: 8, order: 10,
          				progress: 0.6, parent: 1
          			},
          			{
          				id: 3, text: "Task #2", start_date: "11-04-2018", duration: 8, order: 20,
          				progress: 0.6, parent: 1
          			}
          		],
          		links: [
          			{id: 1, source: 1, target: 2, type: "1"},
          			{id: 2, source: 2, target: 3, type: "0"}
          		]
          	};
          	
          	gantt.config.date_format="%Y-%m-%d %H:%i";
          	gantt.init("gantt_here");
          	gantt.parse(taskList);
          </script>
          </body>
          </html>

          為了配置甘特圖所需外觀,dhtmlxGantt提供了2個對象 configtemplates

          gantt.config //日期,比例,控件等的配置選項。
          gantt.templates //格式化甘特圖中使用的日期和標簽的模板。
          • gantt.config 年示圖
          gantt.config.scale_unit="year"; //按年顯示
          gantt.config.step=1.5;	//設置時間刻度的步長(X軸)
          gantt.config.date_scale="%Y";	//日期尺度按年
          
          gantt.init("gantt_here");

          • gantt.config 月示圖
          gantt.config.scale_unit="month"; //按月顯示
          gantt.config.date_scale="%F, %Y"; //設置時間刻度的格式(X軸) 多個尺度
          
          gantt.config.scale_height=50; //設置時間刻度的高度和網格的標題
          
          gantt.config.subscales=[
          	{unit: "day", step: 1, date: "%j, %D"}
          ]; //指定第二個時間刻度
          
          gantt.init("gantt_here");

          • gantt.templates 可用于更改日期和標簽的顯示。
          gantt.templates.task_text=function(start,end,task){
          	return "<b>Text:</b> "+task.text+",<b> Holders:</b> "+task.username;
          };
          gantt.init("gantt_here");

          官網提供了豐富的文檔示例。

          非常棒的一款開源甘特圖庫,可以讓你預測時間、成本、數量及質量上的關聯并回溯結果。也能幫助你考慮人力、資源、日期、項目中重復的要素和關鍵部分,讓你更加直觀的看到任務進展及資源的利用率等。

          # 官網地址
          https://dhtmlx.com/docs/products/dhtmlxGantt/
          
          # 倉庫地址
          https://github.com/DHTMLX/gantt

          好了,今天就介紹到這里。大家如果有其它不錯的甘特圖庫,歡迎一起交流討論!


          主站蜘蛛池模板: 国产成人一区二区三区在线| 日本一区中文字幕日本一二三区视频| 国内精品视频一区二区三区| 亚洲AV无码一区二区三区电影 | 日韩一区二区三区在线观看| 色偷偷一区二区无码视频| 亚洲一区二区三区国产精华液| 一区二区三区午夜| 国产成人一区二区三区电影网站 | 亚洲欧洲∨国产一区二区三区| 国产精品久久久久久一区二区三区 | 日韩经典精品无码一区| 亚洲中文字幕乱码一区| 午夜福利av无码一区二区 | 无码日韩精品一区二区三区免费| 国产在线无码视频一区| 亚洲一区二区精品视频| 精品视频在线观看你懂的一区| 一区免费在线观看| 一区二区三区在线免费观看视频| 免费一区二区三区在线视频| 一本一道波多野结衣一区| 亚洲乱码一区av春药高潮| 香蕉免费一区二区三区| 天堂资源中文最新版在线一区| 中文字幕Av一区乱码| 日本韩国黄色一区二区三区| 91精品一区二区三区久久久久| 久久青草精品一区二区三区| 国产在线不卡一区二区三区 | 亚洲国产精品无码久久一区二区| 免费看无码自慰一区二区| 精品亚洲AV无码一区二区三区| 亚洲一区中文字幕久久| 久久国产精品一区免费下载| 久久婷婷久久一区二区三区| 日韩电影一区二区三区| 日韩一区二区久久久久久| 国产主播一区二区| 午夜天堂一区人妻| 亚洲影视一区二区|