已复制
全屏展示
复制代码

Python时间函数实战


· 3 min read

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


文章推荐