轉自:https://www.cnblogs.com/fclbky/articles/4098204.htmlhtml
datetime 模塊提供了各類類用於操做日期和時間,該模塊側重於高效率的格式化輸出
在 Python 中,與時間處理有關的模塊包括:time,datetime 以及 calendar
datetime 模塊定義了兩個常量:
編程
datetime 模塊中定義的類(前四個下方有詳解):
函數
注:上邊這些類的對象是不可變的
上邊這些類的從屬關係:學習
timedelta 對象
timedelta 對象表示兩個日期或時間之間的間隔
spa
以上全部的參數都是可選的(默認爲 0),參數的能夠是整數或浮點數,正數或負數。
內部的存儲單位只有 days(天)、seconds(秒)、microseconds(毫秒),其餘單位均先轉換後再存儲:
code
而 days、seconds 和 microseconds 爲了避免產生時間表示上的歧義,將根據如下範圍自動「進位」:
orm
timedelta 類屬性:
htm
請注意,在正常狀況下,timedelta.max > -timedelta.min,-timedelta.max 無心義。
timedelta 實例屬性(只讀):
對象
屬性 | 取值範圍 |
timedelta.days | -999999999 ~ 999999999 |
timedelta.seconds | 0 ~ 86399 |
timedelta.microseconds | 0 ~ 999999 |
timedelta 對象支持的操做:
blog
操做 | 結果 |
t1 = t2 + t3 | t2 和 t3 的和,隨後:t1 - t2 == t3 and t1 - t3 == t2 爲 True(注1) |
t1 = t2 - t3 | t2 和 t3 的差,隨後:t1 == t2 - t3 and t2 == t1 + t3 爲 True(注1) |
t1 = t2 * i 或 t1 = i * t2 | 對象乘以一個整數,隨後:t1 // i == t2 爲 true;且 i != 0 |
t1 = t2 * f 或 t1 = f * t2 | 對象乘以一個浮點數,結果四捨五入到精度 timedelta.resolution(注1) |
f = t2 / t3 | t2 和 t3 的商(注3),返回一個 float 對象 |
t1 = t2 / f 或 t1 = t2 / i | 對象除以一個整數或浮點數,結果四捨五入到精度 timedelta.resolution |
t1 = t2 // i 或 t1 = t2 // t3 | 對象地板除一個整數或浮點數,結果捨去小數,返回一個整數(注3) |
t1 = t2 % t3 | t2 和 t3 的餘數,返回一個 timedelta 對象(注3) |
q, r = divmod(t1, t2) | 計算 t1 和 t2 的商和餘數,q = t1 // t2(注3),r = t1 % t2,q 是一個整數,r 是一個 timedelta 對象 |
+t1 | 返回一個 timedelta 對象,且值相同(注2) |
-t1 | 等同於 timedelta(-t1.days, -t1.seconds, -t1.microseconds),而且至關於 t1 * -1(注一、4) |
abs(t) | 當 t.days >= 0 時,等同於 +t;當 t.days < = 時,等同於 -t(注2) |
str(t) | 返回一個字符串,按照此格式:[D day[ s ], ][H]H:MM:SS[.UUUUUU] |
repr(t) | 返回一個字符串,按照此格式:datetime.timedelta(D[, S[, U]]) |
注1:這是準確的,但可能會溢出
注2:這是準確的,而且不會溢出
注3:除數爲 0 會引起 ZeroDivisionError 異常
注4:-timedelta.max 是無心義的
timedelta 實例方法:
timedelta.total_seconds()
- 返回 timedelta 對象所包含的總秒數,至關於 td / timedelta(seconds=1)
請注意,對於很是大的時間間隔(在大多數平臺上是大於270年),這種方法將失去微秒(microsecond)精度
timedelta 用法示例:
date 對象
date 對象表示一個日期,在一個理想化的日曆裏,日期由 year(年)、month(月)、day(日)組成
全部的參數都是必需的,參數能夠是整數,而且在如下範圍內:
date 類方法(classmethod):
date 類屬性:
date 實例屬性(只讀):
屬性 | 取值範圍 |
date.year | MINYEAR ~ MAXYEAR(1 ~ 9999) |
date.month | 1 ~ 12 |
date.day | 1 ~ 根據 year 和 month 來決定(例如 2015年2月 只有 28 天) |
date 對象支持的操做:
操做 | 結果 |
date2 = date1 + timedelta | 日期加上一個時間間隔,返回一個新的日期對象(注1) |
date2 = date1 - timedelta | 日期減去一個時間間隔,至關於 date2 + timedelta == date1(注2) |
timedelta = date1 - date2 | (注3) |
date1 < date2 | 當 date1 的日期在 date2 以前時,咱們認爲 date1 < date2(注4) |
注1:timedelta.day > 0 或 timedelta.day < 0 決定 date2 日期增加的方向;隨後,date2 - date1 == timedelta.days;timedelta.seconds 和 timedelta.microseconds 被忽略;若是 date2.year < MINYEAR 或 date2.year > MAXYEAR,引起 OverflowError 異常
注2:這並不等同於 date1 + (-timedelta),由於單獨的 -timedelta 可能會溢出,而 date1 - timedelta 則不會溢出;timedelta.seconds 和 timedelta.microseconds 被忽略
注3:這是準確的,而且不會溢出;timedelta.seconds 和 timedelta.microseconds 都爲 0,而後 date2 + timedelta == date1
注4:換句話說,當且僅當 date1.toordinal() < date2.toordinal(),纔有 date1 < date2
date 實例方法:
date.replace(year, month, day)
- 生成一個新的日期對象,用參數指定的年、月、日代替原有對象中的屬性
date.timetuple()
- 返回日期對應的 time.struct_time 對象(相似於 time 模塊的 time.localtime())
date.toordinal()
- 返回日期對應的 Gregorian Calendar 日期
date.weekday()
- 返回 0 ~ 6 表示星期幾(星期一是 0,依此類推)
date.isoweekday()
- 返回 1 ~ 7 表示星期幾(星期一是1, 依此類推)
date.isocalendar()
- 返回一個三元組格式 (year, month, day)
date.isoformat()
- 返回一個 ISO 8601 格式的日期字符串,如 "YYYY-MM-DD" 的字符串
date.__str__()
- 對於 date 對象 d 來講,str(d) 至關於 d.isoformat()
date.ctime()
- 返回一個表示日期的字符串,至關於 time 模塊的 time.ctime(time.mktime(d.timetuple()))
date.strftime(format)
- 返回自定義格式化字符串表示日期,下面有詳解
date.__format__(format)
- 跟 date.strftime(format) 同樣,這使得調用 str.format() 時能夠指定 data 對象的字符串
如下是計算天數的例子:
關於 date 的綜合應用:
time 對象
time 對象表示一天中的一個時間,而且能夠經過 tzinfo 對象進行調整
全部的參數都是可選的;tzinfo 能夠是 None 或者 tzinfo 子類的實例對象;其他的參數能夠是整數,而且在如下範圍內:
注:若是參數超出範圍,將引起 ValueError 異常
time 類屬性
time 實例屬性(只讀):
屬性 | 取值範圍 |
time.hour | 0 ~ 23 |
time.minute | 0 ~ 59 |
time.second | 0 ~ 59 |
time.microsecond | 0 ~ 999999 |
time.tzinfo | 經過構造函數的 tzinfo 參數賦值 |
time 實例方法:
time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]])
- 生成一個新的時間對象,用參數指定時間代替原有對象中的屬性
time.isoformat()
- 返回一個 ISO 8601 格式的日期字符串,如 "HH:MM:SS.mmmmmm" 的字符串
time.__str__()
- 對於 time 對象 t 來講,str(t) 至關於 t.isoformat()
time.strftime(format)
- 返回自定義格式化字符串表示時間,下面有詳解
time.__format__(format)
- 跟 time.strftime(format) 同樣,這使得調用 str.format() 時能夠指定 time 對象的字符串
time.utcoffset()
- 若是 tzinfo 屬性是 None,則返回 None;不然返回 self.tzinfo.utcoffset(self)
time.dst()
- 若是 tzinfo 屬性是 None,則返回 None;不然返回 self.tzinfo.dst(self)
time.tzname()
- 若是 tzinfo 屬性是 None,則返回 None;不然返回 self.tzinfo.tzname(self)
關於 time 的綜合應用:
datetime 對象
datetime 對象是 date 對象和 time 對象的結合體,而且包含他們的全部信息
必須的參數是 year(年)、month(月)、day(日);tzinfo 能夠是 None 或者 tzinfo 子類的實例對象;其他的參數能夠是整數,而且在如下範圍內:
注:若是參數超出範圍,將引起 ValueError 異常
datetime 類方法(classmethod):
datetime.today()
- 返回一個表示當前本地時間的 datetime 對象,等同於 datetime.fromtimestamp(time.time())
datetime.now(tz=None)
- 返回一個表示當前本地時間的 datetime 對象;若是提供了參數 tz,則獲取 tz 參數所指時區的本地時間
datetime.utcnow()
- 返回一個當前 UTC 時間的 datetime 對象
datetime.fromtimestamp(timestamp, tz=None)
- 根據時間戮建立一個 datetime 對象,參數 tz 指定時區信息
datetime.utcfromtimestamp(timestamp)
- 根據時間戮建立一個 UTC 時間的 datetime 對象
datetime.fromordinal(ordinal)
- 返回對應 Gregorian 日曆時間對應的 datetime 對象
datetime.combine(date, time)
- 根據參數 date 和 time,建立一個 datetime 對象
datetime.strptime(date_string, format)
- 將格式化字符串轉換爲 datetime 對象
datetime 類屬性:
datetime 實例屬性(只讀):
屬性 | 取值範圍 |
datetime.year | MINYEAR ~ MAXYEAR(1 ~ 9999) |
datetime.month | 1 ~ 12 |
datetime.day | 1 ~ 根據 year 和 month 來決定(例如 2015年2月 只有 28 天) |
datetime.hour | 0 ~ 23 |
datetime.minute | 0 ~ 59 |
datetime.second | 0 ~ 59 |
datetime.microsecond | 0 ~ 999999 |
datetime.tzinfo | 經過構造函數的 tzinfo 參數賦值 |
datetime 對象支持的操做:
操做 | 結果 |
datetime2 = datetime1 + timedelta | 日期加上一個時間間隔,返回一個新的日期對象(注1) |
datetime2 = datetime1 - timedelta | 日期減去一個時間間隔,至關於 datetime2 + timedelta == datetime1(注2) |
timedelta = datetime1 - datetime2 | 兩個日期相減獲得一個時間間隔(注3) |
datetime1 < datetime2 | 當 datetime1 的日期在 datetime2 以前時,咱們認爲 datetime1 < datetime2 |
注1:timedelta.day > 0 或 timedelta.day < 0 決定 datetime2 日期增加的方向;計算結果 datetime2 的 tzinfo 屬性和 datetime1 相同;若是 date2.year < MINYEAR 或 date2.year > MAXYEAR,引起 OverflowError 異常
注2:計算結果 datetime2 的 tzinfo 屬性和 datetime1 相同;這並不等同於 date1 + (-timedelta),由於單獨的 -timedelta 可能會溢出,而 date1 - timedelta 則不會溢出
注3:若是 datetime1 和 datetime2 的 tzinfo 屬性同樣(指向同一個時區),則 tzinfo 屬性被忽略,計算結果爲一個 timedelta 對象 t,則 datetime2 + t == datetime1(不用進行時區調整);若是 datetime1 和 datetime2 的 tzinfo 屬性不同(指向不一樣時區),則 datetime1 和 datetime2 會先被轉換爲 UTC 時區時間,在進行計算,(datetime1.replace(tzinfo=None) - datetime1.utcoffset()) - (datetime2.replace(tzinfo=None) - datetime2.utcoffset())
datetime 實例方法:
datetime.date()
- 返回一個 date 對象datetime.time() - 返回一個 time 對象(tzinfo 屬性爲 None)
datetime.timetz()
- 返回一個 time() 對象(帶有 tzinfo 屬性)
datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]])
- 生成一個新的日期對象,用參數指定日期和時間代替原有對象中的屬性
datetime.astimezone(tz=None)
- 傳入一個新的 tzinfo 屬性,返回根據新時區調整好的 datetime 對象
datetime.utcoffset()
- 若是 tzinfo 屬性是 None,則返回 None;不然返回 self.tzinfo.utcoffset(self)
datetime.dst()
- 若是 tzinfo 屬性是 None,則返回 None;不然返回 self.tzinfo.dst(self)
datetime.tzname()
- 若是 tzinfo 屬性是 None,則返回 None;不然返回 self.tzinfo.tzname(self)
datetime.timetuple()
- 返回日期對應的 time.struct_time 對象(相似於 time 模塊的 time.localtime())
datetime.utctimetuple()
- 返回 UTC 日期對應的 time.struct_time 對象
datetime.toordinal()
- 返回日期對應的 Gregorian Calendar 日期(相似於 self.date().toordinal())
datetime.timestamp()
- 返回當前時間的時間戳(相似於 time 模塊的 time.time())
datetime.weekday()
- 返回 0 ~ 6 表示星期幾(星期一是 0,依此類推)
datetime.isoweekday()
- 返回 1 ~ 7 表示星期幾(星期一是1, 依此類推)
datetime.isocalendar()
- 返回一個三元組格式 (year, month, day)
datetime.isoformat(sep='T')
- 返回一個 ISO 8601 格式的日期字符串,如 "YYYY-MM-DD" 的字符串
datetime.__str__()
- 對於 date 對象 d 來講,str(d) 至關於 d.isoformat()
datetime.ctime()
- 返回一個表示日期的字符串,至關於 time 模塊的 time.ctime(time.mktime(d.timetuple()))
datetime.strftime(format)
- 返回自定義格式化字符串表示日期,下面有詳解
datetime.__format__(format)
- 跟 datetime.strftime(format) 同樣,這使得調用 str.format() 時能夠指定 data 對象的字符串
關於 datetime 的綜合應用:
帶有 tzinfo 的 datetime 綜合演示:
格式化字符串:strftime() 和 strptime()
date, datetime, 和 time 對象均支持使用 strftime(format) 方法,將指定的日期或時間轉換爲自定義的格式化字符串
相反的,datetime.strptime() 類方法倒是把格式化字符串轉換爲 datetime 對象
格式化指令 | 含義 |
%a | 星期的簡寫(星期一 ~ 天:Mon, Tue, Wed, Thu, Fri, Sat, Sun) |
%A | 星期的全寫(星期一 ~ 天:Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday) |
%w | 在一個星期中的第幾天( 0 表示星期天 ... 6 表示星期六) |
%d | 在一個月中的第幾天(01, 02, ..., 31) |
%b | 月份的簡寫(一月 ~ 十二月:Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec) |
%B | 月份的全寫(一月 ~ 十二月:January, February, March, April, May, June, July, August, September, October, November, December) |
%m | 月份(01, 02, ..., 12) |
%y | 用兩個數字表示年份(例如 2014年 == 14) |
%Y | 用四個數字表示年份 |
%H | 二十四小時制(00, 01, ..., 23) |
%I | 十二小時制(01, 02, ..., 11) |
%p | AM 或者 PM |
%M | 分鐘(00, 01, ..., 59) |
%S | 秒(00, 01, ..., 59) |
%f | 微秒(000000, 000001, ..., 999999) |
%z | 與 UTC 時間的間隔 ;若是是本地時間,返回空字符串((empty), +0000, -0400, +1030) |
%Z | 時區名稱;若是是本地時間,返回空字符串((empty), UTC, EST, CST) |
%j | 在一年中的第幾天(001, 002, ..., 366) |
%U | 在一年中的第幾周,星期天做爲第一天(00, 01, ..., 53) |
%W | 在一年中的第幾周,星期一做爲第一天(00, 01, ..., 53) |
%c | 用字符串表示日期和時間(Tue Aug 16 21:30:00 2014) |
%x | 用字符串表示日期(08/16/14) |
%X | 用字符串表示時間(21:30:00) |
%% | 表示百分號 |
格式化字符串綜合演示: