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