博采眾長穿梭時空|Maya庫使用筆記

Maya簡介

用time、datetime等內(nèi)置庫處理時區(qū)需要挺多的代碼,而且寫法很不優(yōu)雅蔫饰,Maya是一個不錯的第三方時間庫,在pytz愉豺、pendulum等庫基礎上增強了對時區(qū)的處理篓吁。
Maya的時間對象是自定義的MayaDT對象,是按時間戳表示的蚪拦,因此在時區(qū)問題上更容易進行轉換了杖剪。從功能上看,Maya的時間創(chuàng)建能力上排名前列驰贷,在時間偏移和屬性獲取上方面接口也挺簡潔盛嘿,綜合來看是不錯的Python時間庫,在GitHub 上目前有3.2k的star括袒。

maya庫用法概覽

時間輸入與轉換

Maya提供了豐富的接口用于從各種數(shù)據(jù)中解析出時間對象次兆,既有簡約的from_datetime()把datetime對象轉為MayaDT時間對象,也有強大的when()parse()從字符串中解析時間要素锹锰。一些示例代碼如下类垦。

import maya
maya.parse('2020-12-08T03:15') #字符串轉maya時間對象
#Out[]:<MayaDT epoch=1607397346.636102>
maya.when('1011-02-07') #因為是用的epoch,小于1970年是負數(shù)
#<MayaDT epoch=-30259958400.0>
dt=maya.now() #獲取當前時間
maya.when('tomorrow') #明天的這個時候,直接從自然語言轉MayaDT
maya.MayaDT.from_datetime(datetime.now()) #datetime對象轉MayaDT
maya.MayaDT.from_struct(time.gmtime()) 
maya.MayaDT(1606533154) #時間戳轉Maya時間對象
dt.day #獲取時間要素屬性

Maya庫記錄時間對象是用epoch時間戳城须,表示的是時間基準點至特定時間dt的總秒數(shù)蚤认,該基準點在Unix及類Unix系統(tǒng)中是格林威治時間1970年01月01日00時0分0秒,也稱為Unix時間戳(Timestamp)糕伐。
Maya可以充分地把其他基礎庫的時間對象轉為MayaDT對象砰琢。
另一方面,把一個MayaDT對象轉為datetime對象或者轉換為字符串也挺簡單。

  • dt.datetime():把dt轉為datetime對象陪汽;
  • dt.date:轉為datetime庫的date對象训唱,也就是只保留年月日,date后面沒有小括號挚冤;
  • dt.epoch:輸出時間戳况增;
  • dt.iso8601():輸出符合ISO-8601標準 的字符串,例如'2020-12-07T00:00:00Z'训挡;對應的還有dt.rfc3339()dt.rfc2822()澳骤;

要輸出為自定形式的字符串會麻煩一些,沒有format方法可以用澜薄,需要用maya.Datetime.strftime(dt.datetime(),fmt)進行轉換为肮,fmt是time模塊所支持的占位字符串,例如'%Y-%m-%d %H:%M:%S'肤京。這里maya.Datetime就是用的datetime庫的strftime颊艳。

屬性獲取與特性

MayaDT展示的雖然是epoch一個浮點數(shù),其獲取時間對象的年月日等時間要素的接口并不少忘分,可以很自然地通過dt.day等得到時間要素棋枕,和datetime沒有隔閡,year妒峦、month重斑、second等都有,通過dt.timezone獲取時區(qū)舟山。其默認的時區(qū)是UTC的绸狐,其特性是獲取屬性時是轉換為datetime再獲取屬性的。

dt=maya.parse('2020-12-07')
dt.year #2020
dt.timezone #UTC
dt.local_datetime()
dt.local_timezone
dt.iso8601()
dt.slang_time() #輸出為自然語言

class MayaDT(object):
    @property
    def year(self):
        return self.datetime().year

Maya也是支持自然語言的輸出的累盗,只需要使用dt.slang_time()寒矿,也可以結合時間偏移功能連綴使用。slang是俚語的意思若债。MayaDT有slang_time和slang_date兩個方法可以使用符相,slang_date更專注在日期維度的表達。

dt=maya.when('2020, 12, 7')
dt.slang_time()
# '8 hours ago'
dt.add(days=10).slang_time()
# 'in 1 week'
dt.snap('@d+3h').slang_time()
# '5 hours ago'
dt.slang_date()
# 'today'

時間偏移及序列

Maya對時間偏移抽象的接口是add和subtract蠢琳,和其他庫接口一致啊终。dt.subtract(days=1)代表dt向前推移1天,輸入的參數(shù)是years傲须、days這些蓝牲,數(shù)值可以為負數(shù),subtract(days=-1)和add(days=1)效果是一致的泰讽。另外一種簡寫的方法是使用snap例衍,例如dt.snap('@d+3h')表示在dt當天的基礎上加3個小時昔期,只要符合規(guī)則,可以寫dt.snap("+8h@d+1d+11h")這類復雜的操作佛玄,這三個方法生成的是新對象硼一,不是直接修改原dt對象。
Maya的snap方法是調(diào)用的snaptime庫梦抢,具體snap字符串參數(shù)的規(guī)則可以看snaptime文檔 般贼。

Maya要生成一個時間序列可以使用maya.intervals或者MayaInterval類,實例如下奥吩。

list(maya.intervals(start=maya.now(),
                    end=maya.now().add(days=1),
                    interval=60*60))
#生成start到end的每小時間隔的時間值序列

[i for i in maya.MayaInterval(start=now, end=now.add(hours=1))]

MayaInterval的參數(shù)有start哼蛆、end和duration,duration間隔單位也是秒圈驼。

總結

Maya通過把時間統(tǒng)一表示為時間戳避免了各種時區(qū)問題人芽,能夠達到獨立于系統(tǒng)和機器環(huán)境望几,站在datetime绩脆、pendulum、snaptime等模塊的肩膀上橄抹,實現(xiàn)了各種實用的時間計算方法靴迫,增強了對時區(qū)的處理,在滿足基本功能的基礎上楼誓,別有特色地簡化了滿足ISO-8601玉锌、RFC-2822時間表達字符串的輸入輸出。


maya庫使用
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疟羹,一起剝皮案震驚了整個濱河市主守,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榄融,老刑警劉巖参淫,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異愧杯,居然都是意外死亡涎才,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門力九,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耍铜,“玉大人,你說我怎么就攤上這事跌前∽丶妫” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵抵乓,是天一觀的道長伴挚。 經(jīng)常有香客問我蹭沛,道長,這世上最難降的妖魔是什么章鲤? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任摊灭,我火速辦了婚禮,結果婚禮上败徊,老公的妹妹穿的比我還像新娘帚呼。我一直安慰自己,他們只是感情好皱蹦,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布煤杀。 她就那樣靜靜地躺著,像睡著了一般沪哺。 火紅的嫁衣襯著肌膚如雪沈自。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天辜妓,我揣著相機與錄音枯途,去河邊找鬼。 笑死籍滴,一個胖子當著我的面吹牛酪夷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播孽惰,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼晚岭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了勋功?” 一聲冷哼從身側響起坦报,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狂鞋,沒想到半個月后片择,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡要销,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年构回,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疏咐。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡纤掸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浑塞,到底是詐尸還是另有隱情借跪,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布酌壕,位于F島的核電站掏愁,受9級特大地震影響歇由,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜果港,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一沦泌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辛掠,春花似錦谢谦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至猩谊,卻和暖如春千劈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牌捷。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工墙牌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宜鸯。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓憔古,卻偏偏與公主長得像遮怜,于是被迫代替她去往敵國和親淋袖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容