Python中的time、date、datetime、timestamp
Python模块之time模块
⼀、Mysql 时间类型
在数据库建表的时候,通常有5种字段类型让⼈选择: TIME、DATE、DATETIME、TIMESTAMP、YEAR。
每种类型的存储空间和时间格式如下:
- TIME类型:存储空间[3bytes]-时间格式[HH:MM:SS]-时间范围[-838:59:59到~838:59:59]
- DATE类型:存储空间[3bytes]-时间格式[YYYY-MM-DD]-时间范围[1000-01-01到9999-12-31](可以理解为年⽉⽇)
- DATETIME类型:存储空间[8bytes]-时间格式[YYYY-MM-DD HH:MM:SS]-时间范围[1000-01-0100:00:00到9999-12-3123:59:59](可以理解为年⽉⽇时分秒)
- TIMESTAMP类型:存储空间[4bytes]-时间格式[YYYY-MM-DD HH:MM:SS]-时间范围[1970-01-0100:00:01到2038-01-1903:14:07](以秒为计算)
- YEAR类型:存储空间[1bytes]-时间格式[YYYY]-时间范围[1901到2155](按年计算)
YEAR 这样的时间格式⽤的是⽐较少的,⽽ TIME ⽤的也不多,常见的还是 DATE、DATETIME 和时间戳 TIMESTAMP。
⼆、Python 的 time
unix时间戳转换日期格式Python提供了三种时间函数,时间模块 time、基本时间⽇期模块 datetime 和⽇历模块 Calendar。Python 的 time 模块下有很多函数可以转换常见⽇期格式。如函数 time.time() ⽤于获取当前时间戳:
import time
timestamp = time.time()
print(timestamp,type(timestamp))
输出的时间戳是 float 类型:
1544788687.041193<class'float'>
时间戳单位最适于做⽇期运算。但是1970年之前的⽇期就⽆法以此表⽰了。太遥远的⽇期也不⾏,UN
IX和Windows只⽀持到2038年。Time 模块包含了以下内置函数,既有时间处理的,也有转换时间格式的:
# <1> 时间戳
>>>import time
>>> time.time()#--------------返回当前时间的时间戳
1493136727.099066
# <2> 时间字符串
>>> time.strftime("%Y-%m-%d %X")
'2017-04-26 00:32:18'
# <3> 时间元组
>>> time.localtime()
#time.struct_time(tm_year=2017, tm_mon=4, tm_mday=26,
tm_hour=0, tm_min=32, tm_sec=42, tm_wday=2,
tm_yday=116, tm_isdst=0)
⼩结:时间戳是计算机能够识别的时间;时间字符串是⼈能够看懂的时间;元组则是⽤来操作时间的⼏种时间形式的转换:
#⼀时间戳<---->结构化时间: localtime/gmtime mktime
>>> time.localtime(3600*24)
>>> ime(3600*24)
>>> time.mktime(time.localtime())
#字符串时间<---->结构化时间: strftime/strptime
>>> time.strftime("%Y-%m-%d %X", time.localtime())
>>> time.strptime("2017-03-16","%Y-%m-%d")
>>> time.asctime(time.localtime(312343423))
'Sun Nov 25 10:03:43 1979'
>>> ime(312343423)
'Sun Nov 25 10:03:43 1979'
三、Python的⽇历
Calendar 函数都是⽇历相关的,星期⼀是默认的每周第⼀天,星期天是默认的最后⼀天。模块包含了以下内置函数:
⽇历模块 Calendar 是⽤的次数⽐较少的(在爬⾍和Django开发的实际应⽤较少)。出现较多的是 time 模块和 dateteime 模块。那 time 和datetime 是什么关系呢?
- time模块--⽐较接近底层的
- datetime模块--基于time新增了很过功能,提供了更多函数
使⽤对⽐
1、获取当前时间
import datetime, time
print(time.time())
print(w())
1552557455.8247554
2019-03-1417:57:35.824755
2、当前时间格式化
import datetime, time
""" time当前时间 """
localtime = time.localtime(time.time())
print("当前时间元组 :", localtime)
print("不格式化:", time.time())
res1 = time.strftime('%Y-%m-%d', localtime)
print("strftime 可以把时间格式化为⽇期形式 :", res1)
res2 = time.strftime('%Y-%m-%d %H:%M:%S', localtime)
print("strftime 可以把时间转换为⽇期和时间 :", res2)
# ------------------------------------------------
""" datetime当前时间 """
time_now = w()
res3 = w().strftime("%Y-%m-%d")
res4 = w().strftime("%Y-%m-%d %H:%M:%S")
print("不格式化的当前时间:", time_now)
print("datetime 也可以这样⽤:", res3)
print("datetime 也可以这样⽤:", res4)
当前时间元组: time.struct_time(tm_year=2019, tm_mon=3, tm_mday=14, tm_hour=17, tm_min=58, tm_sec=47, tm_wday=3, tm_yday=73, tm_isdst=0)
不格式化:1552557527.058606
strftime 可以把时间格式化为⽇期形式:2019-03-14
strftime 可以把时间转换为⽇期和时间:2019-03-1417:58:47
不格式化的当前时间:2019-03-1417:58:47.058605
datetime 也可以这样⽤:2019-03-14
datetime 也可以这样⽤:2019-03-1417:58:47
这⾥可以看出这两个模块获得的时间都不是⼈类容易阅读的,都需要通过strftime函数进⾏格式化。
3、⽂本时间转换
当遇到⽇期类型 2018-01-06 的时间格式,是不可以⽤函数直接转成长时间 (⽐如 2018-01-06 18:35:05) 格式的,强⾏操作会报错。当遇到这种需要将时间格式统⼀的情况,没有直接操作的办法,只能对时间进⾏转换。转换⼜分为两种,相同时间格式转换与不同时间格式转换:
第⼀种情形
⽬标:2018-01-06 18:35:05 转换为2018/01/06 18:35:05
⽅法⼀的逻辑是不同格式的时间转换要先转成时间数组,然后再由时间数组格式化成想要的类型:
import datetime,time
a ="2013-10-10 23:40:00"# 想要转换成 a = "2013/10/10 23:40:00"
timeArray = time.strptime(a,"%Y-%m-%d %H:%M:%S")
otherStyleTime = time.strftime("%Y/%m/%d %H:%M:%S", timeArray)
print(timeArray)
print(otherStyleTime)
time.struct_time(tm_year=2013, tm_mon=10, tm_mday=10, tm_hour=23, tm_min=40, tm_sec=0, tm_wday=3, tm_yday=283, tm_isdst=-1)
2013/10/1023:40:00
可以看到,先通过 time.strptime 把它转换成时间数组,然后通过 time.strftime 把时间数组格式化成我想要的格式。
⽅法⼆,由于最终格式化的时间也是字符串 str,所以当遇到这种情况的时候,还可以直接⽤ replace 来进⾏转换:
a ="2013-10-10 23:40:00"# 想要转换成 a = "2013/10/10 23:40:00"
place("-","/"))
2013/10/1023:40:00
第⼆种情形
⽬标:2018-01-06 转换为2018-01-06 18:35:05
它也有两种⽅法可以满⾜,它的逻辑是将年⽉⽇的字符串拼接上时分秒,然后再按照上⾯的两种⽅法进⾏转换,⽐如:
a ="2013-10-10 "# 想要转换成 a = "2013/10/10 23:40:00"
ac = a +"00:00:00"
place("-","/"))
2013/10/1000:00:00
import datetime,time
a ="2013-10-10"# 想要转换成 a = "2013/10/10 00:00:00"
timeArray = time.strptime(a,"%Y-%m-%d")
otherStyleTime = time.strftime("%Y/%m/%d %H:%M:%S", timeArray)
print(timeArray)
print(otherStyleTime)
time.struct_time(tm_year=2013, tm_mon=10, tm_mday=10, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=283, tm_isdst=-1)
2013/10/1000:00:00
第三种情形
⽬标:2018-01-06 18:35:05 转换为2018-01-06
思路与第⼀种⼀致,先转换为时间数组,然后再由时间数组进⾏格式化:
import datetime,time
a ="2013-10-10 23:40:00"# 想要转换成 a = "2013/10/10"
timeArray = time.strptime(a,"%Y-%m-%d %H:%M:%S")
otherStyleTime = time.strftime("%Y/%m/%d", timeArray)
print(type(timeArray))
print(otherStyleTime)
<class'time.struct_time'>
2013/10/10
4、时间的⽐较运算
都知道字符串是不可以进⾏⽐较计算的,那么我们就需要⽤到其他的格式进⾏。time 的 strptime 转换成时间数组是不可以进⾏运算的,但是 datetime 可以。
第⼀种 ,时间格式相同
import datetime,time
d1 = datetime.datetime.strptime('2012-03-05 17:41:20','%Y-%m-%d %H:%M:%S')
d2 = datetime.datetime.strptime('2012-03-05 16:41:20','%Y-%m-%d %H:%M:%S')
delta = d1 - d2
print(type(d1))
print(delta.seconds)
print(delta)
<class'datetime.datetime'>
3600
1:00:00
从结果上可以看到,格式相同的两种时间,可以通过datetime.datetime.strptime进⾏转换后再运算,在结果中还可以通过.seconds来计算相差秒数和通过.days来计算 相差天数
第⼆种 ,如果时间格式不⼀样,但是转换后的类型⼀样,也是可以⽐较的:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论