首頁 > 軟體

Python標準庫datetime date模組的詳細介紹

2022-07-12 14:00:52

前言

datetime是Python提供的操作日期和時間的標準庫,主要有datetime.date模組、datetime.time模組及datetime.datetime模組。其中date模組提供了日期操作相關的方法;time模組提供了時間操作相關的方法;datetime提供了日期時間操作的相關內容。本文主要介紹datetime.date模組中常用函數的使用詳情。

日期物件類:

  • 日期物件具有3個屬性:年份、月份、日
  • 日期物件的建立使用date()定義
  • date()可以將傳入的引數轉化為datetime.date型別
  • date()函數按位元置傳參必須是:年份、月份、日
  • date()函數的引數中年份的範圍是1-9999,月份的範圍是1-12,日的範圍是1-31

1、定義

  • 先匯入datetime庫再操作
# coding:utf-8
import datetime
now_date = datetime.date(2022, 12, 26)
print(now_date)

1.2、常見錯誤

  • 缺少引數
  • 按位元置傳參時引數值超出範圍
# coding:utf-8
import datetime
print(datetime.date(2022, 12, 26))
print(type(datetime.date(2022, 12, 26))) # <class 'datetime.date'>
# 下面的程式碼報錯,缺少引數
# print(datetime.date(2022, 12)) # TypeError: function missing required argument 'day' (pos 3)
# 下面的程式碼提示值錯誤,date()函數的引數依次為 年份、月份、日;年份的範圍是1-9999,月份的範圍是1-12,日的範圍是1-31
# print(datetime.date(10001, 12, 12)) # ValueError: year 10001 is out of range
# print(datetime.date(2022, 13, 12)) # ValueError: month must be in 1..12
# print(datetime.date(2022, 12, 32)) # ValueError: day is out of range for month
# 關鍵字傳傳參,只要保證年份、月份、天的值都在可用範圍內,位置不受影響
print(datetime.date(day=15, year=2029, month=12))

2、date類常用的函數

2.1、獲取當期日期

# coding:utf-8
import datetime
print(datetime.date.today()) # 2022-07-08
print(type(datetime.date.today())) # <class 'datetime.date'>

2.2、格式化日期

2.2.1、ctime()

  • 將一個datetime.date物件轉換為日期時間格式的字串
  • ctime()函數的引數必須是 datetime.date型別
print(datetime.date.ctime(datetime.date.today())) # Fri Jul 8 00:00:00 2022
print(type(datetime.date.ctime(datetime.date.today()))) # <class 'str'>
# ctime()函數的引數必須是 datetime.date型別
print(datetime.date.ctime(datetime.date(2022, 12, 26))) # Mon Dec 26 00:00:00 2022

2.2.2、datetime.date物件

datetime_1 = datetime.date(2022, 12, 26)
# 獲取日期物件的日,返回的值為int型別
print(datetime_1.day, type(datetime_1.day), type(datetime_1)) # 26 <class 'int'> <class 'datetime.date'>
# 獲取日期物件的月,返回的值亦為int型別
print(datetime_1.month, type(datetime_1.month), type(datetime_1)) # 12 <class 'int'> <class 'datetime.date'>
# 獲取日期物件的年,返回的值亦為int型別
print(datetime_1.year, type(datetime_1.year), type(datetime_1)) # 2022 <class 'int'> <class 'datetime.date'>

2.2.3、replace(self, year=None, month=None, day=None)

  • 替換datetime.date物件的值
  • replace()函數具有一個必傳引數,三個預設引數
  • year是要替換的年度
  • month是要替換的月份
  • day是要替換的日
datetime_1 = datetime.date(2022, 12, 26)
print(datetime.date.replace(datetime_1, year=2019, month=11, day=25)) # 2019-11-25
print(type(datetime.date.replace(datetime_1, year=2019, month=11, day=25))) # <class 'datetime.date'>
print(datetime_1)
# 必須有一個日期或者時間物件的引數,不傳替換引數即返回傳入的datetime.date物件的值
print(datetime.date.replace(datetime_1)) # 2022-12-26
# 只替換年度
print(datetime.date.replace(datetime_1, year=2019)) # 2019-12-26
# 只替換月份
print(datetime.date.replace(datetime_1, month=11)) # 2022-11-26
# 只替換日
print(datetime.date.replace(datetime_1, day=25)) # 2022-12-25

通過觀察,替換年度、月份、日 都是在2022-12-26(datetime_1變數的初始值)基礎上替換的。所以可以肯定的是該函數不會改變原變數的值

2.2.4、格式化日期

格式符號

符號的含義

%y

兩位數的年份表示(00-99)

%Y

四位數的年份表示(000-9999)

%m

月份(01-12)

%d

月內中的一天(0-31)

%H

24小時制小時數(0-23)

%I

12小時制小時數(01-12)

%M

分鐘數(00-59)

%S

秒(00-59)

%a

本地簡化星期名稱

%A

本地完整星期名稱

%b

本地簡化的月份名稱

%B

本地完整的月份名稱

%c

本地相應的日期表示和時間表示

%j

年內的一天(001-366)

%p

本地A.M.或P.M.的等價符

%U

一年中的星期數(00-53)星期天為星期的開始

%w

星期(0-6),星期天為 0,星期一為 1,以此類推。

%W

一年中的星期數(00-53)星期一為星期的開始

%x

本地相應的日期表示

%X

本地相應的時間表示

%Z

當前時區的名稱

%%

%號本身

datetime_2 = datetime.datetime.today()
print(datetime_2, type(datetime_2))
print(datetime.date.strftime(datetime_1, "%Y--%y--%D--%d--%H--%h--%M--%m--%S--%A--%a--%B--%b--%C--%c"))
print(datetime.date.strftime(datetime_2, "%Y--%y--%D--%d--%H--%h--%M--%m--%S--%A--%a--%B--%b--%C--%c"))
# 常用的格式: 年、月、日、時、分、秒
print(datetime.date.strftime(datetime_2, "%Y-%m-%d %H:%M:%S")) # 2022-07-08 18:32:40

2.3、ISO標準格式日期

  • 格式:(4位元年-2位月-兩位日),如(2022,07,08)
# 返回日期或者時間物件的ISO標準日期(4位元年-2位月-兩位日)
print(datetime.date.isoformat(datetime_1), datetime_1) # 2022-12-26 2022-12-26
print(datetime.date.isoformat(datetime_2), datetime_2) # 2022-07-08 2022-07-08 18:44:36.613676
# 將符合ISO標準格式的日期字串轉換為datetime.date物件
print(datetime.date.fromisoformat("2022-07-08"), type(datetime.date.fromisoformat("2022-07-08")))
# 不符合ISO標準格式的日期字串則報錯
# print(datetime.date.fromisoformat("2022-7-08")) # ValueError: Invalid isoformat string: '2022-7-08'
# print(datetime.date.fromisoformat("2022-07-8")) # ValueError: Invalid isoformat string: '2022-7-08'

2.3.1、獲取符合ISO標準格式的日期字串的星期幾(1~7)

print(datetime.date.isoweekday(datetime.date(2022, 7, 3))) # 7 星期日
print(datetime.date.isoweekday(datetime.date(2022, 7, 4))) # 1 星期一
print(datetime.date.isoweekday(datetime.date(2022, 7, 8))) # 5 星期五
print(datetime.date.isoweekday(datetime.date(2022, 7, 9))) # 6 星期六

2.3.2、返回日期或者時間物件的星期幾(0~6)

# 返回日期或者時間物件的星期幾(0~6)
print(datetime.date.weekday(datetime.date(2022, 7, 3))) # 6 星期日
print(datetime.date.weekday(datetime.date(2022, 7, 4))) # 0 星期一
print(datetime.date.weekday(datetime.date(2022, 7, 8))) # 4 星期五
print(datetime.date.weekday(datetime.date(2022, 7, 9))) # 5 星期六

2.3.3、根據時間戳計算日期

print(datetime.date.fromtimestamp(2015236523)) # 2033-11-10
print(type(datetime.date.fromtimestamp(2015236523))) # <class 'datetime.date'>

2.3.4、ISO標準格式的時間元組

  • 格式 :(年份, 週數, 星期數),如(2022,26,7)
  • 週數:一年中的第幾周,範圍是1~53
  • 星期數:星期中的第幾天,週一為第1天,週日為第7天
# 獲取符合ISO標準格式的時間元組
print(datetime.date.isocalendar(datetime.date(2022, 7, 3))) # datetime.IsoCalendarDate(year=2022, week=26, weekday=7)
# 根據符合ISO標準格式的時間元組(年份, 週數, 星期數)計算日期
print(datetime.date.fromisocalendar(2022, 26, 7)) # 2022-07-03

2.4、公元歷格式日期

  • 公元1年1月1日為1
print(datetime.date.fromordinal(1), type(datetime.date.fromordinal(1))) # 0001-01-01 <class 'datetime.date'>
print(datetime.date.fromordinal(5)) # 0001-01-05
print(datetime.date.fromordinal(738339)) # 2022-07-03
# 返回公元公曆開始到現在的天數
print(datetime.date.toordinal(datetime.date(2022, 7, 3))) # 738339

3、其他

# 將 date型別轉換為struct_time型別
print(datetime.date.timetuple(datetime.date(2022, 7, 3)))
# 日期型別的最大值
print(datetime.date.max)
# 日期型別的最小值
print(datetime.date.min)

附錄:完整程式碼

# coding:utf-8
import datetime
# 日期物件類(date class)
"""
* 日期物件具有3個屬性:年份、月份、日
* date()可以將指定的三個引數轉化為datetime.date類的型別
* date()函數按位元置傳參必須是:年份、月份、日的順序
"""
print(datetime.date(2022, 12, 26))
print(type(datetime.date(2022, 12, 26))) # <class 'datetime.date'>
# 下面的程式碼報錯,缺少引數
# print(datetime.date(2022, 12)) # TypeError: function missing required argument 'day' (pos 3)
# 下面的程式碼提示值錯誤,date()函數的引數依次為 年份、月份、日;年份的範圍是1-9999,月份的範圍是1-12,日的範圍是1-31
# print(datetime.date(10001, 12, 12)) # ValueError: year 10001 is out of range
# print(datetime.date(2022, 13, 12)) # ValueError: month must be in 1..12
# print(datetime.date(2022, 12, 32)) # ValueError: day is out of range for month
# 關鍵字傳傳參,只要保證年份、月份、天的值都在可用範圍內,位置不受影響
print(datetime.date(day=15, year=2029, month=12))
# date類常用的函數
# 獲取當期日期
print(datetime.date.today()) # 2022-07-08
print(type(datetime.date.today())) # <class 'datetime.date'>
# ctime()是將一個datetime.date物件轉換為日期時間格式的字串
print(datetime.date.ctime(datetime.date.today())) # Fri Jul 8 00:00:00 2022
print(type(datetime.date.ctime(datetime.date.today()))) # <class 'str'>
# ctime()函數的引數必須是 datetime.date型別
print(datetime.date.ctime(datetime.date(2022, 12, 26))) # Mon Dec 26 00:00:00 2022

# 建立一個 datetime.date物件
datetime_1 = datetime.date(2022, 12, 26)
# 獲取日期物件的日,返回的值為int型別
print(datetime_1.day, type(datetime_1.day), type(datetime_1)) # 26 <class 'int'> <class 'datetime.date'>
# 獲取日期物件的月,返回的值亦為int型別
print(datetime_1.month, type(datetime_1.month), type(datetime_1)) # 12 <class 'int'> <class 'datetime.date'>
# 獲取日期物件的年,返回的值亦為int型別
print(datetime_1.year, type(datetime_1.year), type(datetime_1)) # 2022 <class 'int'> <class 'datetime.date'>
# 替換datetime.date物件的值
# replace(self, year=None, month=None, day=None) 函數具有一個必傳引數,三個預設引數
# year是要替換的年度
# month是要替換的月份
# day是要替換的日
print(datetime.date.replace(datetime_1, year=2019, month=11, day=25)) # 2019-11-25
print(type(datetime.date.replace(datetime_1, year=2019, month=11, day=25))) # <class 'datetime.date'>
print(datetime_1)
# 必須有一個日期或者時間物件的引數,不傳替換引數即返回傳入的datetime.date物件的值
print(datetime.date.replace(datetime_1)) # 2022-12-26
# 只替換年度
print(datetime.date.replace(datetime_1, year=2019)) # 2019-12-26
# 只替換月份
print(datetime.date.replace(datetime_1, month=11)) # 2022-11-26
# 只替換日
print(datetime.date.replace(datetime_1, day=25)) # 2022-12-25
# 通過觀察,替換年度、月份、日 都是在2022-12-26(datetime_1變數的初始值)基礎上替換的。所以可以肯定的是該函數不會改變源變數的值
# 格式化日期
datetime_2 = datetime.datetime.today()
print(datetime_2, type(datetime_2))
print(datetime.date.strftime(datetime_1, "%Y--%y--%D--%d--%H--%h--%M--%m--%S--%A--%a--%B--%b--%C--%c"))
print(datetime.date.strftime(datetime_2, "%Y--%y--%D--%d--%H--%h--%M--%m--%S--%A--%a--%B--%b--%C--%c"))
# 常用的格式: 年、月、日、時、分、秒
print(datetime.date.strftime(datetime_2, "%Y-%m-%d %H:%M:%S")) # 2022-07-08 18:32:40
# 返回日期或者時間物件的ISO標準日期(4位元年-2位月-兩位日)
print(datetime.date.isoformat(datetime_1), datetime_1) # 2022-12-26 2022-12-26
print(datetime.date.isoformat(datetime_2), datetime_2) # 2022-07-08 2022-07-08 18:44:36.613676
# 將符合ISO標準格式的日期字串轉換為datetime.date物件
print(datetime.date.fromisoformat("2022-07-08"), type(datetime.date.fromisoformat("2022-07-08")))
# 不符合ISO標準格式的日期字串則報錯
# print(datetime.date.fromisoformat("2022-7-08")) # ValueError: Invalid isoformat string: '2022-7-08'
# print(datetime.date.fromisoformat("2022-07-8")) # ValueError: Invalid isoformat string: '2022-7-08'
# 獲取符合ISO標準格式的日期字串的星期幾(1~7)
print(datetime.date.isoweekday(datetime.date(2022, 7, 3))) # 7 星期日
print(datetime.date.isoweekday(datetime.date(2022, 7, 4))) # 1 星期一
print(datetime.date.isoweekday(datetime.date(2022, 7, 8))) # 5 星期五
print(datetime.date.isoweekday(datetime.date(2022, 7, 9))) # 6 星期六
# 返回日期或者時間物件的星期幾(0~6)
print(datetime.date.weekday(datetime.date(2022, 7, 3))) # 6 星期日
print(datetime.date.weekday(datetime.date(2022, 7, 4))) # 0 星期一
print(datetime.date.weekday(datetime.date(2022, 7, 8))) # 4 星期五
print(datetime.date.weekday(datetime.date(2022, 7, 9))) # 5 星期六
# 根據時間戳計算日期
print(datetime.date.fromtimestamp(2015236523)) # 2033-11-10
print(type(datetime.date.fromtimestamp(2015236523))) # <class 'datetime.date'>
# 獲取符合ISO標準格式的時間元組(年份, 週數, 星期數)
# 週數:一年中的第幾周,範圍是1~53
# 星期數:星期中的第幾天,週一為第1天,週日為第7天
print(datetime.date.isocalendar(datetime.date(2022, 7, 3))) # datetime.IsoCalendarDate(year=2022, week=26, weekday=7)
# 根據符合ISO標準格式的時間元組(年份, 週數, 星期數)計算日期
print(datetime.date.fromisocalendar(2022, 26, 7)) # 2022 -07-03
# 將整形按公元歷轉換為日期
# * 公元1年1月1日為1
print(datetime.date.fromordinal(1), type(datetime.date.fromordinal(1))) # 0001-01-01 <class 'datetime.date'>
print(datetime.date.fromordinal(5)) # 0001-01-05
print(datetime.date.fromordinal(738339)) # 2022-07-03
# 返回公元公曆開始到現在的天數
print(datetime.date.toordinal(datetime.date(2022, 7, 3))) # 738339
# 將 date型別轉換為struct_time型別
print(datetime.date.timetuple(datetime.date(2022, 7, 3)))
# 日期型別的最大值
print(datetime.date.max)
# 日期型別的最小值
print(datetime.date.min)

到此這篇關於Python標準庫datetime date模組的詳細介紹的文章就介紹到這了,更多相關Python date模組 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com