Pyhton--日期与时间
日期和时间模块
-
time 和 calendar 模块可以用于格式化日期和时间,time模块下有很多函数可以转换日期。
-
time.time() 返回当前时间戳 浮点数
-
localtime() 将时间戳返回 时间元组 struct_time类
-
time.localtime(time.time()) 输出 time.struct_time(tm_year=2016, tm_mon=4, tm_mday=7, tm_hour=10, tm_min=28, tm_sec=49, tm_wday=3, tm_yday=98, tm_isdst=0)
序号
|
属性
|
值
|
---|---|---|
0
|
tm_year
|
2008
|
1
|
tm_mon
|
1 到 12
|
2
|
tm_mday
|
1 到 31
|
3
|
tm_hour
|
0 到 23
|
4
|
tm_min
|
0 到 59
|
5
|
tm_sec
|
0 到 61 (60或61 是闰秒)
|
6
|
tm_wday
|
0到6 (0是周一)
|
7
|
tm_yday
|
一年中的第几天,1 到 366
|
8
|
tm_isdst
|
是否为夏令时,值有:1(夏令时)、0(不是夏令时)、-1(未知),默认 -1
|
-
time.asctime() 函数, 将时间元祖转为简单的可读格式。
# localtime() 时间戳转时间元组 time()获取当前时间戳 localtime = time.localtime(time.time()) print(type(localtime)) # <class 'time.struct_time'> print(localtime.tm_year) # 2022 print(localtime[0]) # 2022 # mktime() 时间元组转时间戳 mktime = time.mktime(localtime) print(mktime) # 1642299718.0 # asctime() 将时间元祖转为简单的可读格式 asctime = time.asctime(localtime) print(asctime) # Sat Jan 15 21:37:16 2022 # strftime() 将时间元组格式化输出字符串,不填默认当前 strftime1 = time.strftime("%Y-%m-%d %H:%M:%S", localtime) print(strftime1) # strptime() 将格式化的字符串转为时间元组 strptime1 = time.strptime("Sun Jan 16 10:06:32 2022", "%a %b %d %H:%M:%S %Y") print(strptime1) # sleep() 线程睡眠 time.sleep(1.5) # perf_counter() 返回系统运行时间,由于基准点未定义,只有连续调用的差值是有效的。 print(time.perf_counter()) # 213492.5056599 time.sleep(3.33) print(time.perf_counter()) # 213495.8365289 # process_time() 返回进程运行时间,由于基准点未定义,只有连续调用的差值是有效的。 print(time.process_time())
#进度条实例 scale = 50 print("执行开始".center(scale // 2, "-")) # .center() 控制输出的样式,宽度为 25//2,即 22,汉字居中,两侧填充 - start = time.perf_counter() # 调用一次 perf_counter(),从计算机系统里随机选一个时间点A,计算其距离当前时间点B1有多少秒。当第二次调用该函数时,默认从第一次调用的时间点A算起,距离当前时间点B2有多少秒。两个函数取差,即实现从时间点B1到B2的计时功能。 for i in range(scale + 1): a = '*' * i # i 个长度的 * 符号 b = '.' * (scale - i) # scale-i) 个长度的 . 符号。符号 * 和 . 总长度为50 c = (i / scale) * 100 # 显示当前进度,百分之多少 dur = time.perf_counter() - start # 计时,计算进度条走到某一百分比的用时 print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c, a, b, dur), end='') # \r用来在每次输出完成后,将光标移至行首,这样保证进度条始终在同一行输出,即在一行不断刷新的效果;{:^3.0f},输出格式为居中,占3位,小数点后0位,浮点型数,对应输出的数为c;{},对应输出的数为a;{},对应输出的数为b;{:.2f},输出有两位小数的浮点数,对应输出的数为dur;end='',用来保证不换行,不加这句默认换行。 time.sleep(0.1) # 在输出下一个百分之几的进度前,停止0.1秒 print("\n" + "执行结果".center(scale // 2, '-'))
-
Calendar模块
-
星期一是默认的每周第一天,星期天是默认的最后一天。更改设置需调用calendar.setfirstweekday()函数
序号
|
函数及描述
|
---|---|
1
|
calendar.calendar(year,w=2,l=1,c=6) 返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c。 每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。
|
2
|
calendar.firstweekday( ) 返回当前每周起始日期的设置。默认情况下,首次载入caendar模块时返回0,即星期一。
|
3
|
calendar.isleap(year)
是闰年返回 True,否则为 false。 >>> import calendar >>> print(calendar.isleap(2000))True>>> print(calendar.isleap(1900))False
|
4
|
calendar.leapdays(y1,y2) 返回在Y1,Y2两年之间的闰年总数。
|
5
|
calendar.month(year,month,w=2,l=1) 返回一个多行字符串格式的year年month月日历,两行标题,一周一行。每日宽度间隔为w字符。每行的长度为7* w+6。l是每星期的行数。
|
6
|
calendar.monthcalendar(year,month) 返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。
|
7
|
calendar.monthrange(year,month)
返回两个整数。第一个是该月的星期几,第二个是该月有几天。星期几是从0(星期一)到 6(星期日)。 >>> import calendar >>> calendar.monthrange(2014, 11)(5, 30)
(5, 30)解释:5 表示 2014 年 11 月份的第一天是周六,30 表示 2014 年 11 月份总共有 30 天。 |
8
|
calendar.prcal(year, w=0, l=0, c=6, m=3) 相当于 print (calendar.calendar(year, w=0, l=0, c=6, m=3))。
|
9
|
calendar.prmonth(theyear, themonth, w=0, l=0) 相当于 print(calendar.month(theyear, themonth, w=0, l=0))。
|
10
|
calendar.setfirstweekday(weekday) 设置每周的起始日期码。0(星期一)到6(星期日)。
|
11
|
calendar.timegm(tupletime) 和time.gmtime相反:接受一个时间元组形式,返回该时刻的时间戳(1970纪元后经过的浮点秒数)。
|
12
|
calendar.weekday(year,month,day) 返回给定日期的日期码。0(星期一)到6(星期日)。月份为 1(一月) 到 12(12月)。
|
-
datetime模块
-
注意到datetime是模块,datetime模块还包含一个datetime类,通过from datetime import datetime导入的才是datetime这个类。
-
如果仅导入import datetime,则必须引用全名datetime.datetime。
-
创建datetime对象,now() utcnow()或者datetime(),datetime.now()返回当前日期和时间,其类型是datetime对象。或者datetime(2022,1,14,12,55)
-
将datetime对象转时间戳,datetime.timestamp(dt) 或 dt.timestamp()
-
fromtimestamp() utcfromtimestamp() 时间戳转datetime对象,默认本地时间时区
-
strptime() 将格式化字符转为datetime对象,转换没有时区
-
datetime加减得到新的datetime对象,需导入timedelta类
-
#时区转换,一个datetime类型有一个时区属性tzinfo,但是默认为None,所以无法区分这个datetime到底是哪个时区,除非强行给datetime设置一个时区
-
#时区转换的关键在于,拿到一个datetime时,要获知其正确的时区,然后强制设置时区,作为基准时间。
-
#利用带时区的datetime,通过astimezone()方法,可以转换到任意时区。
-
如果要存储datetime,最佳方法是将其转换为timestamp再存储,因为timestamp的值与时区完全无关
-
astimezone() 进行时区转换
now = datetime.now() print(now) print(type(now)) #<class 'datetime.datetime'> dt = datetime(2022,1,14,11,55) #构造一个datetime对象,时区不设置默认None本地时间 print(dt) print(type(dt)) #<class 'datetime.datetime'> # timestamp() 转时间戳 ts = dt.timestamp() print(datetime.timestamp(dt)) print(ts) # fromtimestamp() utcfromtimestamp() 时间戳转datetime对象,默认本地时间时区 print(datetime.fromtimestamp(ts)) print(datetime.utcfromtimestamp(ts)) # strptime() 将格式化字符转为datetime对象,转换没有时区 print(datetime.strptime('2015-6-1 18:19:59','%Y-%m-%d %H:%M:%S')) # strftime() 将datetime对象转为格式化字符串 print(dt.strftime("%Y--%m--%d %H:%M:%S")) # datetime加减得到新的datetime对象,需导入timedelta类, print(dt + timedelta(hours=7)) print(dt - timedelta(days=2,hours=6)) #时区转换,一个datetime类型有一个时区属性tzinfo,但是默认为None,所以无法区分这个datetime到底是哪个时区,除非强行给datetime设置一个时区 #时区转换的关键在于,拿到一个datetime时,要获知其正确的时区,然后强制设置时区,作为基准时间。 #利用带时区的datetime,通过astimezone()方法,可以转换到任意时区。 # 创建一个时区 tz_utc_8 = timezone(timedelta(hours=8)) # 强制设置时区为utf8,如果系统时间正确才可以这样设置 print(datetime.now().replace(tzinfo=tz_utc_8)) # 拿到UTC时间,并强制设置时区为UTC+0:00: utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc) # astimezone() 进行时区转换 print(utc_dt.astimezone(timezone(timedelta(hours=8)))) print(utc_dt.astimezone(timezone(timedelta(hours=9)))) print(utc_dt.astimezone(timezone(timedelta(hours=4))))