python中的时间日期等对象
datetime
date
time X2
timestamp
timezone
timedelta
这里面我们主要使用的是datetime,而timestamp则是另一种展现形式,也就是一个数字
datetime 的基本表达
如果我们有这么一个时间戳 2019-01-01 00:00:00,有日期,有时间,所以可以直接对应的就是日期时间对象datetime了,在python中可以这样声明datetime(2019,1,1, 0,0,0),如果直接将这个对象用print输出,其会输出2019-01-01 00:00:00。
从字面意义理解datetime对象是由date和time两个部分组成的,如果设计的足够直观,够按照这个推理,一个date对象和一个time对象应该是可以构造一个datetime, 只是稍微有些不够直观的是,你需要使用combine方法来构造新的datetime,而不是以构造参数的方式传入date和time
d = date(2019,1,1)
print(d)
t = time(0,0,0)
print(t)
dt = datetime.datetime(date=d, time=t)
dt = datetime.datetime.combine(d, t)
print(dt)
上面的输出如下,
2019-01-01
00:00:00
2019-01-01 00:00:00
另外,很直观的,你可以使用datetime获取相关的一些参数,比如年月日,时分秒
print("{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second))
print(dt.weekday())
print(dt.isoweekday())
print(dt.isocalendar())
print(dt.date())
print(dt.time())
其会输出, 要注意的是,比如今天是星期四,isoweekday输出的是4,weekday输出的是3
2019-04-04 17:19:05
3
4
(2019, 14, 4)
2019-04-04
17:19:05.766999
时间与数字
如果你使用dir来查看datetime的方法,应该能观察到其包含有一个timestamp, timestamp是一个浮点型的小数,表示当前时间到utc时间1970.01.01凌晨相距的秒数。
和timestamp不同,python的time包中还有一个time对象,当我们调用time.time()会返回一个float形态的数值,其精度比timestamp更高(多一位)。如果是需要更高的精度,可以使用time.time_ns()获取纳秒级别的数值, 不过此时返回的是整数形态,精度比timestamp高三位!
timestamp的底层实现
(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
将时间转换成数字有几个优势,但是具体还要按需求来定,
更小的存储
方便的比较与计算(当然本身datetime对象也是支持的,但是某些需要引入timedelta对象)
格式相对统一(因为简单)
如果要使用timestamp完成时间的比较与加减,直接计算就好了。但是如果要使用timestamp就会稍微麻烦一些,datetime目前支持如下几种
datetime2 = datetime1 + timedelta
datetime2 = datetime1 - timedelta
timedelta = datetime1 - datetime2
datetime1 < datetime2 Compares datetime to datetime.
要注意的是
datetime和timedelta做加减后的对象依旧是datetime
datetime对象之间可以直接比较
datetime和datetime相减,得到一个timedelta对象,同时小减大,将得到负数
datetime不可以和datetime相加
比如要计算当前时间的8小时后,就是
n = datetime.datetime.now()
m = n + datetime.timedelta(hours=8)
print(m, type(m))
print(m<n, n<m)
其会输出
2019-04-09 02:36:37.956798 <class ‘datetime.datetime’>
False True
剩下的测试,异常处理,数据比较繁琐,放在下一次吧