Python日期时间
python 内置的几个关于时间的模块,time
timeit
datetime
calendar
--- ## time 模块
# coding:utf-8
# time 模块
import time
# 1. time.time()
print(time.time()) # time.time() 返回当前时间戳
# >: 1624126357
# 2. time.localtime()
print(time.localtime()) # time.localtime() 返回当前时间结构元组
# >: time.struct_time(tm_year=2021, tm_mon=6, tm_mday=20, tm_hour=2, tm_min=12, tm_sec=37, tm_wday=6, tm_yday=171, tm_isdst=0)
# 3. time.ctime() 时间戳->日期
print(time.ctime()) # time.ctime() 返回当前日期
# >: Sun Jun 20 02:12:37 2021
# 4. time.asctime() 结构元组->日期
print(time.asctime((2021, 6, 20, 2, 12, 37, 6, 171, 0))) # time.asctime() 返回一个可读的形式
# >: Sun Jun 20 02:12:37 2021
print(time.ctime(1624126357)) # 返回该时间戳的日期
# >: Sun Jun 20 02:12:37 2021
# 5. tiem.gmtime() 时间戳->结构元组
print(tiem.gmtime(1624126357.0)) #
# >: time.struct_time(tm_year=2021, tm_mon=6, tm_mday=20, tm_hour=2, tm_min=12, tm_sec=37, tm_wday=6, tm_yday=171, tm_isdst=0)
# 6. time.mktime() 结构元组->时间戳
print(time.mktime( (2021, 6, 20, 2, 12, 37, 6, 171, 0) )) # time.mktime() 返回时间结构元组的时间戳
# >: 1624126357.0
print(time.localtime(1624126357)) # 返回传入的时间戳的时间结构元组
# >: time.struct_time(tm_year=2021, tm_mon=6, tm_mday=20, tm_hour=2, tm_min=12, tm_sec=37, tm_wday=6, tm_yday=171, tm_isdst=0)
# 7. time.strftime() 时间元组->指定的格式
print(time.strftime("%Y-%m-%d %H:%M:%S",)) # time.strftime() 格式化输出当前时间
# 8. time.strptime() 指定的格式->时间元组
print(time.strptime("30 Nov 00", "%d %b %y"))
# >: time.struct_time(tm_year=2000, tm_mon=11, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=335, tm_isdst=-1)
# 时间日期格式化符号:https://www.runoob.com/python/att-time-strptime.html
# 9. time.sleep(:int)
time.sleep(2) # time.sleep(2) selenium中常用的休眠,休眠2秒
# 10. time.perf_counter()
T1 = time.perf_counter()
#______假设下面是程序部分______
for i in range(100*100):
pass
T2 =time.perf_counter()
print('程序运行时间:%s毫秒' % ((T2 - T1)*1000))
# 11. time.process_time()
T1 = time.process_time() # time.process_time() 不包括sleep()休眠时间;需要调用两次,做差值
#______假设下面是程序部分______
for i in range(100*100):
pass
T2 =time.process_time()
print('程序在CPU运行时间:%s毫秒' % ((T2 - T1)*1000))
timeit 模块
# coding:utf-8
# timeit 模块 性能分析
import timeit
# 待测试的函数
def add():
return sum(range(111))
# stmt 需要测试的函数或语句,字符串形式
# setup 运行的环境,本例子中表示 if __name__ == '__main__':
# number 被测试的函数或语句,执行的次数,本例表示执行100000次add()。省缺则默认是10000次
# repeat 测试做100次
# 综上:此函数表示 测试 在if __name__ == '__main__'的条件下,执行100000次add()消耗的时间,并把这个测试做100次,并求出平均值
t = timeit.timeit(stmt="add()", setup="from __main__ import add", number=100000)
t = timeit.repeat(stmt="add()", setup="from __main__ import add", number=100000, repeat=100)
print(t)
print(sum(t) / len(t))
datetime 模块
# coding:utf-8
# datetime 模块
from datetime import datetime
# 1. datetime.now()
print(datetime.now()) # datetime.now() 返回当前日期和时间 [datetime 类型]
# >: 2021-06-20 02:12:37
# 2. datetime()
print(datetime(2021, 6, 20, 2, 12, 37, 6)) # datetime() 返回指定日期和时间 [datetime 类型]
# >: 2021-06-20 02:12:37.000006
# 3. datetime().timestamp()
print(datetime(2021, 6, 20, 2, 12, 37, 6).timestamp()) # datetime().timestamp() [datetime 类型]转换为本地时区timestamp
# >: 1624126357.000006
# 4. datetime.fromtimestamp(t)
t = datetime(2021, 6, 20, 2, 12, 37, 6).timestamp()
print(datetime.fromtimestamp(t)) # datetime.fromtimestamp(t) 本地时区timestamp[t]转换为[datetime 类型]
# >: 2021-06-20 02:12:37.000006
# 5. datetime.utcfromtimestamp(t)
t = datetime(2021, 6, 20, 2, 12, 37, 6).timestamp()
print(datetime.utcfromtimestamp(t)) # datetime.utcfromtimestamp(t) UTC标准时区timestamp[t]转换为[datetime 类型]
# >: 2021-06-19 18:12:37.000006
# 6. strptime()
# datetime.strptime() 字符串日期和时间转成[datetime 类型]
# 格式说明: https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
print(datetime.strptime('2021-6-20 02:12:37', '%Y-%m-%d %H:%M:%S'))
# >: 2021-06-20 02:12:37
# 6. strftime()
dt = datetime(2021,6,20,2,12,37,6)
print(dt.strftime('''
本地时间
%c
星期 , 月 , 日 , 日期 ,时:分:秒
%A(%a), %B(%b) %d , %x , %X
日期时间24小时制
%d/%m/%y %H:%M:%S %z
日期时间12小时制
%Y-%m-%d %p. %I:%M:%S
第 %j 天
第 %U 个星期, 星期 %w [日始0-6]
第 %W 个星期, 星期 %u [一始1-7]
''')) # datetime.strftime() [datetime 类型]转成字符串日期和时间.
# 7. timedelta
# 对日期和时间进行加减,可以直接用+和-运算符
from datetime import datetime, timedelta
dt = datetime(2021, 6, 20, 2, 12, 37, 6)
dt = dt + timedelta(hours=10)
# 8. timezone
from datetime import datetime, timedelta, timezone
tz_utc_8 = timezone(timedelta(hours=8)) # 创建时区UTC+8:00
now = datetime.now()
dt = now.replace(tzinfo=tz_utc_8) # 强制设置为UTC+8:00
# 9. astimezone
utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc) # 获取UTC时间,并强制设置时区为UTC+0:00:
bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8))) # astimezone()将转换时区为北京时间:
tokyo_dt = utc_dt.astimezone(timezone(timedelta(hours=9))) # 将转换时区为东京时间
tokyo_dt2 = bj_dt.astimezone(timezone(timedelta(hours=9))) # 将bj_dt转换时区为东京时间
# ** 假设你获取了用户输入的日期和时间如2015-1-21 9:01:30,以及一个时区信息如UTC+5:00,均是str,请编写一个函数将其转换为timestamp:
# -*- coding:utf-8 -*-
import re
from datetime import datetime, timezone, timedelta
def to_timestamp(dt_str, tz_str):
i_utc = int(re.match( r'UTC(.*):00', tz_str).group(1))
tz_utc = timezone(timedelta(hours=i_utc))
dt= datetime.strptime(dt_str, '%Y-%m-%d %H:%M:%S')
dt = dt.replace(tzinfo=tz_utc) # 强制设置为UTC+X:00
return dt.timestamp()
# 测试:
t1 = to_timestamp('2015-6-1 08:10:30', 'UTC+7:00')
assert t1 == 1433121030.0, t1
t2 = to_timestamp('2015-5-31 16:10:30', 'UTC-09:00')
assert t2 == 1433121030.0, t2
print('ok')
calendar 模块
# coding:utf-8
# calendar 模块 处理年历和月历
import calendar
# 1. calendar.calendar(year,w=2,l=1,c=6)
print(calendar.calendar(2021,w=2,l=1,c=7)) # 3个月一行,间隔距离为c,每日宽度间隔为w字符,l是每星期行数。每行长度为21* W+18+2* C
# 相当于 calendar.prcal(year,w=2,l=1,c=6)
# 2. calendar.month(year,month,w=2,l=1)
print(calendar.month(2021,6,w=2,l=1)) # 一周一行。每日宽度间隔为w字符。每行的长度为7* w+6。l是每星期的行数。
# 相当于 calendar.prmonth(year,month,w=2,l=1)
# 3. calendar.weekday(year,month,day)
print(calendar.weekday(2021,6,20)) # calendar.weekday() 0(星期一)到6(星期日)。月份为 1(一月) 到 12(12月)。
# >: 6 # 解释:星期日
# 4. calendar.firstweekday()
print(calendar.firstweekday()) # calendar.firstweekday() 返回当前每周起始日期的设置,默认返回0,即星期一
# >: 0
# 5. calendar.isleap(year)
print(calendar.isleap(2020)) # calendar.isleap(year) 闰年返回 True,否则为 false。
# >: True
# 6. calendar.leapdays(y1,y2)
calendar.leapdays(1900,2020) # 返回在[Y1,Y2)两年之间的闰年总数
# >: 29
# 7. calendar.monthrange(year,month)
print(calendar.monthrange(2021,6))
# >: (1,30) # 解释:1 表示 2021 年 6 月份的第一天是周一,30 表示 2021 年 6 月份总共有 30 天。
# 8. calendar.setfirstweekday(weekday)
calendar.setfirstweekday(1) # 设置每周的起始日期码。0(星期一)到6(星期日)。