datetime模組主要是用來表示日期的,就是我們常說的年月日時分秒,calendar模組主要是用來表示年月日,是星期幾之類的信息,time模組主要著重在時分秒,粗略從功能來看,我們可以認為三者是一個互補的關係,各自專註一塊。方便使用者依據不同的使用目的選用趁手的模組。
2.從time模組說起為了學習time模組,我們需要先知道幾個與時間相關的概念:
(1)epoch#假設我們要將時間表示成毫秒數,比方說1000000毫秒,那有一個問題必須解決,這個1000000毫秒的起點是什麼時間,也就是我們的時間基準點是什麼時間?好比我說你身高1.8米,那這個身高是指相對於你站立的地面說的。這個時間基準點就是epoch,在Unix系統中,這個基準點就是1970年1月1日0點整個時間點。
(2)GMT, UTC上面我們說epoch表示1970年的起始點,那這個1970年又是相對於哪個基準時間呢?一般來說,就是相對於格林尼治時間,也叫做GMT(Greenwich Mean Time)時間,還叫做UTC(Coordinated Universal Time),為啥一個時間基準有兩個名字?歷史上,先有的GMT,後有的UTC.
UTC是我們現在用的時間標準,GMT是舊的時間計量標準。 UTC是根據原子鐘來計算時間,而GMT是根據地球的自轉和公轉來計算時間。
所以,可以認為UTC是真正的基準時間,GMT相對UTC的偏差為0。
在實際中,我們的電腦中有一個硬體模組RCT,裡面會即時記錄UTC 時間,該模組有單獨的電池供電,即使關機也不影響。
有了epoch這個時間基準,又有了UTC這個基準的基準,我們就可以精確地表示一個時間了。
(3)DST, tzone儘管我們已經可以精確地表示一個時間,很多情況下,我們還是要根據地區實際情況對時間進行一個調整,最常見的就是時區,tzone,相信大家都比較熟悉。
此時,當我們說5點5分這個時間時,還需加上是哪個時區的5點5分才能精確說明一個時間。
另外一個對時間做出調整的是DST.
DST 全名為Daylight Saving Time,是說,為了充分利用日光,減少用電,人為地對時間做出一個調整,這取決於不同國家和地區的政策法規。比如說,假設你冬天7點天亮起床,但夏天6點天亮,那麼在夏天到來時人為將時間加1個小時,這樣就可以讓你還是覺得7點起床,但實際上是提前一個小時了。
那麼,好奇的我們,一定要問,python是如何知道tzone和DST這兩個的值呢?答案是透過環境變數。
這裡我們只以linux為例來說明。
在linux中有TZ環境變量,其值類似這樣:
CST 08EDT,M4.1.0,M10.5.0,這個字串可以做如下解讀,用空格分開他們,分成三部分
CST 08 EDT, M4.1.0,M10.5.0
第一部中的CST表示時區的名字,即China Standard Time,也就是我們所說的北京時間, 8表示北京時間加上8小時就是UTC時間
第二部分EDT表示DST的名字,我們說DST是因各國地區的政策法規不同而不同的,EDT後面也可以像CST後面一樣加一個時間調整值,但由於我們國內只在86年到92年實施過一段時間DST,現在已經廢止,所以後面不用加調整時間。
第三部分錶示的是實行DST的開始和結束時間,我們就不細解讀了。
(4)時間的表示,獲取,轉換time模組中取得時間的基本方法是
t = time.time()
它回傳的是從epoch到現在的秒數(用浮點數表示),用的是UTC時間。
我們自然而然地想把這個秒數轉為年月日時分秒的形式,而這種轉換又分兩種,一種還是用UTC時間,一種用我們所在時區進行調整後的時間。
time模組給我們提供了兩個方法,
time. gmtime(t) time.localtime(t)
二者都傳回一個類別struct_time的實例,該實例具有如下屬性:
#相比用秒數表示的時間,這樣的表示更適合我們理解。
這兩個函數如果呼叫時不傳參數,它們內部會呼叫time.time(),並用傳回的秒數做轉換。
相反的,python同樣提供了將這兩種struct_time轉為秒數的方法。
calendar.timegm()方法用來把UTC的struct_time(gmtime的回傳物件)轉為從epoch開始的秒數
time.mktime()用來把用時區調整過的struct_time(即localtime的回傳物件)物件轉為從epoch開始的秒數
也就是說mktime方法會先找到系統中的時區和DST訊息,並利用這個訊息對struct_time進行調整後再換算成秒數。
另一種常見的需求是在時間和表示時間的字串之間進行轉換。
time模組中的strftime和strptime就是做這個用的。
看名字大家就應該知道它們的意義,
strftime 即 string format time,用來將時間格式化成字串
strptime 即string parse time,用來將字串解析成時間。
要注意的是,這裡的時間都是struct_time物件。
關於怎麼格式化時間,是很簡單的知識,這裡就藉用官網文件的內容了。
#除了這兩個函數,time模組中還提供了兩個簡單方法,來幫助將時間轉換為字串
asctime用來將一個struct_time物件轉為標準24字元的字串,如下所示:
Sun Jun 20 23:21:05 1993
ctime方法與asctime作用相同,只不過它接收的是秒數,在內部,會先把秒數通過localtime轉為struct_time,再往後就與asctime一樣了。
以上就是time模組的核心內容,我試著用一個口訣幫助記憶這些API
time点time得秒数 传入gm, local time得struct_time 要想变回原秒数 你得传回calendar.timegm和time. mktime string f和string p 格式化时间靠哥俩 你要还是嫌费事 asctime ,ctime来助力 专门帮你转字符串 前者接收struct_time 后者专门处理秒数 分工合作不费力 学好time模块基本功 做个时间的明白人!
下面,我們要開始學習datetime模組。
3.datetime模組 (1)概覽#time模組解決了時間的獲取和表示,datetime模組則進一步解決了快速獲取並操作時間中的年月日時分秒資訊的能力。
簡單說,該模組核心的類別就三個,date類別表示年月日,time類別表示時分秒毫秒,這裡不要和time模組搞混淆了。一句順口溜可以幫助記清這個情況:
time裡面沒time
藏在datetime裡
編的是不是不咋地?嗯,我也這麼覺得。
datetime類別就是date和time的組合。
有一點需要事先說明一下,time類別和datetime類別都有一個屬性,它的值是一個tzinfo對象,裡麵包含了該time或者datetime的時區信息,一般稱這個time或者datetime對像是aware的,它能夠準確換算成自epoch開始的秒數。
如果該屬性設定為None,那麼,這時的time物件或是datetime物件就沒有時區訊息,具體它表示的是local time還是utc time,需要我們自己在程式中去決定。
這裡我們所說的local time是指我們所在時區的時間, utc time指的就是國際標準時間,也就是格林尼治時間。下文同。
請記住一點,date中是沒有時區資訊的。
(2)从创建datetime开始创建datetime对象,我最常用的办法如下
dt=datetime.datetime.fromtimestamp(time.time())
以上,time.time()获得自epoch开始的秒数,fromtimestamp方法会将这个秒数转变成一个datetime对象。
这里有一个问题,这个datetime对象究竟是utc的还是local的?
答案是local的,这是该方法的默认行为。如果你在fromtimestamp方法中传入一个表示时区的参数,即tzinfo对象,就会按传入的时区信息进行转换。
获得表示当前local时间的datetime对象,还有两个简便方法
datetime. datetime. now() datetime. datetime. today()
以上我们得到的都是local的datetime对象,如何获得utc的datetime对象呢?有两个办法
datetime. datetime. utcfromtimestamp() datetime. datetime. utcnow()
我们还可以从字符串中创建datetime对象,
其内部还是先调用的time模块中的striptime方法,获取struct_time对象,再利用struct_time对象中的年月日时分秒信息构建datetime对象。
同样的,datetime类也提供了strftime(),asctime(),ctime()方法,相信不说你也知道是做什么的了。
datetime类还提供了一个combine方法,用来将一个date对象和一个time对象组合成一个datetime对象。
需要注意的是,datetime模块中出现timestamp时,一般可将其理解成time.time()返回的秒数
(3)date和time的创建date对象的创建和datetime非常相似,
datetime. date. today()
datetime.date.fromtimestamp()都可以创建一个date对象。
当然,你也可以通过构造方法传入年月日来创建date对象。
相比之下,time对象的创建就很有限,只能通过
datetime.time([hour[, minute[, second[, microsecond[, tzinfo]]]]])
这个方法创建。
(4)以上三个对象的操作和timedelta类在实际使用中,我们有一大块需求就是对日期进行比较和加减运算。得益于python的操作符重载能力,python中可以方便地对
date对象之间,或者datetime对象之间进行小于(
注意,这里仅限于同类对象之间,而且,不包括time对象之间。
两个date对象作减,或者两个datetime对象之间作减,差值用一个timedelta对象表示。
同理,一个date 对象或者datetime对象也可以加或者减一个timedelta对象。
一个timedelta对象含有三个属性:days,seconds, microseconds,days属性可以取负值,另外两个属性都只能是正值。
你可以用total_seconds()方法获得一个timedelta对象的秒数表示。
两个timedelta对象之间可加,可减,但不能做大小比较,因为这样没什么意义。
一个timedelta对象还可以与整数相乘,或通过//操作与一个整数相除。
还可以取反,或者用abs函数获得绝对值
4.无总结,不进步本文的目的不在于详细说明python处理时间日期的api如何使用,而是想通过一个概览的形式,让大家抓住time和datetime模块的设计结构,从而能够清楚这些模块提供了哪些能力,在需要的时候能够想起来去用,至于查详细的api,应该是可以轻松解决的。
以上是Python時間處理的完整總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!