“一起学习,一起成长!“

表示日期的第一个问题就是二义性。

什么是二义性?举例说明:7表示月份,29表示天数,因为月份不可能是29.但是1/6/2012呢?它到底是1月6日,还是6月1日?

闰年是另一个问题,年份是整百数时,必须是400的倍数才是闰年。下面的代码可以检测是否是闰年:

>>> import calendar
>>> calendar.isleap(2000)
True
>>> calendar.isleap(2018)
False
>>> calendar.isleap(2019)
False
>>> calendar.isleap(2020)
True

1. datetime模块

首先介绍一下标准datetime模块。它定义了4个主要的对象,每个对象都有很多的用法:

date:处理年、月、日

time:处理时、分、秒和微秒

datetime:处理日期和时间同时出现的情况。

timedelta:处理日期和/或时间间隔

可以指定年、月、日,来创建一个date对象。这些值之后会变成对象的属性:

>>> from datetime import date
>>> halloween=date(2014,10,31)
>>> halloween
datetime.date(2014, 10, 31)
>>> halloween.day
31
>>> halloween.month
10
>>> halloween.year
2014

使用isoformat()方法打印一个date对象:

>>> halloween.isoformat()

'2014-10-31'

iso是指ISO 8601,一种表示日期和时间的国际标准。这个标准的显示顺序是从一般(年)

到特殊(日)。它也可以对日期进行正确的排序:先按照年,然后是月,最后是日。作者经常在程序中使用这种格式表示日期,还会在存储和日期相关的数据时当作文件名。

strptime()和strftime()方法,它们分别用来解析和格式化日期。

使用today()方法生成今天的日期:

>>> now=date.today()
>>> now
datetime.date(2018, 6, 24)

使用timedelta对象来实现date的加法:

>>> from datetime import timedelta
>>> one_day=timedelta(days=1)
>>> tomorrow=now+one_day
>>> tomorrow
datetime.date(2018, 6, 25)
>>> now+17*one_day
datetime.date(2018, 7, 11)
>>> yesterday=now-one_day
>>> yesterday
datetime.date(2018, 6, 23)
date的范围是date.min(年=1,月=1,日=1)到date.max(年=9999,月=12,日=31)。因此不能使用它来进行和历史或者天文相关的计算。
datetime模块中的time对象用来表示一天中的时间:
>>> from datetime import time
>>> noon=time(12,0,0)
>>> noon.hour
12
>>> noon.minute
>>> noon.second
>>> noon.microsecond

参数的顺序是按照时间单位从大(时)到小(微秒)排列。如果没有参数,time会默认全部使用0。

>>> from datetime import datetime
>>> some_day=datetime(2018,6,24,12,15,45)
>>> some_day
datetime.datetime(2018, 6, 24, 12, 15, 45)
>>> some_day.isoformat()
'2018-06-24T12:15:45'
中间的T把日期和时间分割开。
datetime有一个now()方法,可以用它获取当前日期和时间:
>>> from datetime import datetime
>>> now=datetime.now()
>>> now
datetime.datetime(2018, 6, 24, 15, 3, 25, 749511)
>>> now.month
6
>>> now.day
24
>>> now.hour
15
>>> now.minute
3
>>> now.second
25
>>> now.microsecond
749511
combine()方法:把一个date对象和一个time对象合并成一个datetime对象
>>> from datetime import datetime,time,date
>>> noon=time(12)
>>> this_day=date.today()
>>> noon_today=datetime.combine(this_day,noon)
>>> noon_today
datetime.datetime(2018, 6, 24, 12, 0)
>>> noon_today.isoformat()
'2018-06-24T12:00:00'
也可以使用date()和time()方法从datetime中取出date和time部分:
>>> noon_today.date()
datetime.date(2018, 6, 24)
>>> noon_today.time()
datetime.time(12, 0)

date:处理年、月、日time:处理时、分、秒和微秒datetime:处理日期和时间同时出现的情况timedelta:处理日期和/或时间间隔,使用timedelta对象来实现date的加法。isoformat()方法:使用isoformat()方法打印一个date对象strptime()方法:解析日期strftime()方法:格式化日期today()方法:生成今天的日期time()方法now()方法:获取当前日期和时间combine()方法:把一个date对象和一个time对象合并成一个datetime对象2. 使用time模块

python的datetime模块中有一个time对象,python还有一个单独的time模块,这有点令人困扰。此外,time模块还有一个函数叫做time()。

time模块的time()函数会返回当前时间的纪元值:

>>> import time
>>> now=time.time()
>>> now
1529824590.8259535
ctime():把一个纪元值转换成一个字符串。
>>> time.ctime(now)
'Sun Jun 24 15:16:30 2018'

纪元值是不同系统(比如javascript)之间交换日期和时间的一种非常有用的方法。但是有时候想要真正的日期而不是一串数字,这时可以使用struct_time对象。localtime()会返回当前系统时区下的时间,gmtime()会返回UTC时间:

>>> time.localtime(now)
time.struct_time(tm_year=2018, tm_mon=6, tm_mday=24, tm_hour=15, tm_min=16, tm_sec=30, tm_wday=6, tm_yday=175, tm_isdst=0)
>>> time.gmtime(now)
time.struct_time(tm_year=2018, tm_mon=6, tm_mday=24, tm_hour=7, tm_min=16, tm_sec=30, tm_wday=6, tm_yday=175, tm_isdst=0)
mktime():把struct_time对象转换回纪元值:
tm=time.localtime(now)
>>> time.mktime(tm)
1529824590.0

这个值和之前now()返回的纪元值并不完全相同,因为struct_time对象只能精确到秒。

一些建议:尽量多使用UT来代替时区。UTC是绝对时间,和时区无关。如果你有服务器,把它的时间设置为UTC,不要使用本地时间。

如果有可能,绝对不是用夏时制时间。如果使用了夏时制时间,那每年的一段时间(春季)会少一个小时,另一段时间(秋季)会多一个小时。

time()函数ctime():把一个纪元值转换成一个字符串localtime():返回当前系统时区下的时间gmtime():返回UTC时间mktime():把struct_time对象转换回纪元值