一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Python時(shí)間日期格式化之time與datetime模塊

 刮骨劍 2019-11-27

1 引言

  在實(shí)際開發(fā)過程中,我們經(jīng)常會(huì)用到日期或者時(shí)間,那么在Python中我們?cè)趺传@取時(shí)間,以及如何將時(shí)間轉(zhuǎn)換為我們需要的格式呢?在之前的開發(fā)中,也曾遇到time、datetime等模塊下的不同函數(shù),這些函數(shù)名又很是相似,幾次下來(lái)頭都昏了,今天來(lái)徹底總結(jié)梳理一下Python中日期時(shí)間獲取與格式化。

2 理論準(zhǔn)備

         首先必須做一點(diǎn)理論準(zhǔn)備,不然待會(huì)都不知道為什么會(huì)有這些函數(shù)。介紹3個(gè)概念:

UTC time Coordinated Universal Time,世界協(xié)調(diào)時(shí),又稱格林尼治天文時(shí)間、世界標(biāo)準(zhǔn)時(shí)間。與UTC time對(duì)應(yīng)的是各個(gè)時(shí)區(qū)的local time,也就是本地時(shí)間,例如我們的北京時(shí)間。

  epoch time表示時(shí)間開始的起點(diǎn);它是一個(gè)特定的時(shí)間,不同平臺(tái)上這個(gè)時(shí)間點(diǎn)的值不太相同,對(duì)于Unix而言,epoch time為 1970-01-01 00:00:00 UTC。

  timestamp(時(shí)間戳) 也稱為Unix時(shí)間 或 POSIX時(shí)間;它是一種時(shí)間表示方式,表示從格林尼治時(shí)間1970年1月1日0時(shí)0分0秒開始到現(xiàn)在所經(jīng)過的毫秒數(shù),其值為float類型。 但是有些編程語(yǔ)言的相關(guān)方法返回的是秒數(shù),例如我們的天下第一編程語(yǔ)言-Python大法就是這樣(請(qǐng)不要反駁我)。所謂的時(shí)間戳timestamp就是當(dāng)前時(shí)間與格林尼治時(shí)間1970年1月1日0時(shí)0分0秒之間過了多少秒。

  相應(yīng)的,日期時(shí)間就有三種表示方法:

  1)stamptime時(shí)間戳,時(shí)間戳表示的是從1970年1月1日00:00:00開始按秒計(jì)算的偏移量。stamptime表現(xiàn)為一個(gè)float類型數(shù)據(jù)。

  2)struct_time時(shí)間元組,共有九個(gè)元素組。stamptime時(shí)間戳和格式化時(shí)間字符串之間的轉(zhuǎn)化必須通過struct_time才行,所以struct_time時(shí)間元組時(shí)3中時(shí)間表示的中心。

  3)format time 格式化時(shí)間,已格式化的結(jié)構(gòu)字符串使時(shí)間更具可讀性。包括自定義格式和固定格式。

  那么,下面要說(shuō)的就是怎么獲取這三個(gè)時(shí)間,并進(jìn)行這三個(gè)時(shí)間之間的轉(zhuǎn)化。先總結(jié)一下time模塊。

3 time模塊

  先放兩個(gè)圖:

 

  time模塊中,幾乎所有時(shí)間獲取與格式轉(zhuǎn)化的函數(shù)都在上圖中了,只要理清了這幅圖的關(guān)系,那么time模塊就不再是問題。圖中,藍(lán)色方塊表示那三種時(shí)間格式,箭頭表示時(shí)間的轉(zhuǎn)化。下面,重點(diǎn)來(lái)了:

  1)獲取當(dāng)前時(shí)間的方法只有一個(gè),那就是通過上圖中的函數(shù)1——time.time()。也就是說(shuō),要想獲取當(dāng)前時(shí)間,只能通過這個(gè)方法,而且獲取的是時(shí)間戳格式的時(shí)間。想直接獲取當(dāng)前時(shí)間的時(shí)間元組格式或格式化字符串?沒門,只能老老實(shí)實(shí)轉(zhuǎn)化。

  2)當(dāng)傳入默認(rèn)參數(shù)時(shí),指的是使用當(dāng)前時(shí)間作為參數(shù)值。圖中帶黃色底紋的都是設(shè)有默認(rèn)值的參數(shù)(雖然默認(rèn)值為None),函數(shù)2、3不傳入該參數(shù)時(shí),系統(tǒng)會(huì)自動(dòng)獲取當(dāng)前時(shí)間的時(shí)間戳作為該參數(shù)值。而函數(shù)5則是系統(tǒng)會(huì)自動(dòng)獲取當(dāng)前時(shí)間的時(shí)間元組作為該參數(shù)值,不是不能直接獲取當(dāng)前時(shí)間的時(shí)間元組嗎?是的,但系統(tǒng)會(huì)先獲取當(dāng)前時(shí)間的時(shí)間戳,然后轉(zhuǎn)化為時(shí)間元組。上圖中只有向左的箭頭所代表的函數(shù)才有默認(rèn)值,就是因?yàn)橄蛴也拍苡蓵r(shí)間戳轉(zhuǎn)化得到需要的時(shí)間格式。

  3) localtime(函數(shù)2)和gmtime(函數(shù)3)都可以實(shí)現(xiàn)將時(shí)間戳轉(zhuǎn)化為時(shí)間元組,但是,localtime轉(zhuǎn)化的是本地時(shí)間,gmtime轉(zhuǎn)為的是世界標(biāo)準(zhǔn)時(shí)間。

  4)asctime(函數(shù)7)和ctime(函數(shù)8)只能轉(zhuǎn)為為%a %b %d %H:%M:%S %Y格式的字符串時(shí)間。不傳入?yún)?shù)時(shí),用的也是當(dāng)前時(shí)間。

  5)struct_time元組元素結(jié)構(gòu):

下標(biāo)/索引

屬性名稱

描述

0

tm_year

年份,如 2018

1

tm_mon

月份,取值范圍為[1, 12]

2

tm_mday

一個(gè)月中的第幾天,取值范圍為[1-31]

3

tm_hour

小時(shí), 取值范圍為[0-23]

4

tm_min

分鐘,取值范圍為[0, 59]

5

tm_sec

秒,取值范圍為[0, 61]

6

tm_wday

一個(gè)星期中的第幾天,取值范圍為[0-6],0表示星期一

7

tm_yday

一年中的第幾天,取值范圍為[1, 366]

8

tm_isdst

是否為夏令時(shí),可取值為:0 , 1 或 -1,默認(rèn)值為-1

  struct_time屬性值的獲取方式有兩種:

    •   可以把它當(dāng)做一種特殊的有序不可變序列通過 下標(biāo)/索引 獲取各個(gè)元素的值,如t[0]
    •   也可以通過對(duì)象名 “t.屬性名” 的方式來(lái)獲取各個(gè)元素的值,如t.tm_year。

  6)format time結(jié)構(gòu)化表示:

格式

含義

%a

本地(locale)簡(jiǎn)化星期名稱

%A

本地完整星期名稱

%b

本地簡(jiǎn)化月份名稱

%B

本地完整月份名稱

%c

本地相應(yīng)的日期和時(shí)間表示

%d

一個(gè)月中的第幾天(01 - 31)

%H

一天中的第幾個(gè)小時(shí)(24小時(shí)制,00 - 23)

%I

第幾個(gè)小時(shí)(12小時(shí)制,01 - 12)

%j

一年中的第幾天(001 - 366)

%m

月份(01 - 12)

%M

分鐘數(shù)(00 - 59)

%p

本地am或者pm的相應(yīng)符

%S

秒(01 - 61)

%U

一年中的星期數(shù)。(00 - 53星期天是一個(gè)星期的開始。)第一個(gè)星期天之前的所有天數(shù)都放在第0周。

%w

一個(gè)星期中的第幾天(0 - 6,0是星期天)

%W

和%U基本相同,不同的是%W以星期一為一個(gè)星期的開始。

%x

本地相應(yīng)日期

%X

本地相應(yīng)時(shí)間

%y

去掉世紀(jì)的年份(00 - 99)

%Y

完整的年份

%Z

時(shí)區(qū)的名字(如果不存在為空字符)

%%

‘%’字符

  在代碼中實(shí)踐一下上面的內(nèi)容:

  1)time.time()

>>> import time

>>> time.time()

1544278402.1804464

  2)time.localtime()

>>> time.localtime() # 不傳入?yún)?shù)

time.struct_time(tm_year=2018, tm_mon=12, tm_mday=8, tm_hour=22, tm_min=14, tm_sec=58, tm_wday=5, tm_yday=342, tm_isdst=0)

>>> time.localtime(time.time()) # 傳入當(dāng)前時(shí)間

time.struct_time(tm_year=2018, tm_mon=12, tm_mday=8, tm_hour=22, tm_min=15, tm_sec=33, tm_wday=5, tm_yday=342, tm_isdst=0)

>>> time.localtime(1544200000.1232) # 傳入其他時(shí)間戳

time.struct_time(tm_year=2018, tm_mon=12, tm_mday=8, tm_hour=0, tm_min=26, tm_sec=40, tm_wday=5, tm_yday=342, tm_isdst=0)

  3)time.gctime()

>>> time.gmtime()

time.struct_time(tm_year=2018, tm_mon=12, tm_mday=8, tm_hour=14, tm_min=18, tm_sec=38, tm_wday=5, tm_yday=342, tm_isdst=0)

  4)time.mktime()

>>> time.mktime(time.localtime())

1544279024.0

  5)strftime(format, p_tuple=None)

>>> time.strftime('%y-%m-%d' , time.localtime())

'18-12-08'

>>> time.strftime('%Y-%m-%d' , time.localtime())

'2018-12-08'

>>> time.strftime('%Y年%m月%d日 %M時(shí)%I分%S秒' , time.localtime())

'2018年12月08日 34時(shí)10分04秒'

  6)strptime(string, format)

>>> time.strptime('2018年12月08日 34時(shí)10分04秒' , '%Y年%m月%d日 %M時(shí)%I分%S秒')

time.struct_time(tm_year=2018, tm_mon=12, tm_mday=8, tm_hour=10, tm_min=34, tm_sec=4, tm_wday=5, tm_yday=342, tm_isdst=-1)

  7)asctime(p_tuple=None)

>>> time.asctime() # 不傳入?yún)?shù),默認(rèn)是當(dāng)前時(shí)間

'Sat Dec  8 22:42:46 2018'

>>> time.asctime(time.localtime(1544278402.1804464))

'Sat Dec  8 22:13:22 2018'

  8)ctime(seconds=None)

>>> time.ctime() # 不傳入?yún)?shù)

'Sat Dec  8 22:45:58 2018'

>>> time.ctime(1544278402.1804464)

'Sat Dec  8 22:13:22 2018'

4 datetime模塊

  datetime模塊是time模塊的進(jìn)一步封裝,對(duì)用戶更加友好,在時(shí)間各屬性的獲取上回更加方便一些,當(dāng)然,在效率上會(huì)略微低一些。datetime模塊的功能主要都幾種在datetime、date、time、timedelta、tzinfo五個(gè)類中。這五個(gè)類功能如下表所示:

類名

功能

date

提供日期(年、月、日)的處理

time

提供時(shí)間(時(shí)、分、秒)的處理

datetime

同時(shí)提供對(duì)日期和時(shí)間的處理

timedelta

兩個(gè)date、time、datetime實(shí)例之間的時(shí)間間隔(時(shí)間加減運(yùn)算)

tzinfo

時(shí)區(qū)信息

4.1 date類

  先來(lái)說(shuō)說(shuō)date類,其定義如下:

class datetime.date(year, month, day)

  year, month 和 day都是是必須參數(shù),各參數(shù)的取值范圍為:

參數(shù)名稱

取值范圍

year

[MINYEAR, MAXYEAR]

month

[1, 12]

day

[1, 指定年份的月份中的天數(shù)]

  類方法和屬性

類方法/屬性名稱

描述

date.max

date對(duì)象所能表示的最大日期:9999-12-31

date.min

date對(duì)象所能表示的最小日志:00001-01-01

date.resoluation

date對(duì)象表示的日期的最小單位:天

date.today()

返回一個(gè)表示當(dāng)前本地日期的date對(duì)象

date.fromtimestamp(timestamp)

根據(jù)跟定的時(shí)間戳,返回一個(gè)date對(duì)象

  對(duì)象方法和屬性

對(duì)象方法/屬性名稱

描述

d.year

d.month

d.day

d.replace(year[, month[, day]])

生成并返回一個(gè)新的日期對(duì)象,原日期對(duì)象不變

d.timetuple()

返回日期對(duì)應(yīng)的time.struct_time對(duì)象

d.toordinal()

返回日期是是自 0001-01-01 開始的第多少天

d.weekday()

返回日期是星期幾,[0, 6],0表示星期一

d.isoweekday()

返回日期是星期幾,[1, 7], 1表示星期一

d.isocalendar()

返回一個(gè)元組,格式為:(year, weekday, isoweekday)

d.isoformat()

返回‘YYYY-MM-DD’格式的日期字符串

d.strftime(format)

返回指定格式的日期字符串,與time模塊的strftime(format, struct_time)功能相同

4.2 time類

  定義格式:

class datetime.time(hour, [minute[, second, [microsecond[, tzinfo]]]])

  hour為必須參數(shù),其他為可選參數(shù)。各參數(shù)的取值范圍為:

參數(shù)名稱

取值范圍

hour

[0, 23]

minute

[0, 59]

second

[0, 59]

microsecond

[0, 1000000]

tzinfo

tzinfo的子類對(duì)象,如timezone類的實(shí)例

  類方法和屬性

類方法/屬性名稱

描述

time.max

time類所能表示的最大時(shí)間:time(23, 59, 59, 999999)

time.min

time類所能表示的最小時(shí)間:time(0, 0, 0, 0)

time.resolution

時(shí)間的最小單位,即兩個(gè)不同時(shí)間的最小差值:1微秒

  對(duì)象方法和屬性

對(duì)象方法/屬性名稱

描述

t.hour

時(shí)

t.minute

t.second

t.microsecond

微秒

t.tzinfo

返回傳遞給time構(gòu)造方法的tzinfo對(duì)象,如果該參數(shù)未給出,則返回None

t.replace(hour[, minute[, second[, microsecond[, tzinfo]]]])

生成并返回一個(gè)新的時(shí)間對(duì)象,原時(shí)間對(duì)象不變

t.isoformat()

返回一個(gè)‘HH:MM:SS.%f’格式的時(shí)間字符串

t.strftime()

返回指定格式的時(shí)間字符串,與time模塊的strftime(format, struct_time)功能相同

4.3 datetime類

  datetime類的定義如下:

class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

  year, month 和 day是必須要傳遞的參數(shù), tzinfo可以是None或tzinfo子類的實(shí)例。

  各參數(shù)的取值范圍為:

參數(shù)名稱

取值范圍

year

[MINYEAR, MAXYEAR]

month

[1, 12]

day

[1, 指定年份的月份中的天數(shù)]

hour

[0, 23]

minute

[0, 59]

second

[0, 59]

microsecond

[0, 1000000]

tzinfo

tzinfo的子類對(duì)象,如timezone類的實(shí)例

  如果一個(gè)參數(shù)超出了這些范圍,會(huì)引起ValueError異常。

  類方法和屬性:

類方法/屬性名稱

描述

datetime.today()

返回一個(gè)表示當(dāng)前本期日期時(shí)間的datetime對(duì)象

datetime.now([tz])

返回指定時(shí)區(qū)日期時(shí)間的datetime對(duì)象,如果不指定tz參數(shù)則結(jié)果同上

datetime.utcnow()

返回當(dāng)前utc日期時(shí)間的datetime對(duì)象

datetime.fromtimestamp(timestamp[, tz])

根據(jù)指定的時(shí)間戳創(chuàng)建一個(gè)datetime對(duì)象

datetime.utcfromtimestamp(timestamp)

根據(jù)指定的時(shí)間戳創(chuàng)建一個(gè)datetime對(duì)象

datetime.combine(date, time)

把指定的date和time對(duì)象整合成一個(gè)datetime對(duì)象

datetime.strptime(date_str, format)

將時(shí)間字符串轉(zhuǎn)換為datetime對(duì)象

  對(duì)象方法和屬性:

對(duì)象方法/屬性名稱

描述

dt.year, dt.month, dt.day

年、月、日

dt.hour, dt.minute, dt.second

時(shí)、分、秒

dt.microsecond, dt.tzinfo

微秒、時(shí)區(qū)信息

dt.date()

獲取datetime對(duì)象對(duì)應(yīng)的date對(duì)象

dt.time()

獲取datetime對(duì)象對(duì)應(yīng)的time對(duì)象, tzinfo 為None

dt.timetz()

獲取datetime對(duì)象對(duì)應(yīng)的time對(duì)象,tzinfo與datetime對(duì)象的tzinfo相同

dt.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]])

生成并返回一個(gè)新的datetime對(duì)象,如果所有參數(shù)都沒有指定,則返回一個(gè)與原datetime對(duì)象相同的對(duì)象

dt.timetuple()

返回datetime對(duì)象對(duì)應(yīng)的tuple(不包括tzinfo)

dt.utctimetuple()

返回datetime對(duì)象對(duì)應(yīng)的utc時(shí)間的tuple(不包括tzinfo)

dt.toordinal()

同date對(duì)象

dt.weekday()

同date對(duì)象

dt.isocalendar()

同date獨(dú)享

dt.isoformat([sep])

返回一個(gè)‘%Y-%m-%d

dt.ctime()

等價(jià)于time模塊的time.ctime(time.mktime(d.timetuple()))

dt.strftime(format)

返回指定格式的時(shí)間字符串

  上面是date、time、datetime三個(gè)類的方法和屬性,關(guān)于這三個(gè)類,使用方法上基本與time模塊差不多,看方法名基本就一目了然,實(shí)在忘記,直接查表就好,本文不在過多介紹。

4.4 timedelta類

  timedelta可以方便實(shí)現(xiàn)日期(date實(shí)例、time實(shí)例、datetime實(shí)例)之間的加減運(yùn)算。

  datetime.timedelta類的定義

class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, hours=0, weeks=0)
  所有參數(shù)都是默認(rèn)參數(shù),因此都是可選參數(shù)。參數(shù)的值可以是整數(shù)或浮點(diǎn)數(shù),也可以是正數(shù)或負(fù)數(shù)。內(nèi)部值存儲(chǔ)days、seconds 和 microseconds,其他所有參數(shù)都將被轉(zhuǎn)換成這3個(gè)單位:
  • 1毫秒轉(zhuǎn)換為1000微秒
  • 1分鐘轉(zhuǎn)換為60秒
  • 1小時(shí)轉(zhuǎn)換為3600秒
  • 1周轉(zhuǎn)換為7天

  然后對(duì)這3個(gè)值進(jìn)行標(biāo)準(zhǔn)化,使得它們的表示是唯一的:

  • microseconds : [0, 999999]
  • seconds : [0, 86399]
  • days : [-999999999, 999999999]

  類屬性:

類屬性名稱

描述

timedelta.min

timedelta(-999999999)

timedelta.max

timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)

timedelta.resolution

timedelta(microseconds=1)

  實(shí)例方法和屬性:

實(shí)例方法/屬性名稱

描述

td.days

天 [-999999999, 999999999]

td.seconds

秒 [0, 86399]

td.microseconds

微秒 [0, 999999]

td.total_seconds()

時(shí)間差中包含的總秒數(shù),等價(jià)于: td / timedelta(seconds=1)

 5 總結(jié)

  對(duì)于Python中時(shí)間、日期模塊的應(yīng)用主要集中在time模塊和datetime模塊中,其中涉及到的方法和屬性有些多容易混淆,可以以time模塊為出發(fā)點(diǎn),只要理清time模塊中3種時(shí)間格式之間的關(guān)系,就容易記憶了。

  參考資料:

  https://blog.csdn.net/p9bl5bxp/article/details/54945920

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    97人妻人人揉人人躁人人| 欧美日韩国产成人高潮| 国产精品自拍杆香蕉视频| 国产91色综合久久高清| 国产一区国产二区在线视频| 在线懂色一区二区三区精品| 亚洲欧美中文日韩综合| 日韩精品少妇人妻一区二区| 国产午夜精品美女露脸视频| 国产精品超碰在线观看| 少妇淫真视频一区二区| 久久精品欧美一区二区三不卡| 视频一区二区三区自拍偷| 日韩日韩日韩日韩在线| 中文字幕区自拍偷拍区| 精品一区二区三区免费看| av在线免费播放一区二区| 国产一区二区三区午夜精品| 亚洲国产精品国自产拍社区| 国产成人精品视频一区二区三区| 日本人妻中出在线观看| 亚洲精选91福利在线观看 | 少妇一区二区三区精品| 精品国产品国语在线不卡| 亚洲一区二区精品免费| 色哟哟在线免费一区二区三区| 成人午夜视频在线播放| 这里只有九九热精品视频| 国产精品香蕉一级免费| 日韩精品一区二区一牛| 中字幕一区二区三区久久蜜桃| 欧美国产日本免费不卡| 国产欧美日产久久婷婷| 一级片二级片欧美日韩| 日韩精品一区二区三区射精| 妻子的新妈妈中文字幕| 一区二区欧美另类稀缺| 午夜福利网午夜福利网| 国产一区在线免费国产一区| 我要看日本黄色小视频| 蜜桃传媒在线正在播放|