Python时间函数实战
Python 中时间处理要用到的模块有这两个 time、datetime,他们两个几乎就可以解决大部分的时间处理了,特殊情况下可能会用到python-dateutil、pytz、zhdate这三个模块。对时间的处理无非就是在这三个状态之间进行转换:时间对象、时间字符串、时间戳、时间间隔对象、时间点间隔列表, 后面都会涉及到这些状态之间的转换,首先导入这两个模块。
导入时间模块
- python console
$ ipython
In [1]: import time,datetime
In [2]:
当前时间对象
精确到微秒,可通过全局函数 str 转化成字符串格式
datetime.datetime.now()
str(datetime.datetime.now())
'2023-06-12 16:58:21.004178'
当前时间字符串
自定义字符串格式
datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
'2023-06-13 22:25:27'
timenow = datetime.datetime.now()
timenow.day
13
timenow.hour
22
当前时间戳
int(time.time())
1686666510
指定时间对象
根据 datetime.timedelta 获取昨天、明天的时间、N天前、N天后。
# 今天:
datetime.date.today()
datetime.date(2017, 11, 30)
# 明天:
datetime.date.today() + datetime.timedelta(days=1)
datetime.date(2017, 12, 1)
# 指定时间:
datetime.datetime(2017,10,26,20,15)
datetime.datetime(2017, 10, 26, 20, 15)
# 指定时间:
strtime = "2017-10-26 20:15:10"
datetime.datetime.strptime(strtime, "%Y-%m-%d %H:%M:%S")
datetime.datetime(2017, 10, 26, 20, 15, 10)
指定间隔对象
datetime.timedelta 表示时间间隔,即两个时间点之间的长度,datetime.timedelta的参数如果不给定,默认都为零。
datetime.timedelta(days=2, weeks=1, hours=1, minutes=0, seconds=2, milliseconds=0, microseconds=0)
9 days, 1:00:02
时间对象加减
datetime.datetime.now() - datetime.timedelta(days=10)
时间字符串 TO 时间对象
# 普通格式
strtime = "2017-10-26 20:15:10"
datetime.datetime.strptime(strtime, "%Y-%m-%d %H:%M:%S")
# 带时区格式
b = datetime.datetime.strptime('2023-07-03T15:30:00+00:00', '%Y-%m-%dT%H:%M:%S%z')
(b + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S')
# 带时区格式 dateutil.parser 需要安装额外模块 pip install python-dateutil
import dateutil.parser
strtime = "2017-10-26T20:15:10+08:00"
pointed_date = dateutil.parser.parse(strtime)
时间字符串 TO 时间戳
# 普通格式字符串
strtime = "2017-10-26 20:15:10"
timearray = time.strptime(strtime, "%Y-%m-%d %H:%M:%S")
timestamp = int(time.mktime(timearray))
# 带时区的字符串 安装额外模块 pip install python-dateutil
import datetime
import dateutil.parser
from dateutil.tz import tzlocal
strtime = "2017-10-26T20:15:10+08:00"
pointed_date = dateutil.parser.parse(strtime)
epoch = datetime.datetime(1970,1,1,8,0,0,tzinfo=tzlocal())
timestamp = (pointed_date - epoch).total_seconds()
时间对象 TO 字符串
datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
时间对象 TO 时间戳
# 方法一
timenow = datetime.datetime.now()
timestamp = int(time.mktime(timenow.timetuple()))
# 方法二 东8区的计算方法
timenow = datetime.datetime.now()
epoch = datetime.datetime(1970, 1, 1, 8, 0, 0)
timestamp = int((timenow - epoch).total_seconds())
时间戳 TO 时间对象
timestamp = 1512033840
datetime.datetime.fromtimestamp(timestamp)
时间戳 TO 时间字符串
timestamp = 1512033840
timearray = time.localtime(timestamp)
pointed_style_time = time.strftime("%Y-%m-%d %H:%M:%S", timearray)
UTC 时间
UTC(世界标准时间)
CST 时间
CST (中国标准时间), 比UTC时间提前8个小时,与UTC的时间偏差可写为+08:00.
ISO-8601标准时间格式化
- 使用 tzlocal 获取时区
pip install python-dateutil
# 当前时间格式化
import datetime
from dateutil.tz import tzlocal
now = datetime.datetime.now(tz=tzlocal()).isoformat()
# 指定时间格式化
import datetime
from dateutil.tz import tzlocal
create_at = datetime.datetime.now()
create_at = create_at.replace(tzinfo=tzlocal()).isoformat()
- 使用pytz获取时区
pip install pytz
import datetime
import pytz
# 当前时间格式化
create_at = datetime.datetime.now()
pst = pytz.timezone('Asia/Shanghai')
create_at = pst.localize(create_at).isoformat()
# 指定时间格式化
create_at = datetime.datetime.strptime('2018-10-20 06:13:41', '%Y-%m-%d %H:%M:%S')
pst = pytz.timezone('Asia/Shanghai')
create_at = pst.localize(create_at).isoformat()
农历时间
https://github.com/CutePandaSh/zhdate
pip install zhdate