No results found

Python日期时间操作总结

本文主要介绍Ptyhon 3中datetime, time模块相关函数用法及常用操作。datetime模块主要是用来表示日期的,就是我们常说的年月日时分秒,time模块主要侧重点在时分秒。

时间相关概念

epoch

假设我们要将时间表示成毫秒数,比方说1000000毫秒,那有一个问题必须解决,这个1000000毫秒的起点是什么时间,也就是我们的时间基准点是什么时间?好比我说你身高1.8米,那这个身高是指相对于你站立的地面说的。这个时间基准点就是epoch,在Unix系统中,这个基准点就是1970年1月1日0点整那个时间点。

GMT, UTC

上面我们说epoch表示1970年的起始点,那这个1970年又是相对于哪个基准时间呢?一般来说,就是相对于格林尼治时间,也叫做GMT(Greenwich Mean Time)时间,还叫做UTC(Coordinated Universal Time),为啥一个时间基准有两个名字?历史上,先有的GMT,后有的UTC.UTC是我们现在用的时间标准,GMT是老的时间计量标准。UTC是根据原子钟来计算时间,而GMT是根据地球的自转和公转来计算时间。所以,可以认为UTC是真正的基准时间,GMT相对UTC的偏差为0。在实际中,我们的计算机中有一个硬件模块RCT,里面会实时记录UTC 时间,该模块有单独的电池供电,即使关机也不影响。有了epoch这个时间基准,又有了UTC这个基准的基准,我们就可以精确地表示一个时间了。

DST, tzoneDST, tzone

尽管我们已经可以精确地表示一个时间,很多情况下,我们还是要根据地区实际情况对时间进行一个调整,最常见的就是时区,tzone,相信大家都比较熟悉。此时,当我们说5点5分这个时间时,还需加上是哪个时区的5点5分才能精确说明一个时间。另外一个对时间做出调整的就是DST.DST 全称是Daylight Saving Time,是说,为了充分利用日光,减少用电,人为地对时间做出一个调整,这取决于不同国家和地区的政策法规。比如说,假设你冬天7点天亮起床,但夏天6点天亮,那么在夏天到来时人为将时间加1个小时,这样就可以让你还是觉得7点起床,但实际上是提前一个小时了。

time模块

获取时间

time()方法获取当前时间距离epoch的秒数,用的是UTC时间,这个函数没有参数。

1
2
3
import time
t = time.time()
#结果:1553614051.5006864

时间转换

将上面的秒数转换为年月日时分秒的形式,可以用time. gmtime()time.localtime()方法。两个函数返回的都是struct_time类的实例。

1
2
3
4
5
time.gmtime()
#结果:time.struct_time(tm_year=2019, tm_mon=3, tm_mday=26, tm_hour=15, tm_min=35, tm_sec=9, tm_wday=1, tm_yday=85, tm_isdst=0)
#
time.localtime()
#结果:time.struct_time(tm_year=2019, tm_mon=3, tm_mday=26, tm_hour=23, tm_min=37, tm_sec=15, tm_wday=1, tm_yday=85, tm_isdst=0)

如果要将上述元组形式的时间转换成秒数,可以用time.mktime()方法。

1
2
3
now_struct = time.localtime()
time.mktime(now_struct)
#结果:1553615106.0

将时间的元组转换为字符串形式,可以用time.strftime(),将特定格式的时间转成时间元组格式用time.strptime()方法。

1
2
3
4
5
6
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
time.strftime("%Y-%m-%d %H:%M:%S") #等效,默认是当前时间
#结果:'2019-03-26 23:52:32'
#
time.strptime('2019-03-26 11:56:21','%Y-%m-%d %H:%M:%S')
#结果:time.struct_time(tm_year=2019, tm_mon=3, tm_mday=26, tm_hour=11, tm_min=56, tm_sec=21, tm_wday=1, tm_yday=85, tm_isdst=-1)

time.asctime()time.ctime()方法则会将时间转换为标准24字符的字符串,前者参数是时间元组,后者参数是秒数。

1
2
3
4
5
6
now_struct = time.localtime()
time.asctime(now_struct)
#结果:'Wed Mar 27 00:03:07 2019'
#
time.ctime(time.time())
#结果:'Wed Mar 27 00:03:07 2019'

下图可以比较清楚的描述时间秒数、时间元组、字符串之间的转换关系。

time时间转换

datetime模块

time模块解决了时间的获取和表示,datetime模块则进一步解决了快速获取并操作时间中的年月日时分秒信息的能力。
简单说,该模块核心的类就三个,date类表示年月日,time类表示时分秒毫秒,这里不要和time模块搞混淆了。请记住一点,date中是没有时区信息的。

对象创建

常用datetime.today()datetime.now()方法创建当前时区的对象。datetime.fromtimestamp()方法接收秒数参数。如果要获得utc的datetime对象,使用datetime. utcfromtimestamp()、datetime. utcnow()方法。

1
2
3
4
5
6
7
8
9
10
import datetime
#
datetime.datetime.fromtimestamp(time.time())
#
datetime.datetime.today()
datetime.datetime.now()
#结果:datetime.datetime(2019, 3, 27, 0, 9, 18, 312810)
datetime.datetime. utcnow()
#结果:datetime.datetime(2019, 3, 26, 16, 12, 22, 71628)

以特定格式字符串创建,使用datetime.strptime()方法。给定时间元组也可以创建datetime对象。

1
2
3
4
5
datetime.datetime.strptime('2015-6-1 18:19:59','%Y-%m-%d %H:%M:%S')
#结果:datetime.datetime(2015, 6, 1, 18, 19, 59)
#
datetime.datetime(2015, 4, 19, 12, 20)
#结果:datetime.datetime(2015, 4, 19, 12, 20)

格式转换

datetime对象转换为时间戳。

1
2
3
dt = datetime.datetime.now()
dt.timestamp()
#结果:1553617278.690061

datetime对象转换为字符串。

1
2
3
dt = datetime.datetime.now()
datetime.datetime.strftime(dt,'%Y-%m-%d %H:%M:%S')
#结果:'2019-03-27 00:24:01'

datetime对象转换为time时间元组。

1
2
3
dt = datetime.datetime.now()
time.localtime(dt.timestamp())
#结果:time.struct_time(tm_year=2019, tm_mon=3, tm_mday=27, tm_hour=0, tm_min=28, tm_sec=51, tm_wday=2, tm_yday=86, tm_isdst=0)

日期计算

基于某日期,向前或向后计算某段时间后的日期。

1
2
3
4
5
dt = datetime.datetime.now() #当前日期
dt = datetime.datetime.now()
dt - datetime.timedelta(days=1) #当前日期向前减一天
dt + datetime.timedelta(days=1) #当前日期向后加一天
dt + datetime.timedelta(days=11,hours=3,minutes=20) #当前日期向后推113小时20

计算两个日期的时间差

1
2
3
4
5
start = datetime.datetime.strptime('2015-6-1 18:19:59','%Y-%m-%d %H:%M:%S')
end = datetime.datetime.now()
dlt = end-start
dlt.days #相差天数
dlt.seconds #相差秒数

以下函数实现计算自从某一时间到当前时间经过了多少年,多少天,多少秒。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def cal_time_past(start_time = '2016-08-12 05:10:45'):
now_str = time.strftime("%Y-%m-%d %H:%M:%S") #当前时间字符串
now_obj = datetime.datetime.now() #当前时间datetime对象
years_end = now_str[:4]+start_time[4:] #开始时间年份替换为当年
if now_str >= years_end:
ynum = int(years_end[:4])-int(start_time[0:4]) #过了几个整年
else:
ynum = int(years_end[:4])-int(start_time[0:4])-1 #最后不满一年
years_end = str(int(years_end[:4])-1)+years_end[4:]
years_end_obj = datetime.datetime.strptime(years_end,'%Y-%m-%d %H:%M:%S')
delta = now_obj-years_end_obj
dnum = delta.days #去掉整年后过去的天数
hnum = int(delta.seconds/3600) #过去的小时数
mnum = int((delta.seconds-3600*hnum)/60) #过去的分钟数
snum = delta.seconds-3600*hnum-60*mnum #过去的描述
print("%d年%d天%d小时%d分%d秒" % (ynum,dnum,hnum,mnum,snum))
#
cal_time_past('1990-04-18 04:18:00')
#结果:28年342天20小时38分21秒

参考

文章目录
  1. 1. 时间相关概念
    1. 1.1. epoch
    2. 1.2. GMT, UTC
    3. 1.3. DST, tzoneDST, tzone
  2. 2. time模块
    1. 2.1. 获取时间
    2. 2.2. 时间转换
  3. 3. datetime模块
    1. 3.1. 对象创建
    2. 3.2. 格式转换
  4. 4. 日期计算
  5. 5. 参考
|