python之内置模块time模块和datetime模块详解(python内置函数time)

网友投稿 305 2022-08-28


python之内置模块time模块和datetime模块详解(python内置函数time)

一、time模块

前言

① timestamp 时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量

② struct_time 时间元组,共有九个元素组。

③ format time 格式化时间,已格式化的结构使时间更具可读性。包括自定义格式和固定格式。

1、时间格式转换图

2、主要time生成方法以及time格式转换方法实例:

# -*- coding:utf-8 -*-import time# ①生成timestamp时间戳time.time()# 1477471508.05# ②生成struct_time时间元组time.localtime()# time.struct_time(tm_year=2022, tm_mon=2, tm_mday=14, tm_hour=20, tm_min=47, tm_sec=43, tm_wday=0, tm_yday=45, tm_isdst=0)# ③生成format_time格式化时间time.strftime("%Y-%m-%d %X")# 2022-02-14 20:55:48# ④struct_time时间元组 to timestamp时间戳time.mktime(time.localtime())# 1644843166.0# ⑤timestamp时间戳 to struct_time时间元组time.localtime(time.time())# time.struct_time(tm_year=2016, tm_mon=10, tm_mday=26, tm_hour=16, tm_min=45, tm_sec=8, tm_wday=2, tm_yday=300, tm_isdst=0)# ⑥timestamp时间戳 to struct_time时间元组 格林威治时间time.gmtime()# time.struct_time(tm_year=2022, tm_mon=2, tm_mday=14, tm_hour=12, tm_min=54, tm_sec=17, tm_wday=0, tm_yday=45, tm_isdst=0)time.gmtime(time.time())# time.struct_time(tm_year=2016, tm_mon=10, tm_mday=26, tm_hour=8, tm_min=45, tm_sec=8, tm_wday=2, tm_yday=300, tm_isdst=0)# ⑦format_time格式化时间 to struct_time时间元组time.strptime('2011-05-05 16:37:06', '%Y-%m-%d %X')# time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=16, tm_min=37, tm_sec=6, tm_wday=3, tm_yday=125, tm_isdst=-1)# ⑧struct_time时间元组 to format_time格式化时间time.strftime("%Y-%m-%d %X", time.localtime())# 2016-10-26 16:48:41# ⑨生成固定格式的时间表示格式time.asctime(time.localtime())# Mon Feb 14 20:57:08 2022time.ctime(time.time())# Wed Oct 26 16:45:08 2016

struct_time时间元组元素结构:

属性 值tm_year(年) 比如2011 tm_mon(月) 1 - 12tm_mday(日) 1 - 31tm_hour(时) 0 - 23tm_min(分) 0 - 59tm_sec(秒) 0 - 61tm_wday(weekday) 0 - 6(0表示周日)tm_yday(一年中的第几天) 1 - 366tm_isdst(是否是夏令时) 默认为-1

format time格式化时间表示:

格式

含义

%a

本地(locale)简化星期名称

%A

本地完整星期名称

%b

本地简化月份名称

%B

本地完整月份名称

%c

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

%d

一个月中的第几天(01 - 31)

%H

一天中的第几个小时(24小时制,00 - 23)

%I

第几个小时(12小时制,01 - 12)

%j

一年中的第几天(001 - 366)

%m

月份(01 - 12)

%M

分钟数(00 - 59)

%p

本地am或者pm的相应符

%S

秒(01 - 61)

%U

一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。

%w

一个星期中的第几天(0 - 6,0是星期天)

%W

和%U基本相同,不同的是%W以星期一为一个星期的开始。

%x

本地相应日期

%X

本地相应时间

%y

去掉世纪的年份(00 - 99)

%Y

完整的年份

%Z

时区的名字(如果不存在为空字符)

%%

‘%’字符

常见结构化时间组合:

print time.strftime("%Y-%m-%d %X")#2016-10-26 20:50:13

3、time加减:

#timestamp加减单位以秒为单位import timet1 = time.time()t2=t1+10print time.ctime(t1)#Wed Oct 26 21:15:30 2016print time.ctime(t2)#Wed Oct 26 21:15:40 2016

二、datetime模块

前言

①基本的日期和时间类型: datetime 模块提供了各种类用于操作日期和时间,该模块侧重于高效率的格式化时间输出。

② datetime  模块定义了两个常量:

datetime.MINYEAR  :date对象 和 datetime 对象所能支持的最小年份,object.MINYEAR 的值为 1datetime.MAXYEAR  :date对象 和 datetime 对象所能支持的最大年份,object.MAXYEAR 的值为 9999

③ datetime 模块中定义的类:

datetime.date  :表示日期的类,常用属性:year, month, daydatetime.time  :表示时间的类,常用属性:hour, minute, second, microsecond, tzinfodatetime.datetime  :表示日期和时间的类,常用属性: year, month, day, hour, minute, second, microsecond, tzinfodatetime.timedelta  :表示时间间隔,即两个时间点(date,time,datetime)之间的长度datetime.tzinfo  :表示时区的基类,为上方的 time 和 datetime 类提供调整的基准datetime.timezone  :表示 UTC 时区的固定偏移,是 tzinfo 基类的实现

参考博客:datetime 模块详解(基本的日期和时间类型)

1、date类[datatime是一个python模块,data是datatime模块中的一个类]

datetime.date(year, month, day)

静态方法和字段:

date.max、date.min:date对象所能表示的最大、最小日期;date.resolution:date对象表示日期的最小单位。这里是天。date.today():返回一个表示当前本地日期的date对象;date.fromtimestamp(timestamp):根据给定的时间戮,返回一个date对象;

from datetime import *import timeprint 'date.max:', date.maxprint 'date.min:', date.minprint 'date.today():', date.today()print 'date.fromtimestamp():', date.fromtimestamp(time.time())#Output======================# date.max: 9999-12-31# date.min: 0001-01-01# date.today(): 2016-10-26# date.fromtimestamp(): 2016-10-26

方法和属性:

d1 = date(2011,06,03)#date对象d1.year、date.month、date.day:年、月、日;d1.replace(year, month, day):生成一个新的日期对象,用参数指定的年,月,日代替原有对象中的属性。(原有对象仍保持不变)d1.timetuple():返回日期对应的time.struct_time对象;d1.weekday():返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推;d1.isoweekday():返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推;d1.isocalendar():返回格式如(year,month,day)的元组;d1.isoformat():返回格式如'YYYY-MM-DD’的字符串;d1.strftime(fmt):和time模块format相同。

from datetime import *now = date(2016, 10, 26)tomorrow = now.replace(day = 27)print 'now:', now, ', tomorrow:', tomorrowprint 'timetuple():', now.timetuple()print 'weekday():', now.weekday()print 'isoweekday():', now.isoweekday()print 'isocalendar():', now.isocalendar()print 'isoformat():', now.isoformat()print 'strftime():', now.strftime("%Y-%m-%d")#Output========================# now: 2016-10-26 , tomorrow: 2016-10-27# timetuple(): time.struct_time(tm_year=2016, tm_mon=10, tm_mday=26, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=300, tm_isdst=-1)# weekday(): 2# isoweekday(): 3# isocalendar(): (2016, 43, 3)# isoformat(): 2016-10-26# strftime(): 2016-10-26

datetime.date类的常用方法

# Python中提供了多个用于对日期和时间进行操作的内置模块:time模块、datetime模块和calendar模块。# time模块是通过调用C库实现的,所以有些方法在某些平台上可能无法调用,但是其提供的大部分接口与C标准库time.h基本一致。# datetime模块提供的接口更直观、易用,功能也更加强大。import datetimeimport time # datetime.date类的常用方法# datetime.date类的生成年月日格式的写法, 今日是2020-09-30 周三ymd = datetime.date.today()print(ymd) # 2020-09-30print(ymd.strftime('%Y-%m-%d')) # 2020-09-30print(ymd.strftime('%Y/%m/%d')) # 2020/09/30print(ymd.isoformat()) # 2020-09-30 默认展示这种方式print(ymd.year, ymd.month, ymd.day) # 2020 9 30print(ymd.replace(2020)) # 2020-09-30print(ymd.replace(2020, 9)) # 2020-09-30print(ymd.replace(2020, 9, 30)) # 2020-09-30print(ymd.timetuple()) # time.struct_time(tm_year=2020, tm_mon=9, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=274, tm_isdst=-1)print(ymd.weekday()) # 2 周三属于0-6的2print(ymd.isoweekday()) # 3 周三属于1-7的3print(ymd.isocalendar()) # (2020, 40, 3) 第40周的第三天ymd = datetime.date.fromtimestamp(time.time()) # 2020-09-30print(ymd)today_ymd_str = datetime.date.today().strftime('%Y-%m-%d')today_zero_timestamp = int(time.mktime(datetime.date.today().timetuple()))print('零点字符串', type(today_ymd_str), today_ymd_str)print('零点时间戳', today_zero_timestamp)ymd_stamp = int(time.mktime(datetime.date.today().timetuple())) # 1612368000 日时间戳, datetime没有给定字符串转换为时间戳的方法还要借助time模块print('默认生成当日时间戳', ymd_stamp)stamp = int(time.time())ymd_str1 = datetime.date.fromtimestamp(stamp) # 2021-02-04print('根据时间戳生成时间字符串', ymd_str1)

今日零点和某一时间节点比如9:30的字符串和时间戳转换

import datetimeimport time # 今日零点字符串today_ymd_0001 = time.strftime("%Y-%m-%d")today_ymd_0002 = datetime.date.today().strftime('%Y-%m-%d') # 2021-02-04today_ymd_0003 = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0).strftime("%Y-%m-%d") # 有year/month/day/hour/minute/second/microsecond 7个参数vprint('今日0:00时间字符串: ', today_ymd_0001, today_ymd_0002, today_ymd_0003)# 今日0:00时间字符串: 2021-02-04 2021-02-04 2021-02-04 # 今日零点时间戳today_000 = int(datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0).timestamp())print('今日0:00时间戳: ', today_000) # 今日9:30的时间字符串time_930_str = datetime.datetime.now().replace(hour=9, minute=30, second=0, microsecond=0).strftime("%Y-%m-%d %H:%M:%S")print('今日9:30时间字符串: ', time_930_str, type(time_930_str)) # 今日9:30的时间戳today_930 = int(datetime.datetime.now().replace(hour=9, minute=30, second=0, microsecond=0).timestamp())print('今日9:30的时间戳: ', today_930) # 任意字符串转换为时间戳ymd_stamp = datetime.datetime.strptime("2015-02-28 14:19:05.512", "%Y-%m-%d %H:%M:%S.%f").timestamp()print('datetime.datetime字符串转换为时间戳', ymd_stamp)

计算多少日前的日期timedelta

'''参数可选、默认值都为0:datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)'''import timeimport datetime today = datetime.date.today()before_year = datetime.date.today() - datetime.timedelta(days=365)before_year_stamp = int(time.mktime(time.strptime(before_year.strftime('%Y-%m-%d'), '%Y-%m-%d')))print(today, before_year, before_year_stamp)# 2021-02-04 2020-02-05 1580832000

计算日周月年relativedelta

#!/usr/bin/env python# -*- encoding: utf-8 -*-"""""" import datetimeimport timefrom dateutil.relativedelta import relativedelta# timedelta 实现不了周月年的减法 def get_days_st_et(days): """ 获取今天之前的日期 :param days: :return: """ pre_day = datetime.date.today() - datetime.timedelta(days=days) pre_day_ts = int(time.mktime(pre_day.timetuple())) pre_day_str = pre_day.strftime("%Y-%m-%d") return pre_day_str, pre_day_ts def get_weeks_st_et(weeks): """ 获取今天之前的日期 :param months: :return: """ pre_day = datetime.date.today() - relativedelta(weeks=weeks) pre_day_ts = int(time.mktime(pre_day.timetuple())) pre_day_str = pre_day.strftime("%Y-%m-%d") return pre_day_str, pre_day_ts def get_months_st_et(months): """ 获取今天之前的日期 :param months: :return: """ pre_day = datetime.date.today() - relativedelta(months=months) pre_day_ts = int(time.mktime(pre_day.timetuple())) pre_day_str = pre_day.strftime("%Y-%m-%d") return pre_day_str, pre_day_ts def get_years_st_et(years): """ 获取今天之前的日期 :param years: :return: """ pre_day = datetime.date.today() - relativedelta(years=years) pre_day_ts = int(time.mktime(pre_day.timetuple())) pre_day_str = pre_day.strftime("%Y-%m-%d") return pre_day_str, pre_day_ts if __name__ == '__main__': # 今日时间戳 today_now = datetime.date.today() today_timestamp = int(time.mktime(today_now.timetuple())) print('今日: {}/{}'.format(today_now, today_timestamp)) # 最近一周 pre_ts, pre_str = get_days_st_et(days=2) print('最近日: {}/{}'.format(pre_ts, pre_str)) # 最近一周 week_ts, week_str = get_weeks_st_et(weeks=1) print('最近周: {}/{}'.format(week_ts, week_str)) # 最近1个月 month_ts, month_str = get_months_st_et(months=1) print('最近月: {}/{}'.format(month_ts, month_str)) # 最近一年 year_ts, year_str = get_years_st_et(years=1) print('最近年: {}/{}'.format(year_ts, year_str))

2、time类

datetime.time(hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] )

静态方法和字段

time.min、time.max:time类所能表示的最小、最大时间。其中,time.min = time(0, 0, 0, 0), time.max = time(23, 59, 59, 999999);time.resolution:时间的最小单位,这里是1微秒;

方法和属性

t1 = datetime.time(10,23,15)#time对象t1.hour、t1.minute、t1.second、t1.microsecond:时、分、秒、微秒;t1.tzinfo:时区信息;t1.replace([ hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] ):创建一个新的时间对象,用参数指定的时、分、秒、微秒代替原有对象中的属性(原有对象仍保持不变);t1.isoformat():返回型如"HH:MM:SS"格式的字符串表示;t1.strftime(fmt):同time模块中的format;

from datetime import *tm = time(23, 46, 10)print 'tm:', tmprint 'hour: %d, minute: %d, second: %d, microsecond: %d' % (tm.hour, tm.minute, tm.second, tm.microsecond)tm1 = tm.replace(hour=20)print 'tm1:', tm1print 'isoformat():', tm.isoformat()print 'strftime()', tm.strftime("%X")#Output==============================================# tm: 23:46:10# hour: 23, minute: 46, second: 10, microsecond: 0# tm1: 20:46:10# isoformat(): 23:46:10# strftime() 23:46:10

3、datetime类

datetime相当于date和time结合起来。

datetime.datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] )

静态方法和字段

datetime.today():返回一个表示当前本地时间的datetime对象;datetime.now([tz]):返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间;datetime.utcnow():返回一个当前utc时间的datetime对象;#格林威治时间datetime.fromtimestamp(timestamp[, tz]):根据时间戮创建一个datetime对象,参数tz指定时区信息;datetime.utcfromtimestamp(timestamp):根据时间戮创建一个datetime对象;datetime.combine(date, time):根据date和time,创建一个datetime对象;datetime.strptime(date_string, format):将格式字符串转换为datetime对象;

from datetime import *import timeprint 'datetime.max:', datetime.maxprint 'datetime.min:', datetime.minprint 'datetime.resolution:', datetime.resolutionprint 'today():', datetime.today()print 'now():', datetime.now()print 'utcnow():', datetime.utcnow()print 'fromtimestamp(tmstmp):', datetime.fromtimestamp(time.time())print 'utcfromtimestamp(tmstmp):', datetime.utcfromtimestamp(time.time())#output======================# datetime.max: 9999-12-31 23:59:59.999999# datetime.min: 0001-01-01 00:00:00# datetime.resolution: 0:00:00.000001# today(): 2016-10-26 23:12:51.307000# now(): 2016-10-26 23:12:51.307000# utcnow(): 2016-10-26 15:12:51.307000# fromtimestamp(tmstmp): 2016-10-26 23:12:51.307000# utcfromtimestamp(tmstmp): 2016-10-26 15:12:51.307000

方法和属性:

dt=datetime.now()#datetime对象dt.year、month、day、hour、minute、second、microsecond、tzinfo:dt.date():获取date对象;dt.time():获取time对象;dt. replace ([ year[ , month[ , day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] ] ] ]):dt. timetuple ()dt. utctimetuple ()dt. toordinal ()dt. weekday ()dt. isocalendar ()dt. isoformat ([ sep] )dt. ctime ():返回一个日期时间的C格式字符串,等效于time.ctime(time.mktime(dt.timetuple()));dt. strftime (format)

4、timedelta类,时间加减

使用timedelta可以很方便的在日期上做天days,小时hour,分钟,秒,毫秒,微妙的时间计算,如果要计算月份则需要另外的办法。

#coding:utf-8from datetime import *dt = datetime.now()#日期减一天dt1 = dt + timedelta(days=-1)#昨天dt2 = dt - timedelta(days=1)#昨天dt3 = dt + timedelta(days=1)#明天delta_obj = dt3-dtprint type(delta_obj),delta_obj# 1 day, 0:00:00print delta_obj.days ,delta_obj.total_seconds()#1 86400.0

5、tzinfo时区类

#! /usr/bin/python# coding=utf-8from datetime import datetime, tzinfo,timedelta"""tzinfo是关于时区信息的类tzinfo是一个抽象类,所以不能直接被实例化"""class UTC(tzinfo): """UTC""" def __init__(self,offset = 0): self._offset = offset def utcoffset(self, dt): return timedelta(hours=self._offset) def tzname(self, dt): return "UTC +%s" % self._offset def dst(self, dt): return timedelta(hours=self._offset)#北京时间beijing = datetime(2011,11,11,0,0,0,tzinfo = UTC(8))print "beijing time:",beijing#曼谷时间bangkok = datetime(2011,11,11,0,0,0,tzinfo = UTC(7))print "bangkok time",bangkok#北京时间转成曼谷时间print "beijing-time to bangkok-time:",beijing.astimezone(UTC(7))#计算时间差时也会考虑时区的问题timespan = beijing - bangkokprint "时差:",timespan#Output==================# beijing time: 2011-11-11 00:00:00+08:00# bangkok time 2011-11-11 00:00:00+07:00# beijing-time to bangkok-time: 2011-11-10 23:00:00+07:00# 时差: -1 day, 23:00:00

去期待陌生,去拥抱惊喜。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:从通俗易懂的角度来看python
下一篇:java实现马踏棋盘的算法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~