python:datetime模块

345 阅读6分钟

参考网址

blog.csdn.net/u011250186/…

总结

datetime模块是一个很常用的模块,关于日期,时间。
日期时间的加减

0/datetime模块介绍

<1>datetime模块中包含的类

datetime模块中有很多类class,这些类是小写的。

类名            | 功能说明                                                |
| ------------- | ----------------------------------------------        |
| date          | 日期对象,常用的属性有year, month, day                    |
| time          | 时间对象,常用的属性有hourminutesecond,microsecond    |
| datetime      | 日期时间对象,常用的属性有year, month, day, hour, minute, second, microsecond |
| datetime_CAPI | 日期时间对象C语言接口                                    |
| timedelta     | 时间间隔,即两个时间点之间的长度                               |
| tzinfo        | 时区信息对象

<2>datetime模块中包含的常量

| 常量      | 功能说明       | 用法               | 返回值  |
| ------- | ---------- | ---------------- | ---- |
| MAXYEAR | 返回能表示的最大年份 | datetime.MAXYEAR | 9999 |
| MINYEAR | 返回能表示的最小年份 | datetime.MINYEAR | 1

1/datetime中的date类

<1>date对象的构成

date对象由year年份、month月份及day日期三部分构成: dateyearmonthday)
通过yearmonthday三个数据描述符可以进行访问:
>>> import datetime
>>> a = datetime.date.today()
>>> a
datetime.date(2017, 3, 22)
>>> a.year
    2017
>>> a.month
    3
>>> a.day
    22 
当然,你也可以用__getattribute__(...)方法获得上述值:
>>> a.__getattribute__('year')
2017
>>> a.__getattribute__('month')
3
>>> a.__getattribute__('day')
22

<2>date对象中包含的方法与属性

用于日期之间比较大小的方法
| 方法名       | 方法说明       | 用法          |
| --------- | ---------- | ----------- |
| __eq__(…) | 等于(x==y)   | x.__eq__(y) |
| __ge__(…) | 大于等于(x>=y) | x.__ge__(y) |
| __gt__(…) | 大于(x>y)    | x.__gt__(y) |
| __le__(…) | 小于等于(x<=y) | x.__le__(y) |
| __lt__(…) | 小于(x       | x.__lt__(y) |
| __ne__(…) | 不等于(x!=y)  | x.__ne__(y) |

以上方法的返回值为True/False
>>> import datetime
>>> a=datetime.date(2017,3,1)
>>> b=datetime.date(2017,3,15)
>>> a.__eq__(b)
False
>>> a.__ge__(b)
False
>>> a.__gt__(b)
False
>>> a.__le__(b)
True
>>> a.__lt__(b)
True
>>> a.__ne__(b)
True

<3>获得二个日期之间相差多少天

使用__sub__(...)和 __rsub__(...)方法,其实二个方法差不太多,一个是正向操作,一个是反向操作:
| 方法名         | 方法说明  | 用法            |
| ----------- | ----- | ------------- |
| __sub__(…)  | x - y | x.__sub__(y)  |
| __rsub__(…) | y - x | x.__rsub__(y) |
>>> a
datetime.date(2017, 3, 22)

>>> b
datetime.date(2017, 3, 15)

>>> a.__sub__(b)   # 正向的,a-b
datetime.timedelta(7)  # 得到的结果不是int类型的,而是datatime.timedelta类型的。

>>> a.__rsub__(b)  # 这是负向的,b-a
datetime.timedelta(-7)
计算结果的返回值类型为datetime.timedelta, 如果获得整数类型的结果则按下面的方法操作:
>>> a.__sub__(b).days
7
>>> a.__rsub__(b).days
-7

2/datetime中的time类

<1>time类的构成

time类由hour小时、minute分钟、second秒、microsecond毫秒和tzinfo时区五部分组成
time([hour[, minute[, second[, microsecond[, tzinfo]]]]])

相应的,time类中就有上述五个变量来存储应该的值:
>>> a = datetime.time(12,20,59,899)
>>> a
datetime.time(12, 20, 59, 899)
>>> a.hour
12
>>> a.minute
20
>>> a.second
59
>>> a.microsecond
899
>>> a.tzinfo

<2>time类中的方法和属性

date类一样,time类也包含__getattribute__(...)方法可以读取相关属性:
>>> a.__getattribute__('hour')
12
>>> a.__getattribute__('minute')
20
>>> a.__getattribute__('second')
59
相关方法括:
`__eq__(...)`,
`__ge__(...)`, 
`__gt__(...)`, 
`__le__(...)`, 
`__lt__(...)`, 
`__ne__(...)` 
这里的方法与date类中定义的方法大同小异,使用方法与一样,这里就不过多介绍了,示例如下:
>>> import datetime
>>> a = datetime.time(12,20,59,899)
>>> b = datetime.time(11,20,59,889)
>>> a.__eq__(b)
False
>>> a.__ne__(b)
True
>>> a.__ge__(b)
True
>>> a.__gt__(b)
True
>>> a.__le__(b)
False
>>> a.__lt__(b)
False

<3>其他属性

时间的字符串输出
如果你想将时间对象转化为字符串对象的话,可以用到`__format__(...)`方法以指定格式进行时间输出:
>>> a = datetime.time(12,20,59,899)
>>> a.__format__('%H:%M:%S')
'12:20:59'
与此方法等价的方法为strftime(...)
>>> a = datetime.time(12,20,59,899)
>>> a.strftime('%H:%M:%S')
'12:20:59'
如果只是想简单的获得时间的字符串,则使用__str__(...)
>>> a = datetime.time(12,20,59,899)
>>> a.__str__()
'12:20:59.000899'

3/datetime中datetime类

这里可以看出来,模块名和类名,一样。
datetime类,有年,月,日,时,分,秒,毫秒这几个属性。
所以说,如果你得到一个datetime类的实例化对象,这个对象中,都有年,月,日,时,分,秒,毫秒这几个属性

datetime类的对象构成

datetime类其实是可以看做是date类和time类的合体
其大部分的方法和属性都继承于这二个类
其数据对象构成也是由这二个类所有的属性所组成的
datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])

专属于datetime的方法和属性

date(…):返回datetime对象的日期部分:

>>> a = datetime.datetime.now()
>>> a
datetime.datetime(2017, 3, 22, 16, 9, 33, 494248)
>>> a.date()  # 只要datetime对象中的date部分
datetime.date(2017, 3, 22)

time(…) :返回datetime对象的时间部分:

>>> a = datetime.datetime.now()
>>> a
datetime.datetime(2017, 3, 22, 16, 9, 33, 494248)
>>> a.time()  # 只要datetime对象中的time部分。
datetime.time(16, 9, 33, 494248)

now(…):返回当前日期时间的datetime对象:

>>> a = datetime.datetime.now()
>>> a
datetime.datetime(2017, 3, 22, 16, 9, 33, 

strftime(): 日期时间类型-->字符串

from datetime import date, timedelta

# 这里需要实现2个功能
# 一个是获取当天的日期,另一个是做日期的加减,往前推,往后推。
yesterday = (date.today() + timedelta(days=-1)).strftime('%Y-%m-%d')
print(yesterday)

strptime(…):根据string, format 2个参数,返回一个对应的datetime对象:

>>> datetime.datetime.strptime('2017-3-22 15:25', '%Y-%m-%d %H:%M')
datetime.datetime(2017, 3, 22, 15, 25)

4/timedelta类

`timedelta`类是用来计算二个`datetime`对象的差值的。 
此类中包含如下属性: 
1`days`**:天数 
2`seconds`**:秒数(>=0 并且 <1天)
3`microseconds`**:微秒数(>=0 并且 <1秒) 

日期计算实操

1.获取当前日期时间

>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2017, 3, 22, 16, 55, 49, 148233)
>>> today = datetime.date.today()
>>> today
datetime.date(2017, 3, 22)
>>> now.date()
datetime.date(2017, 3, 22)
>>> now.time()
datetime.time(16, 55, 49, 148233)

2.获取上个月第一天和最后一天的日期

>>> today = datetime.date.today()
>>> today
datetime.date(2017, 3, 22)
>>> mlast_day = datetime.date(today.year, today.month, 1) - datetime.timedelta(1)
>>> mlast_day
datetime.date(2017, 2, 28)
>>> mfirst_day = datetime.date(mlast_day.year, mlast_day.month, 1)
>>> mfirst_day
datetime.date(2017, 2, 1)

3/获取时间差

时间差单位为秒
>>> start_time = datetime.datetime.now()
>>> end_time = datetime.datetime.now()
>>> (end_time - start_time).seconds
7
差值不只是可以查看相差多少秒,还可以查看天(days), 秒(seconds), 微秒(microseconds).

4.计算当前时间向后8个小时的时间

>>> d1 = datetime.datetime.now()
>>> d2 = d1 + datetime.timedelta(hours=+8)  #+8是往后推8小时,-8是往前推8小时 
>>> d2
datetime.datetime(2017, 3, 23, 1, 10, 37, 182240)
可以计算: 天(days), 小时(hours), 分钟(minutes), 秒(seconds), 微秒(microseconds).

5/日期时间格式符号

| 符号   | 说明                      |
| ---- | ----------------------- |
| `%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` | 当前时区的名称                 |
| `%%` | %号本身