python下的日期與時間
一、在Python中,時間主要有三種表示形式,
- 1.時間戳(TimeStamp):1970年1月1日之後的秒
- 2.時間元組格式化形式 包含了:年、日、星期 得到time.struct_time(tm_year=2017, tm_mon=10, tm_mday=14…)
- 3.可視化的字元串 2017-11-11 11:44
import time
#1 時間戳:1970年1月1日之後的秒
print('1.時間戳形式:{}'.format(time.time()))
複制
1.時間戳形式:1542765908.295993
複制
時間戳機關最适于做日期運算。但是1970年之前的日期就無法以此表示了。太遙遠的日期也不行,UNIX和Windows隻支援到2038年。
2.時間戳科學的解釋
最初計算機作業系統是32位,而時間也是用32位表示。32位能表示的最大值是2147483647。另外1年365天的總秒數是31536000,2147483647/31536000 = 68.1,也就是說32位能表示的最長時間是68年,而實際上到2038年01月19日03時14分07秒,便會到達最大時間,過了這個時間點,所有32位作業系統時間便會變為10000000 00000000 00000000 00000000,也就是1901年12月13日20時45分52秒,這樣便會出現時間回歸的現象,很多軟體便會運作異常了。
到這裡,我想問題的答案已經出來了:因為用32位來表示時間的最大間隔是68年,而最早出現的UNIX作業系統考慮到計算機産生的年代和應用的時限綜合取了1970年1月1日作為UNIX TIME的紀元時間(開始時間),至于時間回歸的現象相信随着64為作業系統的産生逐漸得到解決,因為用64位作業系統可以表示到292,277,026,596年12月4日15時30分08秒,相信我們的N代子孫,哪怕地球毀滅那天都不用愁不夠用了,因為這個時間已經是千億年以後了。
為什麼是1970,因為這個設計時候是 70 年代
#2 元組格式化形式 包含了:年、日、星期 得到time.struct_time(tm_year=2017, tm_mon=10, tm_mday=14...)
print('2.元組格式化形式:{}'.format(time.gmtime()))
複制
2.元組格式化形式:time.struct_time(tm_year=2018, tm_mon=11, tm_mday=21, tm_hour=2, tm_min=5, tm_sec=9, tm_wday=2, tm_yday=325, tm_isdst=0)
複制
什麼是時間元組?
很多Python函數用一個元組裝起來的9組數字處理時間:
序号 | 字段 | 值 |
---|---|---|
4位數年 | 2008 | |
1 | 月 | 1 到 12 |
2 | 日 | 1到31 |
3 | 小時 | 0到23 |
4 | 分鐘 | 0到59 |
5 | 秒 | 0到61 (60或61 是閏秒) |
6 | 一周的第幾日 | 0到6 (0是周一) |
7 | 一年的第幾日 | 1到366 (儒略曆) |
8 | 夏令時 | -1, 0, 1, -1是決定是否為夏令時的旗幟 |
也就是struct_time元組。這種結構具有如下屬性:
序号 | 屬性 | 值 |
---|---|---|
tm_year | 2008 | |
1 | tm_mon | 1 到 12 |
2 | tm_mday | 1 到 31 |
3 | tm_hour | 0 到 23 |
4 | tm_min | 0 到 59 |
5 | tm_sec | 0 到 61 (60或61 是閏秒) |
6 | tm_wday | 0到6 (0是周一) |
7 | tm_yday | 1 到 366(儒略曆) |
8 | tm_isdst | -1, 0, 1, -1是決定是否為夏令時的旗幟 |
#3 可視化的字元串 2017-11-11 11:44
print('3.可視化的字元串:{}'.format(time.strftime("%Y-%m-%d %H:%M:%S")))
複制
3.可視化的字元串:2018-11-21 10:05:10
複制
python中時間日期格式化符号:
- %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),星期天為星期的開始
- %W 一年中的星期數(00-53)星期一為星期的開始
- %x 本地相應的日期表示
- %X 本地相應的時間表示
- %Z 目前時區的名稱
- %% %号本身
二、三種時間的轉化
1.時間戳------->時間元組:
UTC是國際時,UTC+8就是國際時加八小時,是東八區時間,也就是中原標準時間。
#用time.localtime()方法,将一個時間戳轉換為目前時區的struct_time。
time1 = time.time()
tuple1 = time.localtime(time1) # UTC + 8 時間
tuple1
複制
time.struct_time(tm_year=2018, tm_mon=11, tm_mday=21, tm_hour=10, tm_min=5, tm_sec=11, tm_wday=2, tm_yday=325, tm_isdst=0)
複制
time1 = time.time()
tuple1 = time.gmtime(time1) # UTC時間
tuple1
複制
time.struct_time(tm_year=2018, tm_mon=11, tm_mday=21, tm_hour=2, tm_min=5, tm_sec=11, tm_wday=2, tm_yday=325, tm_isdst=0)
複制
2.時間元組-------->時間戳:
tuple2 = time.localtime()
time2 = time.mktime(tuple2)
time2
複制
1542765912.0
複制
3.時間元組--------->字元串:
-strftime(format[, tuple])
将指定的struct_time(預設為目前時間),根據指定的格式化字元串輸出
tuple3 = time.localtime()
strTime = time.strftime("%Y-%m-%d %H:%M:%S",tuple3)
strTime
複制
‘2018-11-21 10:20:27’
strTime1 = time.strftime("%Y{y}%m{m}%d{d} %H{h}%M{m1}%S{s}",tuple3).format(y="年",m="月",d="日",h="時",m1="分",s="秒")
strTime1
複制
'2018年11月21日 10時05分12秒'
複制
4、asctime()方法
time.asctime([t]))
- 參數
t – 9個元素的元組(time.struct_time)或者通過函數 gmtime() 或 localtime() 傳回的時間值。
- 傳回值
傳回一個可讀的形式為"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18時07分14秒)的24個字元的字元串。
t = time.localtime()
print(type(t),t)
time.asctime(t)
複制
<class 'time.struct_time'> time.struct_time(tm_year=2018, tm_mon=11, tm_mday=21, tm_hour=10, tm_min=5, tm_sec=13, tm_wday=2, tm_yday=325, tm_isdst=0)
'Wed Nov 21 10:05:13 2018'
複制
5、把時間戳---->time.asctime()
t=time.time()
print(type(t),t)
time.ctime(time.time())
複制
<class 'float'> 1542765913.8286655
'Wed Nov 21 10:05:13 2018'
複制
三、時間戳計算時間差
#根據時間戳來計算(注意時間戳時秒還是毫秒)
#1、天數
time.time()+86400*7 #目前時間的後7天
#2、小時
time.time()+3600*7 #目前時間的後7小時
#3、分鐘
time.time()+60*7 #目前時間的後7分鐘
複制
1542766334.2900052
複制
三、字元串形式計算時間差
#字元串時間差
import datetime
start ="2018-06-19 17:37:31"
end = "2019-07-30 17:37:31"
start=time.strptime(start, "%Y-%m-%d %H:%M:%S")
end=time.strptime(end, "%Y-%m-%d %H:%M:%S")
userStart=datetime.datetime(start[0],start[1],start[2])
userEnd=datetime.datetime(end[0],end[1],end[2])
print ((userEnd-userStart).days) # 0 天數
# print (end-start).total_seconds() # 30.029522 精确秒數
# print (end-start).seconds # 30 秒數
# print (end-start).microseconds # 29522 毫秒數
複制
406
複制