日期时间在实际业务编写用得非常多,平时写测试的代码也日期时间做一些记录。Python的日期时间相对简单,这里简单归纳总结一下。前面提到的strptime()
在多线程环境下有问题,所以无论是不是多线程环境吧,我觉得尽量不要用,可以用前面提到的方式替换掉。
1. 时间对象
1.1. datetime对象
datetime对象主要包含了日期和时间,不只是日期。是平常使用得最频繁的日期对象,数据库的日期时间对象很多时候都使用他作为类型返回。
datetime的初始化
from datetime import datetime
# 参数是:年,月,日,时,分,秒,微妙,时区
dt = datetime(2019, 11, 11)
dt = datetime(2019, 11, 11, 10)
比较,注意有时候习惯用了datetime,但其实只是想比较日期,忽略时分秒,那么记得时分秒都设置0。
before = datetime(2019, 11, 11, 10, 0, 0)
after = datetime(2019, 11, 11, 11, 0, 0)
print(after > before)
True
1.2. date对象
与datetime对象不一样的是,date只是包含了日期,所以如果只是比较日期,可以考虑这个,但有时候用着用着又需要时分秒了,date又不保存到这些精度,所以我觉得用datetime完全可以替代date,只要注意好时分秒的问题就好了。
初始化
from datetime import date
dt = date(2019, 11, 11)
比较和datetime没什么区别,这里不作描述
获取当天日期
today = date.today()
date(2019, 11, 11)
获取年月日
today = date.now()
print(today.year)
2019
1.3. timedelta对象
timedelta表示时间长度或者时间的差距,意思就是这里包含一段时间长度。用处就非常广泛,涉及时间加减的情况都会用到。
例子1.一天之后或者昨天的datetime对象如何获得?
today = datetime.now()
tomorrow = today + timedelta(days=1)
yesterday = today - timedelta(days=-1)
例子2.1小时后或者一周之后
now = datetime.now()
one_hour_later = now + timedelta(hours=1)
one_week_later = now + timedelta(weeks=1)
从例子看完就可以看看这个对象的构造方法,这是从官方文档复制下来的,可以看到参数都需要加s表示对应的时间长度。
datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
要得到两个日期之间时间长度,特别是平常做业务,经常需要知道距离某个日子还剩多少时间
target_dt = datetime(2020, 1, 1)
now = datetime(2019, 11, 11, 0, 0, 0)
delta = target_dt - now
# delta是datetime.timedelta(51)
# 想差多少天可以获取到
delta.days
51
# 经常以为这个是总共想差多少秒,真很容易错,这个是满1天取余的秒数
# 如果两个时间相隔1天零1秒,那下面就等于1
delta.seconds
0
# 获取总共的秒数,公式: (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
delta.total_seconds()
4406400.0
timedelta用来做各种时间剩余是十分方便,不需要我们做太原始的计算,只要封装一下就可以用来做很多酷炫的时间表达。
2. 时间戳、时间字符串和datetime转化
时间转化也是必备的知识,记得刚开始写业务的时候,经常需要查怎么转化。这里记录下来这几年日常使用最频繁的转化分装函数
先说说time,这个是最常用获得当前时间戳的模块,一般如下获取
# 小数是毫秒,时间戳单位如果是秒,一般只有十位,如此类推,如果到毫秒是13位。js经常就是13位。
time.time()
1573480466.927721
这里真的提醒一下时间精度问题,很多时候订协议只写整型时间戳,没写明具体精度,python服务端就默认用秒为单位,前端js默认肯定用毫秒,等联调的时候就发现牛头不搭马嘴了。
2.1. 时间戳与dateime互相转化
时间戳转化成dateime
import time
ts = int(time.time())
dt = datetime.fromtimestamp(ts)
dateime转换为时间戳
dt = datetime.now()
int(time.mktime(dt.timetuple()))
2.2. 时间字符串与datetime互相转化
时间字符串转为datetime
dt_str = "2019—11-11 10:00:00"
# 空格切分
data = dt_str.split()
# -切分
year,month,day = map(int, data[0].split("-"))
# :切分
hour,minute,second = map(int, data[1].split(":"))
datetime(year, month, day, hour, minute, second)
datetime转换为字符串
now = datetime.now()
now.strftime("%Y-%m-%d %H:%M:%S")
2.3. 时间戳与字符串转换
这两者的转换其实一般都会借助datetime作为过渡,那其实就是上面几个的结合。
3. 总结
日期时间基本业务使用都在上面,可以自己封装一些函数,加快业务的编写,这样就会很方便。例如配置文件里面的时间配置,存到数据库里面当然是时间戳方便,但对人阅读起来非常不友好,虽然说在linxu用命令来阅读
date -d @1573480466
所以组装成一个函数,例如如下:
def cts(year, month, day, hour=0, minute=0, second=0):
dt = datetime(year,month,day,hour,minute,second)
return int(time.mktime(dt.timetuple()))
配置文件就可以这样写了:
time_conf = {
"beg": ts(2019, 10, 11, 10, 0, 0)
"end": ts(2019, 11, 11, 23, 0, 0)
}
这样阅读起来更简单易用。
网友评论