python时间处理之datetime模块

289 阅读7分钟

datetime基于time进行了封装,提供了很多实用的函数

datetime模块主要有以下四个类

date:表示日期的类

time:表示时间的类

datetime:表示日期和时间

timedelta:表示时间间隔,用于时间偏移

上面这4个类型的对象都是不可变类型。

1.date类

该类主要定义了一些常用的类属性和类方法

1.1 属性

1.1.1 min属性

date对象所能表示的最小日期

from datetime import date
print(date.min)

result:

0001-01-01

1.1.2 max属性

date对象所能表示的最大日期

print(date.max)

result:

9999-12-31

1.1.3 resolution属性

date对象的最小单位,这里是天

print(date.resolution)

result:

1 day, 0:00:00

1.1.4 year属性

日期中的年

today = date.today()
print(today.year)

result:

2021

1.1.5 month属性

日期中的月

today = date.today()
print(today.month)

result:

11

1.1.6 day属性

日期中的日

today = date.today()
print(today.day)

result:

16

1.2 方法

1.2.1 today()方法

返回一个表示当前本地日期的date对象

today = date.today()
print(today)

result:

2021-11-25

1.2.2 fromtimestamp()方法

根据给定的时间戳,返回一个date对象

t1 = date.fromtimestamp(999999)
print(t1)

result:

1970-01-12

1.2.3 replace()方法

生成一个新的日期对象,用参数指定的年月日替代原有对象中的年月日,原有对象保持不变

today = date.today()
print(today.replace(year=2009))

result:

2009-11-25
print(today.replace(year=2009))

result:

2021-11-25

1.2.4 weekday()方法

星期几,周一返回0,依次类推

print(today.weekday())

result:

3

1.2.5 isoweekday()方法

星期几,周一返回1,依次类推

print(today.isoweekday())

result:

4

1.2.6 isocalendar()方法

返回一个时间元组,(年份,一年中的第几周,本周的第几天)

print(today.isocalendar())

result:

(2021, 47, 4)

1.2.7 isoformat()方法

返回'YYYY-MM-DD'形式的日期字符串

print(today.isoformat())

result:

2021-11-25

1.2.8 strftime()方法

与time模块的strftime()方法类似,也是用于格式化字符串

2.timedelta类

timedelta对象用于表示一个时间长度,两个日期或者时间的差值。

其函数参数如下:

class timedelta([days=0, seconds=0, microseconds=0,
            milliseconds=0, minutes=0, hours=0, weeks=0])

所有参数都是可选的,默认为0.参数可以是整数或者浮点数,也可以整数或者负数。

虽然参数可以传递的单位很多,但是python内部只存储了days、seconds、microseconds三种单位,其他单位在计算时都要转换为这三种单位。具体转换如下:

1 millisecond = 1000 microseconds
1 minute = 60 seconds
1 hour = 3600 seconds
1 week = 7 days

下面举几个常用的例子

先来看一下今天的日期

from datetime import timedelta,datetime
​
today = datetime.today()
print(today.date())

result:

2021-11-27

2.1 获取昨天的日期

yesterday = today + timedelta(days=-1)
print(yesterday.date())

result:

2021-11-26

2.2 获取明天的日期

tomorrow = today + timedelta(days=1)
print(tomorrow.date())

result:

2021-11-28

2.3 计算两个日期之间的天数

print(yesterday - tomorrow)

result:

-2 days, 0:00:00
print((yesterday - tomorrow).days)

result:

-2

如上所说,对于两个日期之间的差值,只有days、seconds、microseconds这三个属性。其他的诸如两个日期差了几年,几个月,几个周这种需求,没有办法直接获取,需要通过days、seconds、microseconds进行转换。

2.4 获取时间间隔后的格式化日期时间

from datetime import timedelta,datetime
​
now = datetime.now()
print(now.strftime("%y-%m-%d %H:%M:%S"))

result:

21-11-27 15:35:22
print((now+timedelta(hours=1)).strftime("%y-%m-%d %H:%M:%S"))

result:

21-11-27 16:35:22

上面只是以日期时间举例说明。事实上,datetime对象中的date类、time类和datetime类都可以参与这种日期计算

3.time类

3.1 属性

3.1.1 min属性

time对象所能表示的最小时间

from datetime import timeprint(time.min)

result:

00:00:00

3.1.2 max属性

time对象所能表示的最大日期

print(time.max)

result:

23:59:59.999999

3.1.3 resolution属性

time对象的最小单位,这里是微秒

print(time.resolution)

result:

0:00:00.000001

3.1.4 hour属性

时间中的时

t1 = time(12, 23, 46)
print(t1.hour)

result:

12

3.1.5 mintue属性

时间中的分

print(t1.minute)

result:

23

3.1.6 second属性

时间中的秒

print(t1.second)

result:

46

3.1.7 microsecond属性

时间中的微秒

print(t1.microsecond)

result:

0

3.1.8 tzinfo属性

时区信息

print(t1.tzinfo)

result:

None

3.2 方法

3.2.1 replace()方法

生成一个新的时间对象,用参数指定的时分秒替代原有对象中的时分秒,原有对象保持不变

t1 = time(12, 23, 46)
print(t1.replace(hour=2))

result:

02:23:46
print(t1)

result:

12:23:46

3.2.2 isformat()方法

返回'HH:MM:SS'形式的时间字符串

print(t1.isoformat())

result:

12:23:46

3.2.3 strftime()方法

与time模块的strftime()方法类似,也是用于格式化字符串

4.datetime类

datetime是date和time的结合体,包括date和time的所有信息。

4.1 属性

4.1.1 min属性

datetime对象所能表示的最小日期时间

from datetime import datetime
print(datetime.min)

result:

0001-01-01 00:00:00

4.1.2 max属性

datetime对象所能表示的最大日期时间

print(datetime.max)

result:

9999-12-31 23:59:59.999999

4.1.3 resolution属性

datetime对象的最小单位,这里是微秒

print(datetime.resolution)

result:

0:00:00.000001

4.1.4 year属性

datetime对象中的年

today = datetime.today()
print(today.year)

result:

2021

4.1.5 month属性

datetime对象中的月

today = date.today()
print(today.month)

result:

11

4.1.6 day属性

datetime对象中的日

today = date.today()
print(today.day)

result:

27

4.1.7 hour属性

datetime对象中的时

print(today.hour)

result:

12

4.1.8 mintue属性

datetime对象中的分

print(today.minute)

result:

5

4.1.9 second属性

datetime对象中的秒

print(today.second)

result:

51

4.1.10 microsecond属性

datetime对象中的微秒

print(today.microsecond)

result:

560464

4.1.11 tzinfo属性

datetime对象的时区信息

print(today.tzinfo)

result:

None

4.2 方法

4.2.1 today()方法

返回一个表示当前本地日期时间的datetime对象

print(datetime.today())

result:

2021-11-27 11:14:31.754096

4.2.2 now()方法

返回一个表示当前本地日期时间的datetime对象。如果提供了参数tz,则获取参数tz所指时区的本地时间

print(datetime.now())

result:

2021-11-27 11:45:37.213666
from datetime import datetime
import pytz
print(datetime.now(pytz.timezone('America/Manaus')))

result:

2021-11-26 23:45:37.274950-04:00

4.2.3 utcnow()方法

返回一个当前UTC时间的datetime对象

print(datetime.utcnow())

result:

2021-11-27 03:46:43.699301

4.2.4 fromtimestamp()方法

根据给定的时间戳,返回一个datetime对象

print(datetime.fromtimestamp(999999))

result:

1970-01-12 21:46:39

4.2.5 fromtimestamp()方法

根据给定的时间戳,返回一个UTC时间的datetime对象

print(datetime.utcfromtimestamp(999999))

result:

1970-01-12 13:46:39

4.2.6 combine()方法

根据date和time,创建一个datetime对象

from datetime import datetime, date, time
​
date1 = date(2019, 12, 23)
time1 = time(12, 34, 45)
print(datetime.combine(date1, time1))

result:

2019-12-23 12:34:45

4.2.7 strftime()方法

与time模块的strftime()方法类似,也是用于格式化字符串

4.2.8 strfptime()方法

与strftime()方法相反,将格式化字符串转换为datetime对象

print(datetime.strptime("2019-5-1 5:54:45", '%Y-%m-%d %H:%M:%S'))

result:

2019-05-01 05:54:45

4.2.9 date()方法

获取datetime对象中的date

print(today.date())

result:

2021-11-27

4.2.10 date()方法

获取datetime对象中的date

print(today.time())

result:

12:09:32.355739

4.2.11 replace()方法

生成一个新的datetime对象,用参数指定的时分秒替代原有对象中的时分秒,原有对象保持不变

print(today.replace(hour=2))

result:

2021-11-27 02:11:32.253015
print(t1)

result:

2021-11-27 12:11:32.253015

4.2.12 isformat()方法

返回'YYYY-MM-DDTHH:MM:SS'形式的时间日期字符串

print(t1.isoformat())

result:

2021-11-27T12:12:29.065264

4.2.13 weekday()方法

星期几,周一返回0,依次类推

print(today.weekday())

result:

5

4.2.14 isoweekday()方法

星期几,周一返回1,依次类推

print(today.isoweekday())

result:

6

4.2.15 isocalendar()方法

返回一个时间元组,(年份,一年中的第几周,本周的第几天)

print(today.isocalendar())

result:

(2021, 47, 6)

4.2.16 timetuple()方法

返回truct_time类型的当前时间元组

print(today.timetuple())

result:

time.struct_time(tm_year=2021, tm_mon=11, tm_mday=27, tm_hour=12, tm_min=29, tm_sec=13, tm_wday=5, tm_yday=331, tm_isdst=-1)
​

4.2.16 utctimetuple()方法

返回truct_time类型的UTC时间元组

print(today.utctimetuple())

result:

time.struct_time(tm_year=2021, tm_mon=11, tm_mday=27, tm_hour=12, tm_min=29, tm_sec=13, tm_wday=5, tm_yday=331, tm_isdst=0)

4.2.17 toordinal()方法

返回该日期在公历中的序数

print(today.toordinal())

result:

738121

4.2.18 ctime()方法

返回星期 月日 时:分:秒 年形式的日期时间

print(today.ctime())

result:

Sat Nov 27 12:36:37 2021