美文网首页Python回忆录
基础篇: 9. Python日期时间简单使用

基础篇: 9. Python日期时间简单使用

作者: 后视镜 | 来源:发表于2019-11-11 22:46 被阅读0次

日期时间在实际业务编写用得非常多,平时写测试的代码也日期时间做一些记录。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)
}

这样阅读起来更简单易用。

相关文章

网友评论

    本文标题:基础篇: 9. Python日期时间简单使用

    本文链接:https://www.haomeiwen.com/subject/stixictx.html