1. 程式人生 > 其它 >date轉時間戳_Python 時間專題

date轉時間戳_Python 時間專題

技術標籤:date轉時間戳golang時間戳轉日期java 轉化為utc的時間oracle 時間戳轉日期python 字串轉日期python中timestamp轉datetime

總第272篇原創

1 兩個時間模組

python與時間相關的內建模組有: time 和 datetime. 其中,time模組提供各種操作時間的函式,datetime模組定義瞭如下幾個型別:

  • datetime.date:日期類,常用的屬性有 year, month, day;

  • datetime.time:時間類,常用的屬性有 hour, minute, second, microsecond;

  • datetime.datetime:日期時間;

  • datetime.timedelta:時間間隔,即兩個時間點相差長度;

  • datetime.tzinfo:與時區有關的抽象基類

2 時間表達方式

常用的有以下三種,總結如下。

時間戳

第一,時間戳的方式. 相對於1970.1.1 00:00:00, 以秒計算的偏移量, 時間戳是惟一的,如:138267830.87.我看這是網上或大部分部落格對時間戳的定義,不過這是不夠嚴謹的,需要考慮所處的時區,此處衡量的時區為UTC(世界標準時間)

為了驗證以上邏輯,我們寫一個例子:

dtime3 = datetime.datetime(1970,1,1)

dtime3.timestamp()

預期輸出為 0, 因為是相對於1970.1.1 00:00:00的偏移嗎,所以預期為0. 可是在本地(中國)輸出的時間戳是:-28800.0秒,也就是-8小時,也就是比預期的晚了8個小時。

問題就是處在沒有考慮時區上。原定義是相對於UTC時區的,但是我們的datetime.datetime(1970,1,1) 因為沒有顯示的設定時區,程式會預設按照本地時區計算。

進一步修正:

dtime2 = datetime.datetime(1970,1,1,tzinfo=timezone.utc)

dtime2.timestamp()

輸出為 0.0

在此,我們為tzinfo設定時區為UTC,得到了最嚴格的時間戳的標準值定義。tzinfo 是datetime模組的抽象基類,上面提到過。

class tzinfo(builtins.object)

| Abstract base class for time zone info objects.

python內建模組timezone是對tzinfo的一個標準實現類,如cpython中的原始碼(參考檔案:cpython/Lib/datetime.py)

class timezone(tzinfo):

__slots__ = '_offset', '_name'

時間陣列

第二,以陣列的形式表示即(structtime). 共有九個元素分別表示。同樣,同一個時間戳的structtime會因為時區不同,而不同。

如:time.structtime(tmyear=2013, tmmon=10, tmmday=25, tmhour=13, tmmin=21, tmsec=33, tmwday=4, tmyday=298, tmisdst=0)

前面幾個字面意思很清晰,後面四個:

tm_wday:(0-6, Monday is 0)

tm_yday:(day in the year, 1-366)

tm_isdst:(-1, 0 or 1) 0:普通 1:DST夏令時比正常的早一個小時 -1:根據當前時區

可讀性最強

最後一種是一種顯示型式,也是我們最直觀的顯示方式,平時使用較多的日期和時間的表達方式。字串,如:2013-10-25 13:29:39.543000

3 aware 和 naive 時間

這些在第2章節,其實我們已經有所涉及,簡單來說aware日期時間會考慮時區等的因素,比如tzinfo設定為UTC後,時間戳就會相對於UTC求一個偏移。而,naive時間日期無法使用者設定時區,選用哪個時區完全靠執行程式碼的系統決定,官方解釋:

Whether a naive object represents Coordinated Universal Time (UTC), local time, or time in some other timezone is purely up to the program

4 常用API

理解了上面說的這些日期和時間的基本概念後,再用起來就不會掉坑了,下面總結一些常用的吧,網上這方面的一搜一大把,我儘量整理一個標準版本吧。

整理思路就是按照三種時間日期的表達格式,再有三種表達的相互轉換。

4.1 time 模組

import time

time.time()#獲得自己所在時區的當前時間的時間戳

1382679270.196

time.clock()#3.8要廢棄了

改為使用 time.process_time() 計算cpu的執行時間

time.mktime((2019,5,14, 0,0,0, 0,0,0))#利用mktime函式建立一個時間戳

1557763200.0, 注意必須是9元組

4.1.1封裝格式函式

提煉使用較多的函式,將任意格式的時間日期字串,轉化為我們熟悉的時間日期格式

def toMyFormat(inputstr, inputfmt = "%a %b %d %H:%M:%S %Y"):

tstruct = time.strptime(inputstr ,inputfmt) #轉化為struct_time

return time.strftime("%Y-%m-%d %H:%M:%S", tstruct) #轉化為定製的格式

4.1.2時間戳轉struct_time

In [91]: a = time.time() #時間戳

Out[92]: 1557819720.375314

In [94]: time.gmtime(a) # 用UTC表達的struct_time

Out[94]: time.struct_time(tm_year=2019, tm_mon=5, tm_mday=14, tm_hour=7, tm_min=42, tm_sec=0, tm_wday=1, tm_yday=134, tm_isdst=0)

In [96]: time.localtime() # 用localtime表達的struct_time

Out[96]: time.struct_time(tm_year=2019, tm_mon=5, tm_mday=14, tm_hour=15, tm_min=43, tm_sec=27, tm_wday=1, tm_yday=134, tm_isdst=0)

4.1.3時間戳轉字串

In [100]: time.ctime(a) # 時間戳轉字串格式(本地時區表達)

Out[100]: 'Tue May 14 15:42:00 2019'

這個時間格式不是我們想要的,直接使用上面提到的封裝後的日期轉化函式toMyFormat 即可。

4.1.4struct_time轉字串

In [122]: import time

In [123]: a = time.localtime()

In [124]: a

Out[124]: time.struct_time(tm_year=2019, tm_mon=5, tm_mday=14, tm_hour=16, tm_min=36, tm_sec=30, tm_wday=1, tm_yday=134, tm_isdst=0)

In [125]: b = time.asctime(a) # struct_time轉時間戳

In [126]: b

Out[126]: 'Tue May 14 16:36:30 2019'

In [127]: toMyFormat(b)

Out[127]: '2019-05-14 16:36:30'

4.1.5struct_time轉時間戳

In [132]: a = time.gmtime()

In [133]: a

Out[133]: time.struct_time(tm_year=2019, tm_mon=5, tm_mday=14, tm_hour=8, tm_min=38, tm_sec=55, tm_wday=1, tm_yday=134, tm_isdst=0)

In [136]: time.mktime(a) #stuct_time轉為時間戳

Out[136]: 1557794335.0

4.1.6字串轉struct_time

In [146]: b

Out[146]: 'Tue May 14 16:44:16 2019'

In [147]: time.strptime(b,'%a %b %d %H:%M:%S %Y') #str格式轉struct_time

Out[147]: time.struct_time(tm_year=2019, tm_mon=5, tm_mday=14, tm_hour=16, tm_min=44, tm_sec=16, tm_wday=1, tm_yday=134, tm_isdst=-1)

4.1.7字串轉時間戳

字串轉為strct_time,然後使用time.mktime(a)轉化為時間戳。

4.2datetime模組

datetime模組包括datetime類,date類,time類,timedelta類,tzinfo類。

4.2.1datetime

from datetime import *

date.today()*獲取今天的日期:datetime.date(2019, 5, 14)

datetime.today()#獲取今天的日期和時間:datetime.datetime(2019, 5, 14, 12, 36, 33, 382046)

dtime = datetime.now()# 獲取當前的日期和時間,類似於 today()

datetime.datetime(2019, 5, 14, 12, 36, 33, 322000) # 構造出一個datetime例項

dtime.date()

Out[154]: datetime.date(2019, 5, 14) # date類

dtime.time()

Out[155]: datetime.time(16, 49, 57, 399473) #注意此time類不是time模組

In [157]: dtime.day

Out[157]: 14

In [158]: dtime.month

Out[158]: 5

4.2.2date

一個date物件表示年月日的組合,使用的日曆為Gregorian。上面常用到的屬性:

In [199]: a

Out[199]: datetime.datetime(2019, 5, 14, 17, 1, 35, 804091)

In [200]: ad = a.date

In [202]: ad = a.date()

In [203]: ad

Out[203]: datetime.date(2019, 5, 14)

In [204]: ad.timetuple() # 轉為time模組中的struct_time類

Out[204]: time.struct_time(tm_year=2019, tm_mon=5, tm_mday=14, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=134, tm_isdst=-1)

In [205]: ad.weekday() #返回周幾,Monday為0,Sunday為6

Out[205]: 1

In [206]: ad.isoweekday() #返回周幾,Monday為1,Sunday為7

Out[206]: 2

In [218]: ad

Out[218]: datetime.date(2019, 5, 14)

In [219]: ad.ctime() # 轉化為時間的字串

Out[219]: 'Tue May 14 00:00:00 2019'

In [220]: ad.strftime("%Y-%m-%d") #按照指定格式轉化

Out[220]: '2019-05-14'

In [222]: ad.strftime("%Y-%m-%d %H:%M:%S")

Out[222]: '2019-05-14 00:00:00'

4.2.3time

時間物件代表本地時間,不含年月日,可以由 tzinfo 調整。注意與time模組區分,此time為datetime模組下的類。

4.2.4timedelta

timedelta物件代表兩個日期或時間的間隔,是一個週期。

timedelta類的定義如下:

class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

timedelta類例項支援加減乘除等操作,如下:

In [189]: a = datetime.today()

In [190]: a

Out[190]: datetime.datetime(2019, 5, 14, 17, 1, 35, 804091)

In [191]: b = datetime(2019,5,15,18)

In [192]: b

Out[192]: datetime.datetime(2019, 5, 15, 18, 0)

In [193]: b - a

Out[193]: datetime.timedelta(days=1, seconds=3504, microseconds=195909)

以上就是python中關於時間處理的理論介紹,API使用較多的總結。你如發現了問題,請幫助我更正,謝謝。

本專題教程為公眾號: Python與演算法社群 出品,如需轉載,請註明出處 Python與演算法社群 公眾號。

0e2bed511f33b46b307b96d3fc026ac9.png

Python與演算法社群

長按訂閱