python中的时间与日期

最近在工作中用到在写入数据库数据时需要指定时间的问题,数据库中的时间格式是确定的,写入数据时也需要指定对应的时间格式,并且是str类型的,对于某些特殊数据也有加减特定天或者分钟的需求,实际使用过程中遇到很多问题,遂对python中的时间与日期相关的知识做个整理。

基本库

python中常用的两个时间库分别为time和datetime,time提供操作各种时间的函数和常量,datetime是一个使用面向对象编程设计的模块,它定义了几个表示日期和时间的类

time库

时间元组

Python时间函数将时间处理为9个数字的元组,各个索引所代表的字段及取值范围如下所示:
| 索引 | 字段 | 含义 | 值范围 |
|:—-|:—-|:—-|:—-|
| 0 | tm_year | 4位数,表示年份 | 2018,2019… |
| 1 | tm_mon | 月份 | [1-12] |
| 2 | tm_mday | 日期 | [1-31] |
| 3 | tm_hour | 小时 | [0-23] |
| 4 | tm_min | 分钟 | [0-59] |
| 5 | tm_sec | 秒 | [0-60] |
| 6 | tm_wday | 星期几 | [0-6] |
| 7 | tm_yday | 一年的第几天 | [1-366] |
| 8 | tm_isdst | 夏令时 | 1,0,1,-1是决定是否为夏令时的flag |

获取时间元组

1
2
>>time.localtime()
time.struct_time(tm_year=2019, tm_mon=2, tm_mday=23, tm_hour=8, tm_min=35, tm_sec=33, tm_wday=5, tm_yday=54, tm_isdst=0)

时间戳

时间戳表示的是从1970年1月1日开始按秒计算的偏移量(time.gmtime(0))此模块中的函数无法处理1970纪元年以前的时间或太遥远的未来(处理极限取决于C函数库,对于32位系统而言,是2038年)
获取当前时间戳

1
2
>>time.time()
1550882299.8993332

时间格式化符号

格式化符号 含义 范围
%y 两位数的年份表示 [0-99]
%Y 四位数的年份 [000-9999]
%m 月份 [01-12]
%d 日期 [1-31]
%H 24小时制的小时 [0-23]
%I 12小时制的小时 [0-12]
%M 分钟数 [00-59]
%S [00-59]
%a 本地简化星期的名称
%A 本地完整星期的名称
%b 本地简化月份的名称
%B 本地完整月份的名称
%c 本地相应的日期表示和时间表示
%j 年内的一天 [0-366]
%p 本地A.M和P.M的等价符
%U 一年中的星期数,星期天开始计算 [0-53]
%u 星期,星期天为开始 [0-6]
%W 一年中的星期数,星期一开始计算 [0-53]
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称

常用函数和属性

  • time.altzone
    返回格林威治西部的夏令时地区的偏移秒数,如果该地区在格林威治东部会返回负值(如西欧,包括英国),对夏令时启用地区才能使用
  • time.asctime([t])
    接受时间元组并返回一个可读的形式”Tue May 30 17:17:30 2017”(2017年5月30日周二17时17分30秒)的24个字符的字符串
  • time.clock()
    用以浮点数计算的秒数返回当前的CPU时间,用来衡量不同程序的耗时,比time.time()更有用,python3.3以后不被推荐使用,该方法依赖操作系统,建议使用perf_counter(返回系统运行时间)或process_time(返回进程运行时间)代替
  • time.ctime([secs])
    作用相当于asctime(localtime(secs)),未给参数相当于asctime()
  • time.gmtime([secs])
    接收时间辍(1970纪元年后经过的浮点秒数)并返回格林威治天文时间下的时间元组t(t.tm_isdst始终为0)
  • time.daylight
    如果夏令时被定义,则该值为非零
  • time.localtime([secs])
    接收时间辍(1970纪元年后经过的浮点秒数)并返回当地时间下的时间元组t(t.tm_isdst可取为0或1,取决于当地当时是不是夏令时)
  • time.mktime(t)
    接受时间元组并返回时间辍(1970纪元年后经过的浮点秒数)
  • time.perf_counter()
    返回计时器的精准时间(系统的运行时间),包含整个系统的睡眠时间.由于返回值的基准点是未定义的,所以,只有连续调用的结果之间的差才是有效的
  • time.process_time()
    回当前进程执行CPU的时间总和,不包含睡眠时间.由于返回值的基准点是未定义的,所以只有连续调用的结果之间的差才是有效的
  • time.sleep(secs)
    迟调用线程的运行,secs的单位是秒
  • time.strftime(format[,t])
    把一个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串.如果t未指定,将传入time.localtime(),如果元组中任命一个元素越界,将会抛出ValueError异常
  • time.strptime(string[,format])
    把一个格式化时间字符串转化为struct_time,实际上它和strftie()是逆操作
  • time.time()
    返回当前时间的时间戳(1970元年后的浮点秒数)
  • time.timezone()
    是当地时区(未启动夏令时)距离格林威治的偏移秒数(美洲>0,欧洲大部分,亚洲,非洲<=0)
  • time.tzname
    包含两个字符串的元组,第一是当地夏令时区的名称,第二是当地的DST时区的名称

    datetime库

    模块

  • datetime.date:表示日期的类,可以对日期进行操作
  • datetime.datetime:表示时间的类,可单独对时间进行操作
  • datetime.time:表示时间的类
  • datetime.timedelta:表示时间间隔,即两个时间点的间隔
  • datetime.tzinfo:时区的相关信息

    常用函数和属性

    datetime.date类
  • datetime.date(year, month, day) # 初始化一个date对象
    1
    2
    >>> datetime.date(2019,12,10)
    datetime.date(2019, 12, 10)
  • datetime.date.today() # 以当前年、月、日 初始化一个date对象
    1
    2
    >>> datetime.date.today()
    datetime.date(2019, 2, 24)
  • datetime.date strftime(format) # 格式化日期,时分秒均默认为0
    1
    2
    3
    >>> format = "%Y-%m-%d %H:%M:%S"
    >>> datetime.date.today().strftime(format)
    '2019-02-24 00:00:00'
  • datetime.date timetuple() # 转成时间元组格式
    1
    2
    >>> datetime.date.today().timetuple()
    time.struct_time(tm_year=2019, tm_mon=2, tm_mday=24, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=55, tm_isdst=-1)
  • datetime.date replace(year=?, month=?, day=?) # 返回一个替换后的date对象
    1
    2
    >>> datetime.date.today().replace(month=1)
    datetime.date(2019, 1, 24)
  • datetime.date.formattimestamp() #将时间戳转化为date对象
    1
    2
    >>> datetime.date.fromtimestamp(time.time())
    datetime.date(2019, 2, 24)

datetime.time类

  • datetime.time(hour, minute, second, mircoecond) #初始化一个time对象
    1
    2
    >>> datetime.time(8,12,20,20)
    datetime.time(8, 12, 20, 20)
  • datetime.time strftime() #格式化日期,转为str,年月日默认为时间戳元年
    1
    2
    >>> datetime.time(8,12,20,20).strftime(format)
    '1900-01-01 08:12:20'
    datetime.datetime类所包含的方法和属性与datetime.date和datetime.time类包含的类似,用法也相似,这里就不再赘述
  • datetime.datetime(year, month, day, hour, minute, second, mircosecond)
  • datetime.datetime.now([tz]) #当不指定时区时,和datetime.datetime.today()是一样的结果,如下
  • datetime.datetime.strftime(format) #格式化为需要的时间,如常用的 “年-月-日 小时:分钟:秒” 格式
  • datetime.datetime.timtuple() #转成struct_time格式,这样传递给time.mktime(t) 后,直接转成时间戳格式
  • datetime.datetime.replace(year, month, day) #返回一个替换后的date对象
  • datetime.datetime.fromtimestamp(timestamp) #将时间戳转化为datetime对象

datetime.timedelta类
datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
主要用于计算时间间隔一定时间的时间值,比如举例今日7天前的时间为:

1
2
>>> datetime.datetime.today()-datetime.timedelta(days=7)
datetime.datetime(2019, 2, 17, 21, 44, 28, 282900)

时间的转换

时间戳转换为时间元组

1
time.localtime(timestamp)

时间元祖转换为时间戳

1
time.mktime(struct_time)

str转时间元组

使用strptime(str, format)方法

1
2
3
>>>format = "%Y-%m-%d %H:%M:%S"
>>>time.strptime('2019-02-24 00:00:00', format)
time.struct_time(tm_year=2019, tm_mon=2, tm_mday=24, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=55, tm_isdst=-1)

时间元组转str

使用strftime(format, timetuple)

1
2
3
>>>format = "%Y-%m-%d %H:%M:%S"
>>> time.strftime(format, time.localtime())
'2019-02-24 21:54:53'

时间戳转成str

先使用time.localtime(timestamp)将时间戳转成时间元组,再使用time.strftime(format,timetuple)转成str即可

str转为时间戳

先使用time.strptime(str, format)将str转为时间元组,再使用time.mktime(timetuple)将时间元组转为时间戳

时间增加某几天或者减少某几天

使用datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0),可以增加或者减少对应的天、小时、分、秒等

时间大小的比较

将时间统一转换为str或者时间戳,或者时间元组进行比较

-

投食