博采众长穿梭时空|Maya库使用笔记

Maya简介

用time、datetime等内置库处理时区需要挺多的代码,而且写法很不优雅,Maya是一个不错的第三方时间库,在pytz、pendulum等库基础上增强了对时区的处理。
Maya的时间对象是自定义的MayaDT对象,是按时间戳表示的,因此在时区问题上更容易进行转换了。从功能上看,Maya的时间创建能力上排名前列,在时间偏移和属性获取上方面接口也挺简洁,综合来看是不错的Python时间库,在GitHub 上目前有3.2k的star。

maya库用法概览

时间输入与转换

Maya提供了丰富的接口用于从各种数据中解析出时间对象,既有简约的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年是负数
#<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的总秒数,该基准点在Unix及类Unix系统中是格林威治时间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一个浮点数,其获取时间对象的年月日等时间要素的接口并不少,可以很自然地通过dt.day等得到时间要素,和datetime没有隔阂,year、month、second等都有,通过dt.timezone获取时区。其默认的时区是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天,输入的参数是years、days这些,数值可以为负数,subtract(days=-1)和add(days=1)效果是一致的。另外一种简写的方法是使用snap,例如dt.snap('@d+3h')表示在dt当天的基础上加3个小时,只要符合规则,可以写dt.snap("+8h@d+1d+11h")这类复杂的操作,这三个方法生成的是新对象,不是直接修改原dt对象。
Maya的snap方法是调用的snaptime库,具体snap字符串参数的规则可以看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的参数有start、end和duration,duration间隔单位也是秒。

总结

Maya通过把时间统一表示为时间戳避免了各种时区问题,能够达到独立于系统和机器环境,站在datetime、pendulum、snaptime等模块的肩膀上,实现了各种实用的时间计算方法,增强了对时区的处理,在满足基本功能的基础上,别有特色地简化了满足ISO-8601、RFC-2822时间表达字符串的输入输出。


maya库使用
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容