Python時間處理庫:sandglass

jopen 10年前發布 | 15K 次閱讀 sandglass Python開發

概覽

sandglass(沙漏) 是一個增強的、友好的時間處理庫,目的是為了解放程序員的生產力。 在python中有太多處理時間的庫,datetime/date/time/calendar等等。需要記的細節太多,選擇困難。 而sandglass就是解決這個的青霉素。從各種麻煩的轉換中解脫出來。 只需記住 Sandglass對象 和 ben() 、 tslice() 、cronwalk() 這幾個主要的api即可。

Features:

  • api簡潔,開箱即用

  • 增強接管datetime

  • 內置時間字符串解析器

  • 方便進行各種轉換

  • 靈活的構造函數

  • 方便的獲取各種時間信息

  • 支持偽造當前時間,方便調試

  • 一鍵生產時間序列

  • 支持解析crontab表達式

用法

在sandglass中,核心對象是 Sandglass對象 。

ben() 函數用來便捷獲取Sandglass對象.:

不帶參數默認是當前時間
>>>ben()#shortcut of Sandglass.now()
參數是時間戳
>>>ben(timestamp)
參數是時間字符串
>>>ben(timestr)
參數是datetime對象
>>>ben(datetime)
參數是Sandglass對象
>>>ben(Sandglass)
顯式指明格式
>>>ben('2013-01-01','%Y-%m-%d')
datetime-like的構造器
>>>ben(year=2013,month=2,day=8,hour=7)

也就是說,只要把能表達時間的東西塞給ben()就行了。 值得一說的是ben(timestr)中通過一個詞法解析的東西,使得timestr可以很靈活。大體規則是,如果缺少年月日信息,則默認用當前時間的年月日;如果缺少時分秒信息,則默認是0:

>>>ben('2013,1,1') == ben('2013-01,01') == ben('2013 1 01') == ben('2013-01-01 00:00:00')
True
>>>ben('2013,1,1 19:23') == ben('2013-01-01 19:23:00')
True
>>>now = datetime.now()
>>>ben('19:23').year == now.year
True
>>>ben('19:23').month == now.month
True
>>>ben('19:23').day == now.day
True
>>> ben('19:23').hour,ben('19:23').minute,ben('19:23').second
(19,23,0)

Sandglass對象 ,通過這個對象,可以方便的獲取各個時間屬性和操作:

>>>sg = ben('2013,1,1 13:14:15')
>>>sg>>>sg.year,sg.month,sg.day,sg.hour,sg.minute,sg.second,sg.microsecond
(2013, 1, 1, 13, 14, 15, 0)
>>> sg.timestamp#還能直接獲取timestamp
1357017255.0

#便捷的獲取常用的sql格式
>>> sg.sql
'2013-01-01 13:14:15'
>>> sg.sqldate
'2013-01-01'
>>> sg.sqltime
'13:14:15'

#進行增量變換(shift是原地操作,而shifted返回一個新的對象)
>>> sg.shifted(day=1,minute=-2)>>> sg.hour=23
>>> sg>>> sg.floor('hour'),sg.ceil('hour')
(,)
>>> sg.floor('year'),sg.ceil('year')
(,)
>>> sg.round(30*60)>>> sg.roundfloor(30*60)#重載符號
>>>sg3 = Sandglass(year=2013,month=2,day=27,hour=0)
>>>sg4 = Sandglass(year=2013,month=3,day=1,hour=0)
>>> sg3==sg4
False
>>> sg3>> sg3>sg4
False
>>> sg4-sg3
datetime.timedelta(2)

#mock當前時間,這樣就測試的時候就不用改時間,直接mock給當前時間加上個偏移量就行了
#比如我要把時間往后推一天
>>> ben()>>> Sandglass.mock(day=1)
>>> ben()>>> ben()>>> Sandglass.unmock()
>>> ben()#其它
>>> sg>>> sg.raw()
datetime.datetime(2013, 1, 1, 23, 14, 15)
>>> sg.clone()>>> sg.replace(day=2)
>>> sg>>> sg.days_in_month
31
>>> sg.is_today()
False
>>> sg.is_past_date()
True
>>> sg.is_future_date()
False
>>> sg.strftime('%Y/%m/%d')
'2013/01/02'
>>> Sandglass.strptime('20130203','%Y%m%d')

tslice ,受內置函數xrange啟發,用于獲取一個時間序列。

格式是:

tslice(unit,start=None,end=None,step=1,count=None) -> generator of Sandglass object
unit in ['year', 'month', 'day', 'hour', 'minute', 'second', 'microsecond']

跟xrange一樣,step可以是負數。如果start為空,則默認是當前時間。

示例:

>>>list(tslice('day','2013-01-01','2013-01-04'))
[,,]

>>>list(tslice('day','2013-01-04','2013-01-01',step=-1))
[,,]

>>>list(tslice('day','2013-01-04','2013-01-31',step=3,count=2))
[,]

>>>list(tslice('year',start='2013-01-04',count=2))
[,]

>>>list(tslice('minute',start='2013-01-04',count=2))
[,]

cronwalk ,用于對crontab表達式進行演算,得到下一個執行的時間。

格式:

cronwalk(expr,base=None)# 如果base為空,默認是當前時間。

示例:

>>>c = iter(cronwalk('0 6 * * *',base='2013-02-03'))
>>>next(c)>>>next(c)>>>c = iter(cronwalk('0 23-7/2 * * *',base='2013-02-03 08:30:00'))
>>>next(c)>>>next(c)

timediff ,用于計算距離下個指定時間還有多久,比如有個活動是每天20:00:00開始的,要計算距離活動開始還有多久:

>>>timediff('20:00:00',factor=86400,base='19:30:00')
1800
>>>timediff('20:00:00',factor=86400,base='21:30:00')
81000

項目主頁:http://www.baiduhome.net/lib/view/home/1399690350181

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!