首页 ¦ 归档

Python时间处理完全手册

作者:gw1770df

处理时间是工作中非常常见的操作,最基本的获取当前时间,格式化时间,计算两个时间差,时间戳转换等等. Python内置两个非常常用的时间处理库 timedatetime,足以满足工作中的各种需求。 datetime 功能更加强大, time 库就较为简练一些。 两个库互补使用,所有问题迎刃而解。

官方文档Py2.7 datetimetime

== 注意time 或者 datetime 库需要提前import ==

WIKI: 时间戳 UNIX时间 各地日期和时间表示法 时区

1. 获取并格式化时间

使用time模块获取当前时间

print time.strftime('%Y-%m-%d %H:%M:%S')
# Out: '2016-12-01 16:10:27'

使用datetime模块获取当前日期和当前时间

# 获取当前日期
today = datetime.date.today()
print today.strftime('%Y-%m-%d')
# Out: '2016-12-01'  # 获取当前日期

now = datetime.datetime.now()
print now.strftime('%Y-%m-%d %H:%M:%S')
# Out: '2016-12-01 16:14:22' # 获取当前日期时间

2. 转换时间格式

例如我们拿到了一个时间字符串 161201 16:14:22 需要将其转换成其他格式。

struct_time = time.strptime('161201 16:14:22', '%y%m%d %H:%M:%S')
# struct_time 为一个时间元组对象
print time.strftime('%Y-%m-%d %H:%M:%S', struct_time)
# Out: '2016-12-01 16:14:22'
dt = datetime.datetime.strptime('161201 16:14:22', '%y%m%d %H:%M:%S')
# dt 为 datetime.datetime对象  # 通过调用 timetuple()方法将datetime.datetime对象转化为时间元组
print dt.strftime('%Y-%m-%d %H:%M:%S')
# Out: '2016-12-01 16:14:22'

3. 计算两个时间间隔

计算时间间隔使用datetime模块比较方便。 datetime.date为日期对象,最小精度为天。 datetime.datetime为日期时间对象,最小精度为妙(毫秒也可以) 实际使用中按需选择。

  1. 计算2016-12-1和1990-1-1中间天数和秒数 # 将字符串转换为datetime.date对象 dt_a = datetime.datetime.strptime('2016-12-1', '%Y-%m-%d') # datetime.date 无 strptime 方法 dt_b = datetime.datetime.strptime('1990-1-1', '%Y-%m-%d') # 虽然格式化时间的时候%m为两位数月份 # 但是反格式化时一位月份也可工作 dt = dt_a - dt_b dt.days # 为 间隔天数 dt.total_seconds() # 为 间隔秒数

dt = datetime.date(2016,12,1) - datetime.date(1990,1,1) dt.days # 间隔天数

  1. 计算两个时间戳间隔时间 timestamp_a, timestamp_b = 1480582517, 1480472517 dt = datetime.datetime.fromtimestamp(timestamp_a) - datetime.datetime.fromtimestamp(timestamp_b) print dt.days, dt.total_seconds() # Out: 1 110000.0

4. 获取前N天,或者后N天时间

datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

now = datetime.datetime.now()
before_time = now - datetime.timedelta(days=1)
after_time = now + datetime.timedelta(days=1)
print before_time
# Out: 2016-11-30 17:03:40.420000
print after_time
# Out: 2016-12-02 17:03:40.420000

5. 时间戳相关计算

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。 通过时间戳可以快速直接得到很多信息

ts = int(time.time()) # ts = 1480583196
print ts / 86400 % 7 + 3 # 获取时间戳对应的星期 0 周日 - 6 周六
# Out: 3 # 周四
# ===============
timestamp_a, timestamp_b = 1480582517, 1480472517
ts = timestamp_a - timestamp_b
print ts / 86400 # 获取两个时间戳相隔天数
# ===============
# 获取当天00:00:00的时间戳
ts = int(time.time())
print ts / 86400 * 86400
# Out: 1480550400
# ===============
# 获取当天23:59:59的时间戳
ts = int(time.time())
print ts / 86400 * 86400 + 86400 - 1
# Out: 1480636799

个人认为时间戳才是最有魅力的

6. 各种数据类型间转换

  1. str > datetime.datetime datetime.datetime.strptime('161201 16:14:22', '%y%m%d %H:%M:%S')

  2. str > 时间元组 dt = datetime.datetime.strptime('161201 16:14:22', '%y%m%d %H:%M:%S') dt.timetuple() # or struct_time = time.strptime('161201 16:14:22', '%y%m%d %H:%M:%S')

  3. 时间戳 > datetime.datetime 或 datetime.date datetime.datetime.fromtimestamp(时间戳) # or datetime.date.fromtimestamp(时间戳)

  4. 时间戳 > 时间元组 time.gmtime(时间戳)

  5. 时间元组 > 时间戳 time.mktime(时间戳)

  6. 时间元组 > datetime.datetime 或 datetime.date datetime.datetime.fromtimestamp(time.mktime(时间元组)) # or datetime.date.fromtimestamp(time.mktime(时间元组))

  7. 时间戳 > 时间元组 time.gmtime(时间戳) # or dt = datetime.datetime.fromtimestamp(时间戳) dt.timetuple()

格式化与反格式化控制字符对照表

字符 含义 例子
%a 当地格式的星期缩写 Sun,Mon...Sat(en_US);So,Mo...Sa(de_DE)
%A 当地格式的星期全拼 Sunday,Monday...Saturday(en_US);Sonntag,Montag...Samstag(de_DE)
%w 星期的数字表示0表示周日,6表示周六 0,1...6
%d 日,当月第几天,两位数 01,02...31
%b 当地格式的月份缩写 Jan,Feb...Dec(en_US);Jan,Feb...Dez(de_DE)
%B 当地格式的月份全拼 January, February,...,December(en_US);Januar,Februar...Dezember(de_DE)
%m 月份的数字表示,两位数 01,02...12
%y 年份表示,不带世纪,两位数 00,01...99
%Y 年份表示 1970,1971...2016
%H 小时 0-23 00,01...23
%I 小时 01-12 01,02...12
%p 当地格式的上午下午表示 AM,PM(en_US);am,pm(de_DE)
%M 分钟,两位数 00,01...59
%S 秒,两位数 00,01...59
%f 微妙,六位数 000000,000001...999999
%z 时区偏移量,表示为+HHMM或-HHMM或空 (空),+0000,-0400,+0800
%Z 时区名字 (空),UTC, EST, CST
%j 日,当年第几天,三位数 001,002...366
%U 周,在年第几周,周日为一周的第一天,新年第一个星期日第0周,两位数 00,01...53
%W 周,在年第几周,周一为一周的第一天,新年第一个星期一第0周,两位数 00,01...53
%c 当地格式的时间日期表示 Tue Aug 16 21:30:00 1988 (en_US);Di 16 Aug 21:30:00 1988 (de_DE)
%x 当地格式的日期表示 08/16/88 (None);08/16/1988 (en_US);16.08.1988 (de_DE)
%X 当地格式的时间表示 21:30:00 (en_US);21:30:00 (de_DE)
%% %字符 %

© PyCN技术评论. Built using Pelican. Theme by Giulio Fidente on github.