python的有關時間的有哪幾種呢?今天我們介紹兩個:time和datetime
time模塊提供各種操作時間的函數
datetime模塊定義了下面這幾個類:
- datetime.date:表示日期的類。常用的屬性有year, month, day;
- datetime.time:表示時間的類。常用的屬性有hour, minute, second, microsecond;
- datetime.datetime:表示日期時間。
- datetime.timedelta:表示時間間隔,即兩個時間點之間的長度。
- datetime.tzinfo:與時區有關的相關信息。
python中處理的事件類型有哪幾種呢?
* 時間戳的方式(相對於1970.1.1 00:00:00以秒計算的偏移量),時間戳是惟一的,如:1382678303.098
* 以數組的形式表示即(struct_time),共有九個元素,分別表示,同一個時間戳的struct_time會因為時區不同而不同如:time.struct_time(tm_year=2013, tm_mon=10, tm_mday=25, tm_hour=13, tm_min=21, tm_sec=33, tm_wday=4, tm_yday=298, tm_isdst=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
為了從實用的角度出發就不把time和datetime分開了,從獲取和輸出的角度來整理下:
1. 如何獲得時間,如何獲得各種格式的時間?
time模塊:
>>> import time >>> time.time()#獲得當前時間的時間戳 1382679270.196 >>> time.clock()#第一次運行獲得當前時間的時間戳,第二次運行就是間隔上一次運行的時間間隔 2.1380998706449576e-06 >>> time.mktime((2013,11,11,11,11,11,1,1,0))#利用mktime函數創建一個時間戳 1384139471.0
datetime模塊:
>>> from datetime import * >>> date.today()*獲取今天的日期 datetime.date(2013, 10, 25) >>> datetime.today()#獲取今天的日期和時間 datetime.datetime(2013, 10, 25, 13, 42, 53, 455000) >>> datetime.now()#獲取當前的日期和時間 datetime.datetime(2013, 10, 25, 13, 43, 0, 322000)
2. 有了時間后,再實際中會設計到格式之間的處理,比如數據庫中一般會保存時間戳格式的,而現實的時候應該是字符串了吧,那個struct_time,好吧,用的比較少吧?
time模塊:
時間戳-->struct_time,字符串
>>> import time >>> a = time.time()#獲取當前時間的時間戳 >>> a 1382680272.862 >>> time.ctime(a)*將時間戳轉換為時間字符串 'Fri Oct 25 13:51:12 2013' >>> time.gmtime(a)#將時間轉換為struct_time time.struct_time(tm_year=2013, tm_mon=10, tm_mday=25, tm_hour=5, tm_min=51, tm_sec=12, tm_wday=4, tm_yday=298, tm_isdst=0) >>> time.localtime()#將當前時間轉換為struct_time time.struct_time(tm_year=2013, tm_mon=10, tm_mday=25, tm_hour=13, tm_min=52, tm_sec=1, tm_wday=4, tm_yday=298, tm_isdst=0) >>> time.localtime(a)#將a轉換為struct_time time.struct_time(tm_year=2013, tm_mon=10, tm_mday=25, tm_hour=13, tm_min=51, tm_sec=12, tm_wday=4, tm_yday=298, tm_isdst=0)
struct_time-->字符串,時間戳
>>> import time >>> a = time.localtime() >>> a time.struct_time(tm_year=2013, tm_mon=10, tm_mday=25, tm_hour=13, tm_min=57, tm_sec=18, tm_wday=4, tm_yday=298, tm_isdst=0) >>> b = time.asctime(a)#轉換為字符串 >>> b 'Fri Oct 25 13:57:18 2013' >>> time.mktime(a)#轉換為時間戳 1382680638.0 >>> time.strftime("%a %b %d %H:%M:%S %Y",a)#轉換為字符串 'Fri Oct 25 13:57:18 2013'
字符串-->struct_time,PS:字符串不能直接轉換為時間戳,需要先轉為struct_time
>>> import time >>> a time.struct_time(tm_year=2013, tm_mon=10, tm_mday=25, tm_hour=14, tm_min=5, tm_sec=28, tm_wday=4, tm_yday=298, tm_isdst=0) >>> b = time.asctime(a) >>> b 'Fri Oct 25 14:05:28 2013' >>> c = time.strptime(b,'%a %b %d %H:%M:%S %Y')#按照格式轉換為9元組 >>> c time.struct_time(tm_year=2013, tm_mon=10, tm_mday=25, tm_hour=14, tm_min=5, tm_sec=28, tm_wday=4, tm_yday=298, tm_isdst=-1)
datetime模塊:
介紹幾個datetime模塊常用的方法:
datetime.fromtimestamp(time.time())#將時間戳轉換為字符串
from datetime import * import time print 'datetime.max:', datetime.max print 'datetime.min:', datetime.min print 'datetime.resolution:', datetime.resolution print 'today():', datetime.today() print 'now():', datetime.now() print 'utcnow():', datetime.utcnow() print 'fromtimestamp(tmstmp):', datetime.fromtimestamp(time.time())#將時間戳轉換為字符串 print 'utcfromtimestamp(tmstmp):', datetime.utcfromtimestamp(time.time()) # ---- 結果 ---- # datetime.max: 9999-12-31 23:59:59.999999 # datetime.min: 0001-01-01 00:00:00 # datetime.resolution: 0:00:00.000001 # today(): 2010-04-07 09:48:16.234000 # now(): 2010-04-07 09:48:16.234000 # utcnow(): 2010-04-07 01:48:16.234000 # 中國位於+8時間,與本地時間相差8 # fromtimestamp(tmstmp): 2010-04-07 09:48:16.234000 # utcfromtimestamp(tmstmp): 2010-04-07 01:48:16.234000
3. 處理一些特殊的情況,比如需要設定某個時間的間距的時候,用到datetime的datetime.timedelta類。
見代碼:
#! /usr/bin/python # coding=utf-8 from datetime import datetime,timedelta """ timedelta代表兩個datetime之間的時間差 """ now = datetime.now() past = past = datetime(2010,11,12,13,14,15,16) timespan = now - past #這會得到一個負數 past - now attrs = [ ("days","日"),( 'seconds',"秒"),( 'microseconds',"毫秒") #('min',"最小"),( 'max',"最大"), ] for k,v in attrs: "timespan.%s = %s #%s" % (k,getattr(timespan, k),v) """ 總共相差的秒數 """ timespan.total_seconds() """ 實例化一個timespan 請注意它的參數順序 timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]]) """ timespan = timedelta(days=1)##timespan = timedelta(minutes=30) now - timespan #返回的是datetime型 now + timespan timespan * 2 #還可以乘哦。代表二倍 timespan / 13 #增加一個月 from calendar import monthrange now + timedelta(days=monthrange(start.year,start.month)[1])
最后列出格式化字符串中的意義:
%a 星期的簡寫。如 星期三為Web
%A 星期的全寫。如 星期三為Wednesday
%b 月份的簡寫。如4月份為Apr
%B月份的全寫。如4月份為April
%c: 日期時間的字符串表示。(如: 04/07/10 10:43:39)
%d: 日在這個月中的天數(是這個月的第幾天)
%f: 微秒(范圍[0,999999])
%H: 小時(24小時制,[0, 23])
%I: 小時(12小時制,[0, 11])
%j: 日在年中的天數 [001,366](是當年的第幾天)
%m: 月份([01,12])
%M: 分鍾([00,59])
%p: AM或者PM
%S: 秒(范圍為[00,61],為什么不是[00, 59],參考python手冊~_~)
%U: 周在當年的周數當年的第幾周),星期天作為周的第一天
%w: 今天在這周的天數,范圍為[0, 6],6表示星期天
%W: 周在當年的周數(是當年的第幾周),星期一作為周的第一天
%x: 日期字符串(如:04/07/10)
%X: 時間字符串(如:10:43:39)
%y: 2個數字表示的年份
%Y: 4個數字表示的年份
%z: 與utc時間的間隔 (如果是本地時間,返回空字符串)
%Z: 時區名稱(如果是本地時間,返回空字符串)
%%: %% => %
例子:mysql中select當天的數據:
today = datetime.datetime.today() print today yestoday = today - datetime.timedelta(days=1) print yestoday content1 = db.query("select * from log where time > %s and time < %s",yestoday,today)
如果取的是前一天的0點到24點的數據則:
day = datetime.datetime.now()
oneday = datetime.timedelta(days=1)
day = day - oneday
date_from = datetime.datetime(day.year, day.month, day.day, 00, 00, 00)
date_to = datetime.datetime(day.year, day.month, day.day, 23, 59, 59)