1. 程式人生 > >python下的日期與時間(時間格式轉換、時間戳處理,時間差處理)

python下的日期與時間(時間格式轉換、時間戳處理,時間差處理)

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組數字處理時間:

序號 欄位
0 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元組。這種結構具有如下屬性:

序號 屬性
0 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

Python不斷更新,如果發現有最新方法歡迎留言交流。同時歡迎加入Python資源分享Q群:867300100