我走过山的时候山不说话,我路过海的时候海不回答
在 Python 使用过程中我们经常会遇到时间格式转换的问题,例如:
看到这些时间之间的来回转换,你是否有点不知所措?
不用担心,Python 中提供了对时间日期的多种多样的处理方式,主要是在 time
,datetime
,timedelta
这三个模块中,今天稍微整理一下这两个模块在使用上的一些区别和联系。
在 Python 文档中,time
是归类在 Generic Operating System Services
。也就是说,它提供的功能更加接近于操作系统层面的,通过文档可知,time 模块是围绕着 Unix Timestamp
进行的。
需要注意的是该模块中的大多数函数调用了所在平台 C library
的同名函数,所以部分函数在不同的平台下可能会有不同的效果。
time.time()
获取浮点数格式的秒数时间戳
虽然此函数通常返回非递减值,但如果两次调用之间修改了系统时间,则它可以返回比先前调用更低的值
>>> time.time()
1607842980.365472
time.gmtime([timestamp])
将秒级时间戳转换为 UTC 的 时间元组
若未提供 timestamp 或为 None, 则默认使用
time()
所返回的时间
>>> time.gmtime(time.time())
time.struct_time(tm_year=2020, tm_mon=12, tm_mday=13, tm_hour=7, tm_min=4, tm_sec=7, tm_wday=6, tm_yday=348, tm_isdst=0)
time.localtime([timestamp])
与 gmtime()
相似但转换为当地时间
>>> a = 1607843214
>>> time.gmtime(a)
time.struct_time(tm_year=2020, tm_mon=12, tm_mday=13, tm_hour=7, tm_min=6, tm_sec=54, tm_wday=6, tm_yday=348, tm_isdst=0)
>>> time.localtime(a)
time.struct_time(tm_year=2020, tm_mon=12, tm_mday=13, tm_hour=15, tm_min=6, tm_sec=54, tm_wday=6, tm_yday=348, tm_isdst=0)
time.mktime(t)
将时间元组转换为秒级浮点时间戳
localtime()
的反函数。参数为 完整的时间元组,表示 local 时间,而不是 UTC。
>>> t = time.localtime(time.time())
>>> time.mktime(t)
1607814414.0
time.strftime(format[, t])
将时间元组格式化为时间字符串
如果为提供 t,则使用由 localtime() 返回的当前时间
>>> time.strftime('%x %X')
12/13/20 15:53:59
time.strptime(string[, format])
将字符串转换为时间元组
>>> time.strptime('2020-12-12 15:55:21', '%Y-%m-%d %H:%M:%S')
time.struct_time(tm_year=2020, tm_mon=12, tm_mday=12, tm_hour=15, tm_min=55, tm_sec=21, tm_wday=5, tm_yday=347, tm_isdst=-1)
时间元组 (struct_time)
共有九个元素(年,月,日,时,分,秒,一周的第几日,一年中的第几天,夏令时)
属性 | 描述 | 值 |
---|---|---|
tm_year | 年 (4位数) | 2020 |
tm_mon | 月 | 1 - 12 |
tm_mday | 日 | 1 - 31 |
tm_hour | 小时 | 0 - 23 |
tm_min | 分钟 | 0 - 59 |
tm_sec | 秒 | 0 - 61 ( 60,61为闰秒 ) |
tm_wday | 一周第几日 | 0 - 6 ( 0 为周一 ) |
tm_yday | 一年第几日 | 1 - 366 |
tm_isdst | 夏令时 | -1, 0, 1 (-1是决定是否为夏令时的旗帜) |
格式化时间字符串(Format String)
格式 | 描述 | 示例值 |
---|---|---|
%y | 两位数年份表示 | 00 - 99 |
%Y | 四位数年份表示 | 0000 - 9999 |
%m | 月份 | 01 - 12 |
%d | 月内某一天 | 0 - 31 |
%H | 24小时制小时数 | 0 - 23 |
%I | 12小时制小时数 | 01 - 12 |
%M | 分钟数 | 00 - 59 |
%S | 秒 | 00 - 59 |
%a | 简化的星期名称 | Sun |
%A | 完整的星期名称 | Sunday |
%b | 简化的月份名称 | Dec |
%B | 完整的月份名称 | December |
%c | 本地的日期和时间表示 | Sun Dec 13 15:42:21 2020 |
%j | 年内的一天 | 348 |
%p | 本地化的 AM 或 PM | PM |
%U | 一年中的星期数(星期日为星期的开始) | 00 - 53 |
%w | 星期(星期日为星期的开始) | 0 - 6 |
%W | 一年中的星期数(星期一为星期的开始) | 00 - 53 |
%x | 本地相应的日期表示 | 12/13/20 |
%X | 本地相应的时间表示 | 15:42:21 |
%% | % 号本身 | % |
datetime 比 time 高级了不少,可以理解为 datetime 基于 time 进行了封装,提供了更多使用的函数。在 datetime 模块中包含了一下几个类:
object
timedelta # 用于计算时间间隔
tzinfo # 时区相关
time # 只关注时间
date # 只关注日期
datetime # 时间和日期组合
实际应用中,使用较多的是 datetime.datetime
和 datetime.timedelta
,date
和 time
与 datetime
并无太大区别
类属性 | 描述 | 值 |
---|---|---|
datetime.min | datetime 对象实例能表示的最小的日期时间 | datetime.datetime(1, 1, 1, 0, 0) |
datetime.max | datetime 对象实例能表示的最大的日期时间 | datetime.datetime(9999, 12, 31, 23, 59, 59, 999999) |
实例属性 | 描述 | 值 |
---|---|---|
year | datetime 对象的年份 | 2020 |
month | 月份 | 12 |
day | 天 | 13 |
hour | 小时 | 17 |
minute | 分钟 | 9 |
second | 秒 | 12 |
microsecond | 毫秒 | 588919 |
class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
构造器
year, month, day 参数是必须的。其余参数必须是下面范围内的整数:
datetime.today()
返回当前本地日期时间的的 datetime 对象
>>> from datetime import datetime
>>> datetime.today()
datetime.datetime(2020, 12, 13, 16, 36, 51, 864575)
datetime.now(tz=None)
返回当前本地日期时间的 datetime 对象,与 datetime.today() 类似
>>> datetime.now()
datetime.datetime(2020, 12, 13, 16, 39, 6, 274263)
datetime.utcnow()
返回当前 UTC 日期时间
>>> datetime.utcnow()
datetime.datetime(2020, 12, 13, 8, 40, 19, 881473)
datetime.fromtimestamp(timestamp,tz=None)
返回时间戳以你的本地日期和时间
>>> datetime.fromtimestamp(time.time())
datetime.datetime(2020, 12, 13, 16, 41, 45, 421366)
datetime.strptime()
字符串转 datetime 对象
>>> datetime.strptime('2020-12-13 16:45:21', '%Y-%m-%d %H:%M:%S')
datetime.datetime(2020, 12, 13, 16, 45, 21)
datetime.date()
返回与 datetime
对象实例有相同的 year、month 和 day 属性的 date
对象实例
>>> d = datetime.now()
>>> d.date()
datetime.date(2020, 12, 13)
datetime.time()
返回与 datetime
对象实例有相同的 hour、minute、second、microsecond、fold 属性的 time
对象实例,并且 tzinfo 属性为None
>>> d = datetime.now()
>>> d.time()
datetime.time(16, 49, 22, 878530)
datetime.replace(*args, **kwargs)
返回由指定的关键字参数替换 datetime
对象实例中同名属性值后的新的 datetime
对象实例
>>> d = datetime.now()
>>> d.replace(year=2019)
datetime.datetime(2019, 12, 13, 16, 51, 11, 271730)
datetime.timetuple()
将 datetime 转换为 time.struct_time (时间元组)
等价于 time.struct_time((d.year, d.month, d.day, d.hour, d.minute, d.second, d.weekday(), yday, -1))
>>> d = datetime.now()
>>> d.timetuple()
time.struct_time(tm_year=2020, tm_mon=12, tm_mday=13, tm_hour=16, tm_min=54, tm_sec=30, tm_wday=6, tm_yday=348, tm_isdst=-1)
datetime.timestamp()
返回 datetime
实例对应的时间戳,返回值为类似 time.time()
的浮点数
>>> d = datetime.now()
>>> d.timestamp()
1607849839.759806
datetime.weekday()
返回当前日期在一周内的序号,周一为 0
>>> d = datetime.now()
>>> d.weekday()
6
datetime.isocalendar()
返回一个包含给定日期时间对象的 ISO year、ISO week number 和 ISO weekday 的三元组
>>> d = datetime.now()
>>> d.isocalendar()
(2020, 50, 7)
datetime.strftime(format)
datetime 实例转字符串
>>> d = datetime.now()
>>> d.strftime('%Y-%m-%d %H:%M:%S')
'2020-12-13 17:02:29'
datetime2 = datetime1 + timedelta
datetime2 = datetime1 - timedelta
timedelta = datetime1 - datetime2
datetime1 < datetime2
timedelta
对象表示两个日期或时间之间的间隔
datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
所有参数都是可选的并且默认为 0,这些参数可以是整型或者浮点型,也可是整数或者负数
只有 days
, seconds
, microseconds
会存储在内部。参数单位的换算规则如下:
并且 days
, seconds
, microseconds
会经过标准化处理保证表达方式的唯一性
0 <= microseconds < 1000000
0 <= seconds < 3600*24
(一天的秒数)-999999999 <= days <= 999999999
form datetime import timedelta
>>> delta = timedelta(
... days=50,
... seconds=10,
... microseconds=29000,
... minutes=5,
... hours=8,
... weeks=2
... )
>>> delta
datetime.timedelta(days=64, seconds=29110, microseconds=29000)
timedelta.total_seconds()
返回时间间隔包含了多少秒
时间间隔较大时,这个方法的结果中的微秒将会失真(大多数平台上大于270年视为一个较大的时间间隔)
>>> delta = timedelta(weeks=10000)
>>> delta.total_seconds()
6048000000.0
运算 | 结果 |
---|---|
t1 = t2 + t3 | t2 和 t3 的和 |
t1 = t2 - t3 | t2 减 t3 的差 |
t1 = t2 * i | 乘以一个整数 |
t1 = t2 * f | 乘以一个浮点数,结果会被舍入到 timedelta 最接近的整数倍(精度使用四舍五偶入奇不入) |
f = t2 / t3 | 两个时间间隔相除,返回一个 float 对象 |
t1 = t2 / f | 除以一个 浮点数 或者整数,结果会被舍入到 timedelta 最接近的整数倍 |
t2 // i or t2 // t1 | 整除一个浮点数 或者 timedelta 对象 |
t2 % t3 | 余数为一个 timedelta 对象 |
+t1 | 返回一个相同的 timedelta 对象 |
-t1 | 等价于 timedelta(-t1.days, -t1.seconds, -t1.microseconds) |
abs(t) | 当 t.days >= 0 时等于 +t , 当 ``t.days < 0时等于 -t` |
str(t) | '0:00:03' or '-1 day, 23:59:57' |
repr(t) | 'datetime.timedelta(seconds=3)' |