python 时间处理


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, microsecondtzinfo

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)