仅以此篇记录一下个人常用的 Python 处理日期的库与函数,主要涉及的类库有 Python 自带的 datetime, time 和 calendar,以及第三方的 dateutil。说到日期处理基本上要覆盖的概念有 date, time, datetime, timezone, calendar, 时间的比较与差值,解析与格式化显示等。
在 datetime 模块中类之间的继承关系如下:
object
├── date
│ └── datetime
├── time
├── timedelta
└── tzinfo
└── timezone
我们着重体验一下前面粗体显示的 datetime, date, time, timedelta 对象, timezone 也不是不重要,有时候也可能只需要处理本地时间。
datetime, date, time 实例的创建
可以使用它们各自的构造函数,提供必要的参数来创建相应的实例,下面是它们的构造函数
datetime: def __new__(cls, year, month=None, day=None, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0) date: def __new__(cls, year, month=None, day=None) time: def __new__(cls, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
比如
from datetime import datetime, date, time, timedelta today = date(2019, 4, 24) # 2019-04-24
获得当前日期或时间
date.today() #2019-04-24 datetime.now() # 2019-04-24 21:41:40.226300 datetime.today() # 2019-04-24 21:41:50.336293 datetime.today().date() #2019-04-24 datetime.today().time() #21:41:50.336303 datetime.now().date() datetime.now().time()
从语义上应该调用 date.today()
和 datetime.now()
,datetime.today()
只是 datetime 继承自 date 的函数。
time 没有 today()
或 now()
方法,所以只有通过 datetime.now()
来得到相应的 time, datetime 兼具 date 与 time 信息,所以总是可以经由 datetime 来获得相应的 date 和 time。
解析字符串获得实例
date.fromisoformat('2019-04-24') # 2019-04-24 datetime.fromisoformat('2019-04-24T13:12:23') # 2019-04-24 13:12:23 datetime.strptime('04/24/2019', '%m/%d/%Y') # 2019-04-24 00:00:00 time.fromisoformat('12:12:24+06:00') #12:12:24+06:00
datetime, date 和 time 都有 fromisoformat()
方法,就是要了解它们各自的 ISO 表示格式。能指定格式来解析字符串只有 datetime 有 strptime()
方法,因为有了 datetime
也就有了相应的 date 与 time
date, datetime 与 time 相应的 ISO 格式如下
- date ISO format: YYYY-MM-DD
- datetime ISO format: YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]]
- time ISO format: HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]
能自由解析字符串的就是 datetime.strptime(str, fmt)
,Python 借鉴了标准 C 的日期格式定义字符串,见 strftime() and strptime() Behavior. 后面的 strftime() 函数也要用到相同的格式定义法。
注:strftime() 和 strptime() 中的 f 和 p 分别对应着 format 和 parse 的首字母。
基于 Timestamp 来创建实例
Python 本身没有 Timestamp 这么一个类型,这里的 timestamp 是一个浮点数表示的
ts = datetime.today().timestamp() # 1556161777.38553 date.fromtimestamp(ts) # 2019-04-24 datetime.fromtimestamp(ts) # 2019-04-24 22:09:37.385530
time 没有 fromtimestamp()
方法
格式化输出
date, datetime 和 time 都有 isoformat() 和 strftime(fmt) 函数,格式字符串请参考 strftime() and strptime() Behavior。
date.today().strftime('%a %b %d, %Y') # Wed Apr 24, 2019 datetime.today().isoformat() # 2019-04-24T22:21:38.747318 datetime.today().time().strftime('%Y') # 1900 date.today().strftime('%S') # 00
上面是几个例子,注意在 Python 中像 time 没有年月日信息时格式化时想要输出年份会得到不期望的值,但不会象 Java 中那样报错。比如下面的 Java 代码
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate.now().format(formatter); //2019-04-24 LocalTime.now().format(formatter); //Exception java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra
由于 LocalTime.now()
没有年月日信息,所以无法格式化为 yyyy-MM-dd
。
时间, 日期的比较与 timedelta
- date, datetime, time 都定义有 __lt__, __le__, __ne__, __gt__, __ge__, __eq__ 函数,所以两个相同类型的实例之间是可以进行比较时间上的先后的。
- 其中的 date, datetime 还定义了 __sub__ 和 __rsub__ 函数,因此两个 date 或两个 datetime 实例进行相减会得到一个 timedelta 实例
- 另外, date, datetime 也定义了 __add__, __radd__ 函数,date 或 datetime 可以加减一个 timedelta 来得到一个新的实例
下面看几个简单的示例
d1 = datetime.today() # 2019-04-24 23:00:31.672769 delta = timedelta(days=2, weeks=1, seconds=-3) # 8 days, 23:59:57 d2 = d1 + delta # 2019-05-03 23:00:28.672769 d3 = d1 - delta # 2019-04-15 23:00:34.672769 d2 - d1 # 8 days, 23:59:57 d2 > d1 # True d1 < d3 # False datetime.today().date() + delta) # 2019-05-02
注意,不同类型间不能相减,比如用 date 减去一个 datetime 就不合法了。d1 + delta, d1 - delta 和 delta + d1 都没问题, 但是 delta - d1 就不行了。
timedelta 表示了两个时间的差值,用它来推算另一个实例的时候不带有日历信息,如果想要在日历上推演就得借助于 calendar。
不可忽略的 time 模块
前面讲到的是 datetime 模块中的 time 类型,Python 还自带了 time 模块,由 import time 引入。它提供了一些很实用的功能
- time 包含了完整的如上的 datetime 信息,并不像 datetime 中的 time 不含年月日信息
- locatime(), strptime(), gmtime(), asctime(), mktime() 用以构造 time 实例
- strftime() 可用来格式化输出
- time.time() 得到当前的 Unix 时间戳
- time.sleep(sec) 用来暂停当前线程若干秒
关于 calendar 和 dateutil 的内容有后续
以上就是python 日期处理的详细内容,更多关于python 日期处理的资料请关注其它相关文章!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】