python 时间处理
>
时间字符串
“YYYY-mm-dd HH:MM:SS ” ---> "2019-09-05 12:15:52"
时间字符串:不同语言对时间交互采用统一的时间字符串格式
时间作为生活中常见的对象,python 中有对应的包和数据类型来处理
为什么不只是字符串,因为时间是可以计算的,而字符串不行,
time
对人不友好的时间模块
休眠和时间戳
import time
time.sleep(5)# 程序休眠
In [9]: time.time()
Out[9]: 1602748716.9383907 # 返回当前时间的时间戳(1970纪元后经过的浮点秒数)
In [10]: type(time.time())
Out[10]: float
time 类型和字符串
time.localtime() 也可以理解为时间元组
import time
In [11]: time.localtime()
Out[11]: time.struct_time(tm_year=2019, tm_mon=10, tm_mday=15, tm_hour=16, tm_min=0, tm_sec=53, tm_wday=3, tm_yday=289, tm_isdst=0)
序号 | 字段 | 值 |
---|---|---|
0 | 4位数年 | 2008 |
1 | 月 | 1 到 12 |
2 | 日 | 1到31 |
3 | 小时 | 0到23 |
4 | 分钟 | 0到59 |
5 | 秒 | 0到61 (60或61 是闰秒) |
6 | 一周的第几日 | 0到6 (0是周一) |
7 | 一年的第几日 | 1到366 (儒略历) |
8 | 夏令时 | -1, 0, 1, -1是决定是否为夏令时的旗帜 |
上述也就是struct_time元组。这种结构具有如下属性:
序号 | 属性 | 值 |
---|---|---|
0 | tm_year | 2008 |
1 | tm_mon | 1 到 12 |
2 | tm_mday | 1 到 31 |
3 | tm_hour | 0 到 23 |
4 | tm_min | 0 到 59 |
5 | tm_sec | 0 到 61 (60或61 是闰秒) |
6 | tm_wday | 0到6 (0是周一) |
7 | tm_yday | 1 到 366(儒略历) |
8 | tm_isdst | -1, 0, 1, -1是决定是否为夏令时的旗帜 |
时间元组转字符串
In [14]: localtime = time.asctime( time.localtime(time.time()) )
In [15]: localtime
Out[15]: 'Thu Oct 15 16:05:07 2019'
转成时间字符串格式
In [19]: time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
Out[19]: '2019-10-15 16:09:04'
python中时间日期格式化符号:
- %y 两位数的年份表示(00-99)
- %Y 四位数的年份表示(000-9999)
- %m 月份(01-12)
- %d 月内中的一天(0-31)
- %H 24小时制小时数(0-23)
- %I 12小时制小时数(01-12)
- %M 分钟数(00-59)
- %S 秒(00-59)
- %a 本地简化星期名称
- %A 本地完整星期名称
- %b 本地简化的月份名称
- %B 本地完整的月份名称
- %c 本地相应的日期表示和时间表示
- %j 年内的一天(001-366)
- %p 本地A.M.或P.M.的等价符
- %U 一年中的星期数(00-53)星期天为星期的开始
- %w 星期(0-6),星期天为星期的开始
- %W 一年中的星期数(00-53)星期一为星期的开始
- %x 本地相应的日期表示
- %X 本地相应的时间表示
- %Z 当前时区的名称
- %% %号本身
datetime
基于time更友好更精确的包
datetime 下有这些类型供我们使用:
date,time,datetime,timedelta
date
一个理想化的简单型日期,它假设当今的公历在过去和未来永远有效。 属性: year
, month
, and day
time
一个独立于任何特定日期的理想化时间,它假设每一天都恰好等于 246060 秒。 (这里没有“闰秒”的概念。) 包含属性: hour
, minute
, second
, microsecond
和 tzinfo
。
datetime
日期和时间的结合。属性:year
, month
, day
, hour
, minute
, second
, microsecond
, and tzinfo
.
timedelta
表示两个 date
对象或者 time
对象,或者 datetime
对象之间的时间间隔,精确到微秒。
正如前面所说这些类型是方便我们计算时间使用的
In [23]: datetime.datetime.now() # 其中datetime是最常用的
Out[23]: datetime.datetime(2019, 10, 15, 16, 18, 52, 522037)
In [24]: type(datetime.datetime.now())
Out[24]: datetime.datetime
In [25]: datetime.datetime.now().date()
Out[25]: datetime.date(2020, 10, 15)
In [26]: type(datetime.datetime.now().date())
Out[26]: datetime.date
In [27]: type(datetime.datetime.now().time())
Out[27]: datetime.time
In [28]: datetime.datetime.now().time()
Out[28]: datetime.time(16, 20, 36, 312351)
In [30]: str(datetime.datetime.now()).split('.')[0] # 可以直接转时间字符串格式
Out[30]: '2019-10-15 16:26:06'
时间字符串转时间类型
In [36]: datetime.datetime.strptime( '2019-10-15 16:26:06', '%Y-%m-%d %H:%M:%S')
Out[36]: datetime.datetime(2019, 10, 15, 16, 26, 6)
In [38]: datetime.datetime.strptime( '2019-10-15 16:26:06.122', '%Y-%m-%d %H:%M:%S.%f') # 带小数的秒
Out[38]: datetime.datetime(2019, 10, 15, 16, 26, 6, 122000)
计算
In [46]: '2019-10-15 16:26:06.122' - '2019-10-15 16:26:06.12'
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-46-5719f8af5c58> in <module>
----> 1 '2019-10-15 16:26:06.122' - '2019-10-15 16:26:06.12'
TypeError: unsupported operand type(s) for -: 'str' and 'str'
# 毫无疑问 字符串是没有减法的 ,不过可以比较大小
In [53]: '2019-10-15 16:26:06.55' >'2019-10-15 16:26:06'
Out[53]: True
a = datetime.datetime.strptime( '2019-15 16:26:06.122', '%Y-%m-%d %H:%M:%S.%f')
In [51]: b = datetime.datetime.strptime( '2019-10-15 16:26:06', '%Y-%m-%d %H:%M:%S')
In [52]: a-b
Out[52]: datetime.timedelta(microseconds=122000)
超级简单的时间计算
In [59]: delta = datetime.timedelta(
...:
...: days=50,
...: seconds=27,
...: microseconds=10,
...: milliseconds=29000, minutes=5,
...: hours=8,
...: weeks=2
...: )
In [60]: delta
Out[60]: datetime.timedelta(days=64, seconds=29156, microseconds=10)
一百天后是何年何月何日几时几分几秒
In [60]: delta
Out[60]: datetime.timedelta(days=64, seconds=29156, microseconds=10)
In [61]: datetime.datetime.now()+delta
Out[61]: datetime.datetime(2019, 12, 19, 0, 49, 22, 316316)