Python的time和datetime模块

Python的time和datetime模块

time

常用的有time.time()time.sleep()函数。

import time

print(time.time())
1499305554.3239055

上面的浮点数称为UNIX纪元时间戳,是从1970年1月1日0点起到今天经过的秒数。可以看到后面有6位小数,使用round函数,可以实现浮点数的四舍五入。如下

# 默认四舍五入到整数位,即不保留小数
print(round(time.time()))
# 可指定参数保留的小数位数
print(round(time.time(), 2))
1499305554
1499305554.49

time.sleep(sec)可以让当前休眠,参数填入秒(s)。

print('good')
time.sleep(5.5)
# 5.5秒后才打印这句
print('yes')
good
yes

其他一些函数的使用

# 返回UTC时间
print(time.gmtime())
# 返回本地时间,在中国就是UTC+8
print(time.localtime())
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=6, tm_hour=1, tm_min=46, tm_sec=0, tm_wday=3, tm_yday=187, tm_isdst=0)
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=6, tm_hour=9, tm_min=46, tm_sec=0, tm_wday=3, tm_yday=187, tm_isdst=0)

可以发现这是一个元组类型,中国所在时区位UTC+8,可以发现除了tm_hour不一样(它们相差了刚好+8),其余都一样。

下面的函数可以返回一个格式化的日期时间,看起来更加直观。

print(time.ctime())
print(time.asctime())
# 由于使用默认参数和上面的结果一样
print(time.ctime(time.time()))
print(time.asctime(time.localtime()))
Thu Jul  6 09:46:15 2017
Thu Jul  6 09:46:15 2017
Thu Jul  6 09:46:15 2017
Thu Jul  6 09:46:15 2017
  • ctime()可以传入一个时间戳,没有指定参数时,默认使用当前时间戳作为参数。即time.time()
  • gtime()可以传入一个struct_time,没有指定参数时,默认使用当前时间。即time.localtime()

struct_time转化为字符串及字符串转为struct_time

  • strptime的第一个参数是字符串形式的日期,第二个参数是自定义的日期转换格式。这两个参数的格式一定要对应。比如time.strptime('2017/7/6', '%Y-%m-%d')一个用了斜杠,一个用了短横线,就会报错。此函数返回一个struct_time
  • strftime的第一个参数是想要转化成的日期格式,第二个参数是一个struct_time,此函数将元组形式的struct_time转化成第一个参数指定的格式样子,返回的是转化后的日期字符串形式。

%Y-%m-%d表示年月日,在datetime模块会详细介绍。

a = time.strptime('2017/7/6', '%Y/%m/%d')
b = time.strftime('%Y-%m-%d', time.localtime())
print(a)
print(b)
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=6, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=187, tm_isdst=-1)
2017-07-06

测量程序的运行时间

使用时间戳可以方便地计时一段程序地运行时间

start_time = time.time()
sum = 0
for i in range(10000000):
    sum += 1

end_time = time.time()
print(end_time - start_time)
2.185124397277832

可以看到执行循环计算加法一千万次,那段程序花了2秒多。

也可以使用time.clock()函数

start = time.clock()
print(start)  # 2.6773594453225194e-06
time.sleep(2)
end = time.clock()
print(end - start)  # 差值代表了睡眠2秒的时间。2.000246763295544
time.sleep(3)
print(time.clock())  # 5.00058991153112,返回的是从第一次调用到这次调用的时间间隔
4.4622657422041984e-07
2.0026006084745567
5.013243112269714

可以看到clock第一次调用时比较奇怪,它返回的是进程运行的时间。之后再次调用都是与第一次调用clock的值的差了。即从第一次调用开始算起,到当前调用clock所经历的时间。
像上面一样,在想测试的一部分代码的上方设置start,结束的地方设置end,相减也能得到片段代码运行时间,而且比time.time()还要准确。

datetime

datetime模块用来管理日期和时间,其中有三个子模块。分别是time、date、datetime,所以想要使用datetime可以使用下面的导入方式。

from datetime import datetime
# 返回当前时间
now = datetime.now()
print(now.year, now.month, now.microsecond)

# 可以自定义参数,返回格式化后的时间
dt = datetime(2017, 10, 1, 23, 59, 59, 456123)
print(dt)
2017 7 719609
2017-10-01 23:59:59.456123

datetime接受7个参数,分别对应年、月、日、时、分、秒、微秒。分别保存在datetime的year、month、day、hour、minute、second、microsecond属性中。

由时间戳可以转换成datetime类型。如下,使用当前时间的时间戳。实际上等效于datetime.now()。当然反过来由datetime得到时间戳也是可以的。

# 时间戳转datetime
now = datetime.fromtimestamp(time.time())
print(now)
sometime = datetime(2017, 7, 5, 23, 59, 59)
# datetime转时间戳
print(sometime.timestamp())
2017-07-06 09:46:07.903769
1499270399.0

这些datetime对象可以使用><=符号来比较两个日期的先后。也可进行减运算,表示两个时刻的差值。比如

dt1 = datetime(2017, 5, 31)
dt2 = datetime(2017, 4, 1)
print(dt1 - dt2)
print(dt1 > dt2)
60 days, 0:00:00
True

timedelta表示一段时间

注意它不是表示一个时刻,而是一段时间。

import datetime

delta = datetime.timedelta(weeks=2, days=7, hours=1, seconds=59,microseconds=234353)
delta1 = datetime.timedelta(days=5, hours=2)

print(delta.seconds)  # 返回属性hours和seconds的和
print(delta.total_seconds()) # 只是以秒来表示这段时间
print(delta > delta1)
print(delta + delta1)
3659
1818059.234353
True
26 days, 3:00:59.234353

timedelta的接受的参数有weeks、days、hours、minutes、seconds、microseconds,但是其属性却只有days、seconds、microseconds。并且除了像datetime一样支持大小比较、减法运算外,还可以进行加法运算,表示两个时间段的差值

将datetime转化为字符串形式及字符串转为datetime对象

time模块也有这两个函数(见上面的例子),使用上比较累类似。

  • strptime按照指定格式将字符串形式的日期转换成datetime对象并返回。
  • strftime将一个datetime对象(比如now)根据指定的格式转换成字符串并返回。
from datetime import datetime

a = datetime.strptime('2017/7/6', '%Y/%m/%d')
b = datetime.now().strftime('%Y-%m-%d')
print(a)
print(b)
2017-07-06 00:00:00
2017-07-06

关于日期时间的格式,看下表。

格式指令 含义
%Y 带世纪的四位年份,如2017
%y 后两位年份,如17表示2017
%m 月份,从01到12
%B 完整的月份,如November
%b 月份的简写,如Nov
%d 一个月中的第几天,如从01到31(如果有的话)
%j 一年中的第几天
%w 一周中的第几天
%A 完整的周几,如Monday
%a 简写的周几,如Mon
%H 24小时制的小时00-23
%h 12小时制的小时01-12
%M 分,00-59
%S 秒,00-59
%p AM或者PM

by @ sunhaiyu

2017.7.6

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

推荐阅读更多精彩内容