Python时间模块time和datetime学习

本文详细介绍了Python内置的time和datetime模块,包括时间戳、字符串时间、结构化时间的相互转换以及时间计算。time模块提供了时间相关的函数,如获取时间戳、转换为结构化时间等。datetime模块提供了更直观的日期时间处理,包括datetime类、date类、time类和timedelta类,支持日期时间的加减操作。
摘要由CSDN通过智能技术生成

python模块包括标准模块、自定义模块和外部模块。时间模块是python的内部标准模块之一。通常用的是time和datetime模块。

一、time模块

time模块提供了各种时间相关的函数。time模块有三种表示形式:时间戳(timestamp)、字符串时间(format time)、结构化时间(struct_time)。

1.时间戳

时间戳表示从1970年1月1日0点0分0秒开始按秒计算的偏移量。一般整数部分有10位的小数。使用time.time()获取。

import time

time_stamp = time.time()
print(time_stamp)

输出结果:

>>> 1675236262.1582968 

2.字符串时间 

字符串时间,是按照需要的时间格式以字符串的方式返回当前的时间。使用time.strftime(format, p_tuple=None)获取,传参为日期时间格式化符号。

python中常用的日期时间格式化符号:

  • %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 当前时区的名称
  • %% %号本身
print(time.strftime("%Y-%m-%d %H:%M:%S"))

输出结果:

>>> 2023-02-01 15:48:24

3.结构化时间 

结构化时间又称时间元组,这个时间元组共有9个整型内容,分别表示不同的时间含义。使用time.localtime()获取本地时间;或者使用time.gmtime()获取UTC时间(与英国伦敦的时间一致)。

  • tm_year表示年
  • tm_mon表示月
  • tm_mday表示号
  • tm_hour表示小时
  • tm_min表示分种
  • tm_sec表示秒
  • tm_wday表示周几(但是是从0开始,比如星期一为0)
  • tm_yday表示一年的第几天(从1开始,包括当天)
  • tm_isdst表示是否是夏令时(默认为-1,0:表示正常格式,1:表示为夏令时格式,-1:表示根据当前的日期时间格式来判定)
print(time.localtime())

输出结果:

 >>> time.struct_time(tm_year=2023, tm_mon=2, tm_mday=1, tm_hour=16, tm_min=10, tm_sec=53, tm_wday=2, tm_yday=32, tm_isdst=0)

print(time.gmtime())

 输出结果:

>>> time.struct_time(tm_year=2023, tm_mon=2, tm_mday=1, tm_hour=8, tm_min=20, tm_sec=40, tm_wday=2, tm_yday=32, tm_isdst=0)

 4.三种时间形式之间的转化

 1)结构化时间的转化

结构化时间转时间戳:time.mktime(p_tuple),传入结构化时间。

struct_time = time.localtime()
print(struct_time)
print(time.mktime(struct_time))

>>> time.struct_time(tm_year=2023, tm_mon=2, tm_mday=10, tm_hour=21, tm_min=36, tm_sec=13, tm_wday=4, tm_yday=41, tm_isdst=0)
>>> 1676036173.0 

结构化时间转字符串时间: time.strftime(format, p_tuple=None),传入时间日期格式化符号和结构化时间。

print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

输出结果:

>>> 2023-02-09 10:29:52

2)时间戳的转化

时间戳转结构化时间:time.localtime(),可以传入时间戳数值。

time_stamp = time.time()
print(time.localtime(time_stamp))

输出结果:

>>> time.struct_time(tm_year=2023, tm_mon=2, tm_mday=1, tm_hour=16, tm_min=22, tm_sec=3, tm_wday=2, tm_yday=32, tm_isdst=0)

时间戳转字符串时间是无法直接转换的。需要先将时间戳转化为结构化时间:time.localtime(time_stamp),再将结构化时间转化为字符串时间:time.strftime(format, p_tuple=None)

time_stamp = time.time()
print(time.strftime("%Y-%m-%d", time.localtime(time_stamp)))

输出结果:

>>> 2023-02-01

3)字符串时间的转化

字符串时间转结构化时间:time.strptime(string, format),传入字符串时间和字符串时间的格式。 

string_time = "2023-03-02"
print(time.strptime(string_time,'%Y-%m-%d'))

 输出结果:

>>> time.struct_time(tm_year=2023, tm_mon=3, tm_mday=2, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=61, tm_isdst=-1)

字符串时间转时间戳也是不能直接转化的。需要先将字符串时间转为结构化时间:time.strptime(string, format),再将结构化时间转为时间戳:time.mktime(p_tuple)

struct_time = time.strptime("2023-03-02",'%Y-%m-%d')
print(time.mktime(struct_time))

输出结果:

>>> 1677686400.0

4)补充

将结构化时间转化为本地时间字符串:time.asctime(p_tuple=None)

print(time.asctime(time.localtime()))

输出结果:

>>> Thu Feb  9 10:55:09 2023

将时间戳转化为本地时间字符串:time.ctime(),和time.asctime(p_tuple=None)结果一样,不用传入结构化时间参数。

print(time.ctime())

输出结果:

>>> Thu Feb  9 10:57:16 2023

总结图:

 

5.time模块的时间计算

time模块的格式化时间和字符串时间是无法直接进行加减的,只能使用时间戳进行加减,最后再转换回struct_time时间或字符串时间,计算过程较为麻烦。

举例:

计算两个字符串时间的差值,需要先将两个字符串时间都转为结构化时间再转为时间戳;两个时间戳相减后,又因为时间戳表示的是一个偏移量,所有两个时间戳的差值还需要再减去时间戳的初值:1970年1月1号0时0分0秒。

import time

stamp1 = time.mktime(time.strptime("2023-02-10 08:30:00", "%Y-%m-%d %H:%M:%S"))
stamp2 = time.mktime(time.strptime("2023-02-11 12:30:00", "%Y-%m-%d %H:%M:%S"))
res = stamp2-stamp1
print(res)
struct_time = time.gmtime(res)
print(struct_time)
print("过去了%d年%d月%d天%d小时%d分钟%d秒" % (struct_time.tm_year - 1970, struct_time.tm_mon - 1, struct_time.tm_mday - 1, struct_time.tm_hour, struct_time.tm_min,  struct_time.tm_sec))
# 减去初值

输出结果:

>>> 100800.0

>>> time.struct_time(tm_year=1970, tm_mon=1, tm_mday=2, tm_hour=4, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=2, tm_isdst=0)

>>> 过去了0年0月1天4小时0分钟0秒

二、datetime模块

 datetime模块也是python处理时间和日期的标准库。与time模块相比,datetime模块提供的接口更直观、易用,功能也更加强大。

datetime模块中有time类、date类、datetime类、timedelta类等。

1.datetime类

datetime类:表示日期时间的类,date类和time类的综合使用,可以处理年、月、日、时、分、秒,是datetime模块中比较常用的类,可以获取当前的日期和时间。

1)获取当前日期时间的datetime对象(没有时区信息):datetime.today()

from datetime import datetime

datetime1 = datetime.today()
print(datetime1)
print(type(datetime1))

输出结果:

>>> 2023-02-10 12:17:23.581385
>>> <class 'datetime.datetime'> 

2)获取当前日期时间的datetime对象(有时区信息):datetime.now([tz]) 如果没有使用tz作为参数,其结果与today方法一样;如果有时区信息,则返回的时区对应的时间。

from datetime import datetime

datetime1 = datetime.now()
print(datetime1)
print(type(datetime1))

输出结果:

>>> 2023-02-10 10:12:35.330442

>>> <class 'datetime.datetime'>

3)获取指定日期时间的datetime对象,datetime(year, month, *args)参数不填默认为0

datetime1 = datetime(2023, 2, 10, 10, 35)
print(datetime1)
print(type(datetime1))

输出结果:

>>> 2023-02-10 10:35:00
>>> <class 'datetime.datetime'>

4)将datetime对象转换为时间戳:strtime.timestamp()

now_time = datetime.now()
print(now_time)
print(type(now_time))
print(now_time.timestamp())

输出结果:

>>> 2023-02-10 11:38:28.214709
>>> <class 'datetime.datetime'>
>>> 1676000308.214709

5)将时间戳转换为datetime对象:datetime.fromtimestamp(strtime) 

stamp_time = time.time()
print(stamp_time)
datetime1 = datetime.fromtimestamp(stamp_time)
print(datetime1)
print(type(datetime1))

输出结果:

>>> 1676000181.704188
>>> 2023-02-10 11:36:21.704188
>>> <class 'datetime.datetime'>

6)将字符串时间转换为datetime对象:datetime.strptime(date_string, format),传入参数为字符串时间和时间日期格式化符号。

time1 = datetime.strptime("2022-8-30", "%Y-%m-%d")
print(time1)
print(type(time1))

输出结果:

>>> 2022-08-30 00:00:00

>>> <class 'datetime.datetime'> 

2.date类

date类:表示日期的类,主要用于处理年、月、日。date类对象结构为date(year, month, day),有year,month和day三个属性。

1)获取当前日期的date对象:date.today()

from datetime import date

date1 = date.today()
print(date1)
print(type(date1))

输出结果:

>>> 2022-08-30 00:00:00

>>> <class 'datetime.datetime'> 

2)获取指定日期的date对象:date(year, month, day)

date1 = date(2023,2,1)
print(date1)
print(type(date1))

输出结果:

>>> 2023-02-01

>>> <class 'datetime.date'>

3)将时间戳转换为date对象:date.fromtimestamp(timestamp)

from datetime import date
from datetime import datetime

date1 = date.fromtimestamp(datetime.now().timestamp())
print(date1)
print(type(date1))

输出结果:

>>> 2023-02-10
>>> <class 'datetime.date'>

4)将"YYYY-MM-DD"格式的表示日期的字符串时间转换为date对象:date.fromisoformat(str)

date1 = date.fromisoformat("2023-02-03")
print(date1)
print(type(date1))

输出结果:

>>> 2023-02-03

>>> <class 'datetime.date'> 

5)date对象的属性

date1 = date.today()
print(date1)print(date1.year)
print(date1.month)
print(date1.day

输出结果:

>>> 2023-02-10
>>> 2023
>>> 2
>>> 10 

3.time类

time类:表示时间的类,主要用于处理时、分、秒。

time类对象结构为time([hour[, minute[, second[, microsecond[, tzinfo]]]]])。time对象所有的参数都是可选的(除tzinfo之外的参数不指定默认为0)。tzinfo可以是None或者是tzinfo子类的一个实例。

1)获取指定时间的time对象:time(hour, minute, second)

from datetime import time

time1 = time(8,10,12)
print(time1)
print(type(time1))

输出结果:

>>> 08:10:12
>>> <class 'datetime.time'> 

2)将time对象转换为字符串时间:time.strftime(time, format)

from datetime import time

time1 = time.strftime(time(8,10,12), "%H:%M:%S")
print(time1)
print(type(time1))

输出结果:

>>> 08:10:12
>>> <class 'str'> 

4.timedelta类

timedelata类:表示时间间隔,主要用于做时间加减。

timedelta类可以很方便地对datetime.date、 datetime.time和datetime.datetime对象做算术运算。

1)timedelta类的对象:timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, hours=0, weeks=0)

from datetime import timedelta

print(timedelta(2))
print(type(timedelta(2)))

输出结果:

>>> 2 days, 0:00:00
>>> <class 'datetime.timedelta'> 

2)datetime对象的日期时间计算

获取后一天的日期时间,且加两小时

datetime1 = datetime1.today()
print(datetime1)
res = datetime1 + timedelta(days=1, hours=2)
print(res)
print(type(res))

输出结果:

>>> 2023-02-10 12:57:19.249039
>>> 2023-02-11 14:57:19.249039
>>> <class 'datetime.datetime'>

获取一天的日期时间,且加两小时

datetime1 = datetime1.today()
print(datetime1)
res = datetime1 + timedelta(days=-1, hours=2)
print(res)
print(type(res))

输出结果:

>>> 2023-02-10 13:01:03.517030
>>> 2023-02-09 15:01:03.517030
>>> <class 'datetime.datetime'> 

两个日期时间相减

datetime1 = datetime(2023,2,10,8,30,0)
datetime2 = datetime(2023,2,10,9,0,0)
res = datetime2-datetime1
print(res)
print(type(res))

输出结果:

>>> 0:30:00
>>> <class 'datetime.timedelta'> 

3)date对象的日期计算 

 获取后一天的日期

date1 = date.today()
print(date1)
res = date1 + timedelta(days=1)
print(res)
print(type(res))

输出结果:

>>> 2023-02-10
>>> 2023-02-11
>>> <class 'datetime.date'>

获取前一天的日期 

date1 = date.today()
print(date1)
res = date1 + timedelta(days=-1)
print(res)
print(type(res))

输出结果:

>>> 2023-02-10
>>> 2023-02-09
>>> <class 'datetime.date'> 

 两个日期相减

date1 = date(2023,2,10)
date2 = date(2023,2,9)
res = date1-date2
print(res)
print(type(res))

输出结果:

>>> 1 day, 0:00:00
>>> <class 'datetime.timedelta'> 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值