python时间处理模块(calendar,time,datetime,arrow)

前言

时间我们平常大部分都接触到,在生活上早上七点五十起床,七点五十就是时间;在开发中我们有时候对某些操作需要记录时间,新增操作时间字段,这又涉及到了时间。接下来我们简单对python的时间处理进行简单的总结。在工作中我们大部分用time或者datetime函数进行时间处理,今天我就总结这两模块外,再新增calendar,arrow这两位成员,好啦下面我们开始讲解。

time

time模块是涉及到时间功能中最常用的一个模块,在开发中我们使用很频繁的一个模块。

time

返回当前时间的时间戳(1970纪元后经过的浮点秒数)

>>>import time
>>>time.time()
1610867607.4679744

altzone

返回格林威治西部的夏令时地区的偏移秒数。如果该地区在格林威治东部会返回负值

>>>import time
>>>time.altzone
-32400

localtime

格式化当前时间戳,返回元组格式,另外注意的是可以传入参数,则从1970开始计算时间

>>>import time
>>>time.localtime()
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=17, tm_hour=15, tm_min=16, tm_sec=30, tm_wday=6, tm_yday=17, tm_isdst=0)
>>>
>>>time.localtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
>>>time.localtime(1)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=1, tm_wday=3, tm_yday=1, tm_isdst=0)
>>>time.time()
>>>1610868273.6466053
>>>time.localtime(1610868273.6466053)
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=17, tm_hour=15, tm_min=24, tm_sec=33, tm_wday=6, tm_yday=17, tm_isdst=0)

mktime

time mktime() 函数执行与gmtime(), localtime()相反的操作,它接收struct_time对象作为参数,返回用秒数来表示时间的浮点数

>>>import time
>>>time.mktime(time.localtime())
1610868588.0

gmtime

将格式化时间装换时间戳

>>>import time
>>>time.gmtime(time.time())
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=17, tm_hour=7, tm_min=29, tm_sec=17, tm_wday=6, tm_yday=17, tm_isdst=0)

asctime

接受时间元组并返回一个可读的形式字符串,可以通过localtime也可以自己定义

>>>import time 
>>>time.asctime(time.localtime())
'Sun Jan 17 15:33:29 2021'
>>>
>>>t = (2018,5,27,1,5,27,6,147,-1)
>>>time.asctime(t)
'Sun May 27 01:05:27 2018'

ctime

把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式(可读的形式字符串),默认当前时间,也可以手动传入

>>>import time
>>>time.ctime()
'Sun Jan 17 15:38:09 2021'
>>>time.ctime(time.time())
'Sun Jan 17 15:38:17 2021'

strftime

按照我们指定的格式将时间元组转化为字符串;如果不指定时间元组,默认是当前时间localtime()

时间格式如下

>>>import time
>>>time.strftime("%y-%m-%d")
'21-01-17'

strptime

将字符串转化为时间元组(与strftime相反),需要传入参数:待转化的字符串, 时间字符串对应的格式(如上图所示)

>>>import time
>>>time.strptime(time.strftime("%y-%m-%d"),"%y-%m-%d")
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=17, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=17, tm_isdst=-1)

sleep

推迟调用线程的运行, 需要传入参数

>>>import time
>>>time.sleep(5)

datetime

date

日期对象(年月日)

1- 相关属性

>>>datetime.date.today().year  # 年
2021
>>>datetime.date.today().month #月
1
>>>datetime.date.today().day #日
17
>>>datetime.date.today()  #当天日期
datetime.date(2021, 1, 17)
>>>datetime.date.today().ctime()  # 返回日期的字符串
'Sun Jan 17 00:00:00 2021'
>>>datetime.date.today().weekday()  # 星期几
6
>>>datetime.date.today().toordinal()  # 返回公历日期的序数
737807
>>>datetime.date.today().isocalendar()  # 返回一个元组:一年中的第几周,星期几
(2021, 2, 7)

2- 时间转换

>>>import datetime
>>>datetime.date.today().toordinal() # 转换时间戳
737807
>>>datetime.date.fromordinal(737807) # 转换时间
datetime.date(2021, 1, 17)
>>>datetime.date.fromtimestamp(time.time())  # 时间戳转时间
datetime.date(2021, 1, 17)
>>>datetime.date.today().strftime("%Y-%m-%d")  # 转换具体格式
'2021-01-17'
>>>a = datetime.date(2020,1,1)  # 修改日期
>>>a.replace(2021,1,17)
datetime.date(2021, 1, 17)

time

时间对象(时分秒)

>>>import datetime
>>>datetime.time(1,1,1).hour #时
1
>>>datetime.time(1,1,1).minute #分
1
>>>datetime.time(1,1,1).second # 秒
1

datetime

包含date类和time类,这个方法我们开发时候经常用

from datetime import datetime, date, time

print("当天时间:", datetime.today())
print("当天时间:",datetime.now())
print("国际当前时间:",datetime.utcnow())  # 返回当前UTC日期和时间的datetime对象
print("时间戳转时间",datetime.fromtimestamp(1610888455))  # 时间戳的datetime对象
print(datetime.fromordinal(699000))
print("拼接时间",datetime.combine(date(2021, 1, 17), time(22, 21, 51)))  # 拼接日期和时间
print(datetime.strptime("2020-12-25", "%Y-%m-%d"))


d = datetime(2021,1,17,22,24,23)
print("当前日期:", d.date())
print("当前时间:", d.time())
print("返回时间:", d.timetz())  # 从datetime中拆分出具体时区属性的time
print("时间替换", d.replace(year=2021,month=1, day=18))  # 替换
print(d.timetuple())  # 时间元组
print(d.toordinal())  # 和date.toordinal一样
print("第几周",d.weekday())
print("星期", d.isoweekday())
print(d.isocalendar()) # 返回那年,第几周, 周几
print(d.isoformat())
print(d.strftime("%Y-%m-%d :%H:%M:%S"))


############返回
当天时间: 2021-01-17 21:03:52.467134
当天时间: 2021-01-17 21:03:52.467601
国际当前时间: 2021-01-17 13:03:52.467601
时间戳转时间 2021-01-17 21:00:55
1914-10-19 00:00:00
拼接时间 2021-01-17 22:21:51
2020-12-25 00:00:00
当前日期: 2021-01-17
当前时间: 22:24:23
返回时间: 22:24:23
时间替换 2021-01-18 22:24:23
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=17, tm_hour=22, tm_min=24, tm_sec=23, tm_wday=6, tm_yday=17, tm_isdst=-1)
737807
第几周 6
星期 7
(2021, 2, 7)
2021-01-17T22:24:23
2021-01-17 :22:24:23

timedelta

一个时间段,即两个日期date或者日期时间datetime之间的差;支持参数:weeks、days、hours、minutes、seconds、milliseconds、microseconds

>>>from datetime import date, datetime, timedelta
>>>td = datetime.today()
>>>td
datetime.datetime(2021, 1, 17, 21, 12, 1, 106864) 
>>>td +timedelta(hours=1)  # 加一小时
datetime.datetime(2021, 1, 17, 22, 12, 1, 106864)
>>>td +timedelta(minutes=1) # 加一分
datetime.datetime(2021, 1, 17, 21, 13, 1, 106864)
>>>td +timedelta(weeks=1) # 加一周
datetime.datetime(2021, 1, 24, 21, 12, 1, 106864)
>>>datetime.now() - datetime(2021, 1,1,1,1,)  
datetime.timedelta(days=16, seconds=72789, microseconds=620600)
>>>de = datetime.now() - datetime(2021, 1,1,1,1,) #时间差
>>>de.days  #差的天数
16
>>>de.seconds  #差的描述  指的是整天差的
72798
>>>de.total_seconds()  # 全部的秒数
1455198.618413

tzinfo

本地时间指的是我们系统本身设定时区的时间,例如中国处于北京时间,常说的东八区UTC+8:00

from datetime import datetime, timezone, timedelta
now_t = timezone(timedelta(hours=8)) #创建时区
print("创建时区:" ,now_t )
now = datetime.now()
print("现在时间:", now)
# 加8小时
new = now.replace(tzinfo=timezone(timedelta(hours=8)))
print(("加8小时时区:", new))


now = datetime.utcnow().replace(tzinfo=timezone.utc)  # 指定utc时区
print(now)
bj = now.astimezone(timezone(timedelta(hours=8)))  # 通过astimezone切换到东八区
print("bj:", bj)

tk = now.astimezone(timezone(timedelta(hours=9)))  # UTC时区切换到东九区:东京时间
print("tk:", tk)

tk_new = bj.astimezone(timezone(timedelta(hours=9)))  # 北京时间(东八区)直接切换到东京时间(东九区)

print("tk_new:", tk_new)



calendar

此模块的函数都是日历相关的,例如打印某月的字符月历

calendar

返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c, 每日宽度间隔为w字符,l是每星期行数。


import calendar
print(calendar.calendar(2021, w=2, l=1, c=6))

返回数据

                                  2021

      January                   February                   March
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
             1  2  3       1  2  3  4  5  6  7       1  2  3  4  5  6  7
 4  5  6  7  8  9 10       8  9 10 11 12 13 14       8  9 10 11 12 13 14
11 12 13 14 15 16 17      15 16 17 18 19 20 21      15 16 17 18 19 20 21
18 19 20 21 22 23 24      22 23 24 25 26 27 28      22 23 24 25 26 27 28
25 26 27 28 29 30 31                                29 30 31

       April                      May                       June
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
          1  2  3  4                      1  2          1  2  3  4  5  6
 5  6  7  8  9 10 11       3  4  5  6  7  8  9       7  8  9 10 11 12 13
12 13 14 15 16 17 18      10 11 12 13 14 15 16      14 15 16 17 18 19 20
19 20 21 22 23 24 25      17 18 19 20 21 22 23      21 22 23 24 25 26 27
26 27 28 29 30            24 25 26 27 28 29 30      28 29 30
                          31

        July                     August                  September
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
          1  2  3  4                         1             1  2  3  4  5
 5  6  7  8  9 10 11       2  3  4  5  6  7  8       6  7  8  9 10 11 12
12 13 14 15 16 17 18       9 10 11 12 13 14 15      13 14 15 16 17 18 19
19 20 21 22 23 24 25      16 17 18 19 20 21 22      20 21 22 23 24 25 26
26 27 28 29 30 31         23 24 25 26 27 28 29      27 28 29 30
                          30 31

      October                   November                  December
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
             1  2  3       1  2  3  4  5  6  7             1  2  3  4  5
 4  5  6  7  8  9 10       8  9 10 11 12 13 14       6  7  8  9 10 11 12
11 12 13 14 15 16 17      15 16 17 18 19 20 21      13 14 15 16 17 18 19
18 19 20 21 22 23 24      22 23 24 25 26 27 28      20 21 22 23 24 25 26
25 26 27 28 29 30 31      29 30                     27 28 29 30 31

firstweekday

返回当前每周起始日期的设置。默认情况下,首次载入 calendar 模块时返回 0,即星期一。 

import calendar

print(calendar.firstweekday())

>>> 0

isleap

是闰年返回 True,否则为 False。

import calendar

print(calendar.isleap(2000))

>>>True

leapdays(a,b)

返回在a,b两年之间的闰年总数。(左开右闭原则)

import calendar

print(calendar.leapdays(2000,2021))

month

该函数返回的是year年的month月的日历,只有两行标题,一周一行。每日间隔宽度为w个字符,每行的长度为7*w + 6,其中l是每星期的行数

import calendar

print(calendar.month(2021, 1, w=2, l=1))
    January 2021
Mo Tu We Th Fr Sa Su
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

monthcalendar

返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。

import calendar

print(calendar.monthcalendar(2021,1))

>>>[[0, 0, 0, 0, 1, 2, 3], [4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23, 24], [25, 26, 27, 28, 29, 30, 31]]

monthrange

该函数返回的结果是一个元组,元组中有两个数值(a,b), 数值a代表的是该月从星期几开始;规定6代表星期天,取值为0-6,数值b代表该月总共有多少天

import calendar

print(calendar.monthrange(2021,1))

>>>(4, 31)

weekday

weekday方法是输入年月日,我们便可知道这天是星期几;返回值是0-6,0代表星期1,6代表星期天

import calendar

print(calendar.weekday(2021,1,3))

>>>6

arrow

Arrow是一个Python库,为创建,操作,格式化和转换日期,时间和时间戳提供了一种明智的,人性化的方法

简单例子

import arrow
utc = arrow.utcnow()  # 获取世界标准时间
print("获取世界标准时间:",utc)
now = arrow.now()  # 获取本地时间
print("获取本地时间:",now)
print("获取指定时区的时间:",arrow.now('US/Pacific'))


arw = arrow.now()  # 实例化
print("当前时间:", arw)
print("当前年:", arw.year)
print("当前月:", arw.month)
print("当前天:", arw.day)
print("当前时:", arw.hour)
print("当前分:", arw.minute)
print("当前秒:", arw.second)
print("获取时间戳:", arw.timestamp)
print("当前年:", arw.float_timestamp)
print("浮点数时间戳:", arw.replace(hour=20,minute=00))


返回結果

当前时间: 2021-01-17T22:02:47.878933+08:00
当前年: 2021
当前月: 1
当前天: 17
当前时: 22
当前分: 2
当前秒: 47
获取时间戳: 1610892167
当前年: 1610892167.878933
浮点数时间戳: 2021-01-17T20:00:47.878933+08:00

获取世界标准时间: 2021-01-17T13:56:41.079536+00:00
获取本地时间: 2021-01-17T21:56:41.079536+08:00
获取指定时区的时间: 2021-01-17T05:56:41.193846-08:00

时间迁移

import arrow
arw = arrow.now()  # 实例化
print("当前时间:", arw)
print("往后偏移一年:",  arw.shift(years=+1))
print("往前偏移三天:",  arw.shift(years=-1))
print("往后偏移一月:",  arw.shift(months=+1))
print("往前偏移一月:",  arw.shift(months=-1))
print("往后偏移一周:",  arw.shift(weeks=+1))
print("往前偏移一周:",  arw.shift(weeks=-1))
print("往后偏移三天:",  arw.shift(days=+3))
print("往前偏移三天:",  arw.shift(days=-3))
print("往后偏移三分钟:",  arw.shift(minutes=+3))
print("往前偏移三分钟:",  arw.shift(minutes=-3))
print("往后偏移三秒:",  arw.shift(seconds=+3))
print("往前偏移三秒:",  arw.shift(seconds=-3))

结果

当前时间: 2021-01-17T22:07:08.786150+08:00
往后偏移一年: 2022-01-17T22:07:08.786150+08:00
往前偏移三天: 2020-01-17T22:07:08.786150+08:00
往后偏移一月: 2021-02-17T22:07:08.786150+08:00
往前偏移一月: 2020-12-17T22:07:08.786150+08:00
往后偏移一周: 2021-01-24T22:07:08.786150+08:00
往前偏移一周: 2021-01-10T22:07:08.786150+08:00
往后偏移三天: 2021-01-20T22:07:08.786150+08:00
往前偏移三天: 2021-01-14T22:07:08.786150+08:00
往后偏移三分钟: 2021-01-17T22:10:08.786150+08:00
往前偏移三分钟: 2021-01-17T22:04:08.786150+08:00
往后偏移三秒: 2021-01-17T22:07:11.786150+08:00
往前偏移三秒: 2021-01-17T22:07:05.786150+08:00

时间格式化

import arrow
arw = arrow.now()  # 实例化
print("当前时间:", arw)
print("无格式输出:", arw.format())
print("有格式输出", arw.format('YYYY-MM-DD HH:mm:ss'))
print("返回日期和时间的ctime格式化表示", arw.ctime())
print("以整数形式返回星期几(0-6)", arw.weekday())
print("以整数形式返回一周中的ISO日(1-7)", arw.isoweekday())
print("返回3元组(ISO年,ISO周数,ISO工作日)", arw.isocalendar())
print("返回日期的格雷戈里序数", arw.toordinal())
print("直接生成Arrow对象:", arrow.Arrow(2017, 2, 1))
print("字符串转换成Arrow对象:",arrow.get("2017-01-20 11:30", "YYYY-MM-DD HH:mm"))
print("时间戳转arrow:", arrow.get(1485937858.659424))
当前时间: 2021-01-17T22:17:02.283292+08:00
无格式输出: 2021-01-17 22:17:02+08:00
有格式输出 2021-01-17 22:17:02
返回日期和时间的ctime格式化表示 Sun Jan 17 22:17:02 2021
以整数形式返回星期几(0-6) 6
以整数形式返回一周中的ISO日(1-7) 7
返回3元组(ISO年,ISO周数,ISO工作日) (2021, 2, 7)
返回日期的格雷戈里序数 737807
直接生成Arrow对象: 2017-02-01T00:00:00+00:00
字符串转换成Arrow对象: 2017-01-20T11:30:00+00:00
时间戳转arrow: 2017-02-01T08:30:58.659424+00:00

常用转换

时间戳转日期

time

import time
now_timestamp = time.time()  # 获取当前时间的时间戳

# 时间戳先转成时间元组,strftime在转成指定格式
now_tuple = time.localtime(now_timestamp)
print(time.strftime("%Y-%m-%d %H:%M:%S", now_tuple))

datetime

import datetime, time
timeStamp = time.time()

date_now = datetime.datetime.fromtimestamp(timeStamp)

print(date_now.strftime("%Y-%m-%d %H:%M:%S"))

arrow

import time, arrow
timeStamp = time.time()

date_now = arrow.get(timeStamp)

print(date_now.format("YYYY-MM-DD HH:mm:ss"))

日期转时间戳

import time

# 字符类型的时间
tss1 = '2021-1-17 23:40:00'
# 转为时间数组
timeArray = time.strptime(tss1, "%Y-%m-%d %H:%M:%S")

# 转为时间戳
timeStamp = int(time.mktime(timeArray))
print ("时间戳:", timeStamp)

格式化时间

import time

old = "2021-1-17 23:28:45"

# 1、转换成时间数组
time_array = time.strptime(old, "%Y-%m-%d %H:%M:%S")

# 2、转换成新的时间格式(20201212-20:28:54)
new = time.strftime("%Y--%m--%d  %H:%M:%S",time_array)  # 指定显示格式

print("原格式时间:",old)
print("新格式时间:",new)

学习链接

arrow官方文档

date文档

菜鸟time

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子林_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值