python笔记-python关于时间的计算

一、时间的几种格式:

1、时间戳(timestamp)

从1970年1月1日0点开始,到现在的秒数(以格林尼治时间为准)。

数据类型为'float',浮点数,小数

print(time.time())    # 返回的单位是秒不是毫秒
print(type(time.time()))                                 

 2、时间元组(Time tuple(time obj))

这是把年月日时分秒周日……作为一个元组

数据类型为‘time.struct_time’,元组

print(time.localtime())
print(type(time.localtime()))
print('年:', time.localtime()[0])
print('月:', time.localtime()[1])
print('日:', time.localtime()[2])
print('时:', time.localtime()[3])
print('分:', time.localtime()[4])
print('秒:', time.localtime()[5])
print('周几:', time.localtime()[6])    # 0到6,0代表周一
print('第几天:', time.localtime()[7])
print('夏令营:', time.localtime()[8])
print('-----------------------------')
print('年:', time.localtime().tm_year)
print('月:', time.localtime().tm_mon)
print('日:', time.localtime().tm_mday)
print('时:', time.localtime().tm_hour)
print('分:', time.localtime().tm_min)
print('秒:', time.localtime().tm_sec)
print('周几:', time.localtime().tm_wday)
print('第几天:', time.localtime().tm_yday)
print('夏令营:', time.localtime().tm_isdst)

3、时间格式(Datetime obj)

最准确的时间格式,还带毫秒

类型为'datetime.datetime'

print(datetime.datetime.now())
print(type(datetime.datetime.now()))

4、时间字符串(string),就是字符串而已

time.strftime(fmt, [tupletime]):接收以时间元组,并返回以可读字符串表示的时间,格式由fmt决定。

数据类型为‘str’,字符串

print(time.strftime('%Y%m%d%H%M%S'))

% y 两位数的年份表示(00 - 99)

% Y 四位数的年份表示(000 - 9999) 

% m 月份(01 - 12)

% d 月内中的一天(0 - 31) 

% H 24小时制小时数(0 - 23)

% I 12小时制小时数(01 - 12)

% M 分钟数(00 = 59)

% S 秒(00 - 59)

% a 本地简化星期名称

% A 本地完整星期名称 

% b 本地简化的月份名称 

% B 本地完整的月份名称 

% c 本地相应的日期表示和时间表示 

% j 年内的一天(001 - 366)

% p 本地A.M.或P.M.的等价符

% U 一年中的星期数(00 - 53)星期天为星期的开始

% w 星期(0 - 6),星期天为星期的开始 

% W 一年中的星期数(00 - 53)星期一为星期的开始 

% x 本地相应的日期表示 

% X 本地相应的时间表示

% Z 当前时区的名称

% % % 号本身

5、总结

# 时间字符串,就是一个字符串,不方便进行计算,首先弃用。

# 时间戳,是个浮点数,也不方便进行计算,也弃用。

# 时间元组,是个元组,不能直接存入数据库,还是弃用。

# 时间格式,这是最基本的格式,优先选用。

# time模块,是以时间戳为基础的。

# datetime模块,是以时间格式为基础的。

二、time模块

time模块中时间表现的形式主要有三种:

  • timestamp:时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量
  • struct_time:时间元组,共有九个元素
  • format_time:格式化时间,已格式化的结构使时间更具可读性,包括自动化格式和固定格式

1、时间格式转换图:

2、生成时间戳timestamp

import time
print(time.time())           

 3、生成时间元组struct_time

import time
print(time.localtime())

4、时间戳转换为时间元组

# 本地时间
import
time print(time.localtime(time.time())) print(time.localtime(1556348505))
# 格林威治时间
import
time print(time.gmtime(time.time())) print(time.gmtime(1556348505))

5、时间元组转换为时间戳

import time
print(time.mktime(time.localtime()))
print(time.mktime(time.localtime(1556348505)))
print(time.mktime((2018,5,27,1,5,27,6,147,-1)))  # 人造时间元组转换为时间戳

6、生成格式化时间

import time
print(time.strftime("%Y-%m-%d %H:%M:%S"))
print(time.strftime("%Y-%m-%d %X"))  # %X:本地相应的时间表示

7、时间元组转换为格式化时间

import time
timStamp = 1556348505   # 需要转换的时间戳
struct_time = time.localtime(timStamp)  # 时间戳转换为时间元组
print(time.strftime("%Y-%m-%d %H:%M:%S", struct_time))  # 时间元组转换为格式化时间
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))  # 本地时间的时间元组转换为格式化时间

8、格式化时间转换为时间元组

import time
print(time.strptime("2022-04-07 11:12:04", "%Y-%m-%d %H:%M:%S"))

9、生成固定格式的时间表示形式

time.asctime():接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18时07分14秒)的24个字符的字符串。

  语法:time.asctime([t]))

  参数:t为9个元素的元组或者通过函数 gmtime() 或 localtime() 返回的时间值。

time.ctime():把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。 如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于 asctime(localtime(secs))。

  语法:time.ctime([ sec ])

  参数:sec为要转换为字符串时间的秒数。

import time
print(time.asctime())
print(time.ctime())
print(time.asctime(time.localtime()))   # 本地时间
print(time.asctime(time.gmtime()))    # 格林威治时间
timeStamp = 1556348505
struct_time = time.localtime(timeStamp)
print(time.asctime(struct_time))
print(time.ctime(timeStamp))

三、datetime模块

datetime模块定义了六个类,分别为:

  • datetime.date:表示日期的类,常用的属性是year、month、day
  • datetime.time:表示时间的类,常用的属性是hour、minute、second、microsecond
  • datetime.datetime:表示日期时间的类
  • datetime.timedelta:表示两个date、time、datetime实例之间的时间间隔
  • datetime.tzinfo:时区相关信息对象的抽象基类,他们由datetime和time类使用,以提供自定义时间而调整
  • datetime.timezone:python3.2新增的功能,实现tzinfo抽象基类的类,表示与UTC的固定偏移量

1、date类

date类有三个参数,datetime.date(year,month,day),返回year-month-day

① 静态方法和字段

from datetime import date
print(date.max)  # date对象所能表示的最大日期
print(date.min)  # date对象所能表示的最小日期
print(date.resolution)  # date对象所表示日期的最小单位,这里是天
print(date.today())   # 返回一个表示当前本地日期的date对象
print(date.fromtimestamp(1556348505))  # 根据给定的时间戳,返回一个date对象

② 方法和属性

from datetime import date
# d1 = date.today()   # 返回一个表示当前本地日期的date对象
d1 = date(2022,4,7)  # date对象
print(d1.year)  #
print(d1.month)  #
print(d1.day)  #
print(d1.replace(2021, 1, 12))  # 生成一个新的日期对象,用参数指定的年,月,日代替原有对象中的属性。(原有对象仍保持不变)
print(d1.timetuple())  # 返回日期对应的struct_time
print(d1.weekday())  # 返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推
print(d1.isoweekday())  # 返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推
print(d1.isocalendar())  # 返回格式如(年,第几周,周的第几天)的元组
print(d1.isoformat())  # 返回格式如'YYYY-MM-DD’的字符串
print(d1.strftime("%Y-%m-%d %H:%M:%S"))

2、time类

类的定义:class datetime.time(hour[ , minute[ , second[ , microsecond[ , tzinfo] ) 。hour为必须参数,其他为可选参数

① 静态方法和字段

from datetime import time
print(time.max)  # time类能表示的最大时间
print(time.min)  # time类能表示的最小时间
print(time.resolution)  # 时间的最小单位,这里是1微妙

② 方法和属性

from datetime import time

d1 = time(16,33,7,24)  # time对象
print(d1.hour)  #
print(d1.minute)  #
print(d1.second)  #
print(d1.microsecond)  # 微秒
print(d1.tzinfo)  # 返回传递给time构造方法的tzinfo对象,如果该参数未给出,则返回None
print(d1.replace(10))  # 创建一个新的时间对象,用参数指定的时、分、秒、微秒代替原有对象中的属性(原有对象仍保持不变)
print(d1.isoformat())  # 返回型如"HH:MM:SS"格式的字符串表示
print(d1.strftime("%Y-%m-%d %H:%M:%S"))

3、datetime类

datetime类的定义:class datetime.datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] ),year, month 和 day是必须要传递的参数

① 静态方法和字段

from datetime import datetime
from datetime import date
from datetime import time

print(datetime.datetime(2022, 4, 7, 18, 30, 30)) # datetime对象
print(datetime.today()) # 返回一个表示当前本地时间的datetime对象 print(datetime.now()) # 返回一个表示当前本地时间的datetime对象,如果提供了参数tz(datetime.now([tz]),则获取tz参数所指时区的本地时间 print(datetime.utcnow()) # 返回一个当前utc时间的datetime对象(格林威治时间) print(datetime.fromtimestamp(1556348505)) # 根据时间戮创建一个datetime对象,参数tz指定时区信息;(datetime.fromtimestamp(timestamp[, tz])) print(datetime.utcfromtimestamp(1556348505)) # 根据时间戳创建一个datetime对象(格林威治时间) print(datetime.combine(date.today(), time(18, 10, 6))) # 根据date和time,创建一个datetime对象 print(datetime.strptime("2022-04-07 18:11:33", "%Y-%m-%d %H:%M:%S")) # 将格式字符串转换为datetime对象

②方法和属性

from datetime import datetime

dt = datetime.now()  # datetime对象    print(dt.timestamp())  # 获取时间戳,等同于time模块的time.time()
print(dt.year)  #
print(dt.hour)  #
print(dt.date())  # 获取date对象
print(dt.time())  # 获取time对象
print(dt.replace(2002, 2))  # 生成并返回一个新的datetime对象,如果所有参数都没有指定,则返回一个与原datetime对象相同的对象
print(dt.timetuple())  # 返回datetime对象对应的tuple(不包括tzinfo)
print(dt.weekday())   # 返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推
print(dt.isoweekday())  # 返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推
print(dt.isocalendar())  # 返回格式如(年,第几周,周的第几天)的元组
print(dt.isoformat())
print(dt.ctime())  #     等价于time模块的time.ctime(sec)
print(dt.strftime("%Y-%m-%d %H:%M:%S"))

4、timedelta类,时间加减

timedelta对象表示两个不同时间之间的差值。如果使用time模块对时间进行算术运行,只能将字符串格式的时间 和 struct_time格式的时间对象 先转换为时间戳格式,然后对该时间戳加上或减去n秒,最后再转换回struct_time格式或字符串格式,这显然很不方便。而datetime模块提供的timedelta类可以让我们很方面的对datetime.date, datetime.time和datetime.datetime对象做算术运算,且两个时间之间的差值单位也更加容易控制。使用timedelta可以很方便的在日期上做天days,小时hour,分钟,秒,毫秒,微妙的时间计算,如果要计算月份则需要另外的办法。

类定义:class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, hours=0, weeks=0)

datetime.timedelta():返回一个时间间隔对象,可以直接与datetime.datetime对象做加减操

datetime.timedelta().total_seconds():时间差中包含的总秒数

import datetime

print(datetime.timedelta(days=365).total_seconds())   # 一年包含的总秒数
print(datetime.datetime.now() + datetime.timedelta(3))  # 三天后
print(datetime.datetime.now() + datetime.timedelta(-3))  # 三天前
print(datetime.datetime.now() + datetime.timedelta(hours=3))  # 三小时后
print(datetime.datetime.now() + datetime.timedelta(hours=3, seconds=30))  # 三小时三十秒后
print(datetime.date(2022, 3, 15) + datetime.timedelta(10))  # 2022年3月15日后十天
print(datetime.datetime(2022, 4, 7, 18, 30, 30) + datetime.timedelta(days=10, hours=1))  # 2022年4月7日 18:30:30秒后十天一个小时
print(datetime.datetime.now().date() + datetime.timedelta(days=1))   # 一天后

print(datetime.datetime.now() + datetime.timedelta(weeks=1))  # 当前日期为2022年4月8日,weeks为1则表示一周即7天

5、datetime常用操作

①datetime转字符串  -------strftime()函数

两种写法:datetime.datetime.strftime(datatime对象,格式化的字符串)  或  datatime对象.strftime(格式化的字符串)

备注:若格式化的字符串中含中文,需使用format方式表示

import datetime

print(datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S"))
print(datetime.datetime.strftime(datetime.datetime.now(), "%Y{}%m{}%d{} %H{}%M{}%S{}").format('', '', '', '', '', ''))
print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
print(datetime.datetime.now().strftime("%Y{}%m{}%d{} %H{}%M{}%S{}").format('', '', '', '', '', ''))

 ②字符串转datetime  ------strptime()函数

写法:datetime.datetime.strptime(时间字符串,格式化的字符串)

import datetime

time1 = datetime.datetime.strptime('2022-04-07 21:02:47', "%Y-%m-%d %H:%M:%S")
print(time1, type(time1))
time2 = datetime.datetime.strptime("2024年11月02日 13时50分03秒", "%Y年%m月%d日 %H时%M分%S秒")
print(time2,type(time2))

③时间差操作  ------timedelta()

可加入的参数:
weeks=0 周数,数字1表示七天;
days=0 天数;
hours=0 小时数;
minutes=0 分钟数;
seconds=0 秒数;
milliseconds=0 毫秒数,千分之一秒;
microseconds=0 微秒数;百万分之一秒.

具体见上方timedelta

④时间戳操作

import datetime

timeStamp = datetime.datetime.now().timestamp()  # 获取datetime对象的时间戳
print(timeStamp)
print(datetime.datetime.fromtimestamp(timeStamp))  # 由时间戳初始化datetime对象

四、计算过去时间和未来时间代码

import datetime
import time

def get_date_time(days=0, hours=0, minutes=0, seconds=0, micro_seconds=0, date_format='%Y-%m-%d %H:%M:%S'):
    '获取时间,之前的时间(day=-90代表往前推90天)或未来的时间(day=90代表往后推90天)'
    now_time = datetime.datetime.now()
    need_time = now_time + datetime.timedelta(days=days, hours=hours, minutes=minutes, seconds=seconds,
                                              microseconds=micro_seconds)
    need_time = need_time.strftime(date_format)
    print(need_time)
    return need_time


def get_last_time(second):
    '获取过去的时间,second是当前时间比过去相差的秒数'
    last = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time() - second))  # 当前时间之前推多少秒
    return last

 ——————————————————————

参考文章:https://www.cnblogs.com/haitaoli/p/10823403.html

       https://blog.csdn.net/gty931008/article/details/80254806

posted @ 2022-02-25 18:33  *无边落木萧萧下*  阅读(3502)  评论(0编辑  收藏  举报