常用的处理时间的类介绍
在日常开发和数据处理的过程中,难免会遇到一些时间的处理,接下来介绍python是如何处理时间的。
datetime
类是 Python 标准库中最常用的用于处理时间和日期的类。它包含了许多方法来获取当前日期和时间,计算时间差,转换日期和时间等操作。time
类是datetime
类的一个子类,它只包含时间,不包含日期。它的构造函数可以接受一个以浮点数表示的小时数和分钟数作为参数,也可以接受一个字符串格式的时间作为参数。它提供了获取和处理时间的操作,如获取当前时间、计算时间差、格式化时间等。calendar
模块提供了一些用于处理日期和时间的函数,例如计算给定日期的下一个工作日、计算两个日期之间的天数差、计算给定日期所在的星期几等。此外,calendar
模块还提供了一些用于将日期转换为特定格式字符串的函数,例如将日期转换为 ISO 格式字符串、将日期转换为 URL 友好格式字符串等。dateutil
它提供一些额外的功能来解析和操作日期和时间,它能够处理格式复杂的日期字符串,这是一个非官方的python库。
获取当前时间
>>> import datetime
# 获取当前时间
>>> print(datetime.datetime.now())
2023-08-05 00:30:02.587510
# 获取当前时间的年/月/日/时/分/秒/微/秒
>>> print(datetime.datetime.now().year)
... print(datetime.datetime.now().month)
... print(datetime.datetime.now().day)
... print(datetime.datetime.now().hour)
... print(datetime.datetime.now().minute)
... print(datetime.datetime.now().second)
... print(datetime.datetime.now().microsecond)
2023
8
5
0
30
2
587510
# 获取当前时间的星期,周一到周日对应的返回值为0-6
# 今天是周六,则返回5
>>> print(datetime.datetime.now().weekday())
5
时间计算
用datetime.timedelta可以实现时间/日期的差值计算,该函数可支持的时间单位:
weeks,days, hours, minutes, seconds, milliseconds, microseconds
>>> print(datetime.datetime.now())
2023-08-05 11:26:33.590909
# 当前时间减1天
>>> print(datetime.datetime.now() + datetime.timedelta(days=-1))
2023-08-04 11:26:33.590909
# 当前时间加1周
>>> print(datetime.datetime.now() + datetime.timedelta(weeks=1))
2023-08-12 11:47:14.573496
# 可支持多个单位混合
>>> print(datetime.datetime.now()+datetime.timedelta(weeks=1, days=1, hours=2, minutes=3, seconds=4, milliseconds=5, microseconds=6))
2023-08-13 13:29:11.519236
注意到上面的单位没有月份和年份,如果要进行月份或者年份的加减,可以使用dateutil中的relativedelta。
from dateutil.relativedelta import relativedelta
>>> print((datetime.date.today()-relativedelta(years=1)))
2022-08-05
>>> print((datetime.date.today()-relativedelta(months=1)))
2023-07-05
# 这里的参数也可以混用
>>> print((datetime.date.today()-relativedelta(years=1, months=1)))
2022-07-05
注意,上述的参数为复数,若为单数,则为直接设置年和月的值。
# 将月份设置为1
>>> print((datetime.date.today()-relativedelta(month=1)))
2023-01-05
# 将年份设置为1999
>>> print((datetime.date.today()-relativedelta(year=1999)))
1999-08-05
格式转换
日期和时间有以下几种表示方法
datetime类型
python中datetime的一个对象
数值型
- UNIXTIMESTAMP是一种时间表示方式,它是从1970年1月1日00:00:00 UTC起至现在的总秒数,不考虑闰秒。这种时间表示方式在Unix和类Unix系统中广泛使用。
字符型
在展示时间时,都会以字符的形式记录并展示出来,字符型的时间,有多种形式:
- ISO 8601:这是一种国际标准的日期和时间表示方式,格式为YYYY-MM-DDTHH:mm:ss.sssZ,其中 YYYY 代表四位数年份,MM 代表月份,DD 代表天数,T 作为日期和时间的分隔符,HH 代表小时,mm 代表分钟,ss.sss 代表秒和毫秒,Z 代表时区。例如:2023-04-13T15:30:00.000Z
- RFC 3339:这是一种在互联网上广泛使用的日期和时间表示方式,它基于 ISO 8601 格式,但对其进行了一些扩展,例如允许使用非零开头的小时、分钟和秒。例如:2023-04-13T15:30:00Z
- RFC 2822:这是一种用于电子邮件日期和时间表示的格式,例如:Thu, 13 Apr 2023 15:30:00 +0000
- 自然语言表示:以人类易读的方式表示日期和时间,例如:April 13, 2023, 3:30 PM
- 中文日期表示:用汉字表示日期和时间,例如:2023年4月13日 15:30
datetime和字符的转换是最常见的形式,可以用日期时间格式中的占位符来灵活生成想要的日期格式,常用的日期时间格式的可参见文末。
import datetime
#把datetime转成字符串
def datetime_toString(dt):
return dt.strftime("%Y-%m-%d %H:%M:%S")
#把字符串转成datetime
def string_toDatetime(string):
return datetime.datetime.strptime(string, "%Y-%m-%d %H:%M:%S")
#把字符串转成时间戳形式
def string_toTimestamp(strTime):
return time.mktime(string_toDatetime(strTime).timetuple())
#把时间戳转成字符串形式
def timestamp_toString(stamp):
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(stamp))
#把datetime类型转外时间戳形式
def datetime_toTimestamp(dateTime):
return time.mktime(dateTime.timetuple())
#把时间戳转datetime类型
def timestamp_toDatetime(stamp):
return datetime.datetime.fromtimestamp(stamp)
输出结果:
# datatime时间格式
>>> dt = datetime.datetime.now()
>>> dt
datetime.datetime(2023, 8, 5, 16, 15, 42, 639332)
# 转string
>>> datetime_toString(dt)
'2023-08-05 16:15:42'
# string转datetime
# 注意,dt转字符串再转回dt,如果转字符串的过程中内容不完整,则会造成时间精度的丢失
>>> string_toDatetime('2023-08-05 16:15:42')
datetime.datetime(2023, 8, 5, 16, 15, 42)
# string转timestamp
>>> string_toTimestamp('2023-08-05 16:15:42')
1691223342.0
# timestamp转string
>>> timestamp_toString(1691223342.0)
'2023-08-05 16:15:42'
# datetime转timestamp
>>> datetime_toTimestamp(dt)
1691223342.0
# timestamp转datetime
>>> timestamp_toDatetime(1691223342.0)
datetime.datetime(2023, 8, 5, 16, 15, 42)
进一步验证unix时间戳的转换的准确型,可以借助一些第三方网站:www.usey.cn/timestamp
时区转换
地球的自转导致了不同经度的地方会有不同的日出和日落时间,因为地理位置的差异。不同地区所使用的本地时间也不同,时区(Time Zone)是为了解决时间差异而设立的一种区域划分。全球被划分为24个时区,以经度为依据,每个时区跨越经度15度。时区的起点是本初子午线(0度经线),向东和向西分别形成东1至东12区和西1至西12区,共计24个时区。每个时区包含1小时的时差。
UTC时间(协调世界时)是一种以地球自转为基础的时间标准,它由国际原子时间(TAI)和地球自转相结合得到。在UTC中,一天的开始是午夜,即00:00,而一年的开始是1月1日。
需要注意的是,UTC时间和UNIXTIMESTAMP都是基于同样的时间起点,但是它们的时间单位不同。UTC时间是以天为单位,而UNIXTIMESTAMP是以秒为单位。
在正常使用datetime模块时,会自动加载系统环境变量中所设置的时区。
>>> print(dt.tzinfo)
Asia/Shanghai
那么不同的时区之间,该如何转换呢,这里介绍一个python转换时区的类pytz,pytz是一个用于处理时区的Python库,它提供了一个方便的方式来处理时区,并支持世界上大多数地区的时区。pytz库中包含了许多常见的时区,例如UTC、America/New_York、Asia/Shanghai等。
>>> import pytz
>>> dt = datetime.datetime.now()
>>> dt
datetime.datetime(2023, 8, 5, 16, 15, 42, 639332)
>>> utc_tz = pytz.timezone('UTC')
# 本地时间(北京时间)转utc时间
>>> dt.astimezone(utc_tz)
datetime.datetime(2023, 8, 5, 8, 15, 42, 639332, tzinfo=<UTC>)
# 本地时间(北京时间)转纽约时间
>>> ny_tz = pytz.timezone('America/New_York')
>>> dt.astimezone(ny_tz)
datetime.datetime(2023, 8, 5, 4, 15, 42, 639332, tzinfo=<DstTzInfo 'America/New_York' EDT-1 day, 20:00:00 DST>)
常用的时间格式
%Y:四位数的年份(例如:2023)
%y:两位数的年份(例如:23)
%m:两位数的月份(范围从01到12)
%d:两位数的日期(范围从01到31)
%H:24小时制的小时数(范围从00到23)
%I:12小时制的小时数(范围从01到12)
%p:AM或PM,仅在12小时制中使用
%M:两位数的时间分钟数(范围从00到59)
%S:两位数的时间秒数(范围从00到60,包含闰秒)
%f:六位数的微秒数(例如:000000)
%z:UTC偏移量,表示为±HHMM(例如:+0200)
%Z:时区名称(例如:"UTC")
%j:三位数的年份中的第几天(范围从001到366)
%U或%W:当前年份中的周数,从周日开始计算,范围从00到53
%W:当前年份中的周数,从周一开始计算,范围从01到53
%a:星期的简写名(例如:"Mon")
%A:星期的全名(例如:"Monday")
%b:月份的简写名(例如:"Jan")
%B:月份的全名(例如:"January")
%c:本地日期和时间的表示方式
%C:两位数的年份的前两位数字(范围从00到99)
%e:两位数的日期中的空白字符(例如:" 6")
%D:两位数的年份中的第几天(范围从01到366,"/"表示日期的月份和日期)
%F:四位数的年份(例如:"2023")
%G:四位数的年份中的周数,范围从0001到9999
%g:四位数的年份中的周数,范围从9999到0001
%h:月份的简写名(同%b)
%H:24小时制的小时数(范围从00到23)
%i:小时数,范围从01到12
%j:三位数的年份中的第几天(范围从001到366)
%m:两位数的月份(范围从01到12)
%n:换行符
%M:分钟数,范围从00到59
%p:AM或PM,仅在12小时制中使用
%r:12小时制的时间,包括AM或PM
%R:24小时制的时间,格式为HH:MM
%s:自1970年1月1日以来的秒数
%S:秒数,范围从00到60,包含闰秒
%t:制表符
%T:24小时制的时间,格式为HH:MM:SS
%u:一周中的第几天,范围从1(星期一)到7(星期日)
%U或%W:当前年份中的周数,从周日开始计算,范围从00到53
%w:一周中的第几天,范围从0(星期日)到6(星期六)
%W:当前年份中的周数,从周一开始计算,范围从01到53