python_Datetime模块的使用

Datetime模块

导入模块

  • 只导入模块名
  • 使用模块的类时需要写的代码较长如:使用date类的today()方法就要写:datetime.date.today()
1
2
3
4
5
6
import datetime

datetime.date.today()
datetime.date.today().isocalendar()
datetime.datetime.now()
datetime.datetime.now().isoformat()
exp:
datetime.date(2021, 8, 4)
1
datetime.IsoCalendarDate(year=2021, week=31, weekday=3)
exp:
datetime.datetime(2021, 8, 4, 1, 21, 54, 884090


'2021-08-04T01:21:54.885103'

导入模块的类

1
2
3
- 这样可以省略模块名
- `from datetime import date` # 导入datetime的date类
- `from datetime import date, time, datetime,timedelta` # 一次导入datetime的多个常用类
exp:
1
2
3
4
5
6
from datetime import date, time, datetime, timedelta

date.today()
date.today().isocalendar()
datetime.now()
datetime.now().isoformat()
exp:
1
2
3
datetime.date(2021, 8, 4)
datetime.IsoCalendarDate(year=2021, week=31, weekday=3)
datetime.datetime(2021, 8, 4, 1, 21, 54, 904688)
'2021-08-04T01:21:54.904688'

模块中包含的类

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

date类

date对象构成

1
2
3
4
- date对象由year年份、month月份及day日期三部分构成:
- `datetime.date(self, /, *args, **kwargs)`
- 返回日期对象元组(year,month,day)
- 通过`.year`,`. month`,`.day` 分别获取年月日

常用类的方法和属性

date.max 对象所能表示的最大日期(9999-12-31
date.min 对象所能表示的最小日期(0001-01-01)
date.today()返回一个表示当前本地时间的date对象
date.resolutiondate对象表示日期的最小单位(天)
date.fromtimestamp(timestamp)根据给定的时间戳,返回一个date对象

常用的方法和属性

d.year
d.month
d.day
d.replace(year[,month[,day]])生成并返回一个新的日期对象,原日期对象不变
d.timetuple()返回日期对应的时间元组(time.struct_time)对象
d.toordinal()返回日期是自0001-01-01开始的第多少天
d.weekday()返回日期是星期几,[0,6],0表示星期一,1表示星期二
d.isoweekday()返回日期是星期几,[1,7],1表示星期一,2表示星期二
d.isocalendar()返回格式为(year,weekday,isoweekday)的元组
d.isoformat()返回‘YYYY-MM-DD’格式的日期字符串
d.strftime()自定义格式化字符串(和time模块的strftime()方法相同)
### 返回当前日期

exp:

1
2
3
4
5
# 返回当前日期

d = date.today()

d, d.year, d.month, d.day
(datetime.date(2021, 8, 4), 2021, 8, 4)

最大最小日期

exp:

1
2
3
# date类能表示的最大/最小的年、月、日的数值

date.max, date.min
(datetime.date(9999, 12, 31), datetime.date(1, 1, 1))

最小日期单位

exp

1
2
3
# date对象表示日期的最小单位。这里是天

date.resolution
datetime.timedelta(days=1)

从时间戳返回date

1
2
3
4
5
6
# 根据给定的时间戮,返回一个date对象
# datetime.date.fromtimestamp()传入的是时间戳,需要用time模块

# import time

# date.fromtimestamp(time.time()).month

返回年、月、日

exp

1
2
3
# .year,.month,.day属性

date.today().year
2021

替换年、月、日

exp:

1
2
3
4
5
6
7
# .replace属性

# 替换年份
date.today().replace(year=2019)

# 替换日期
date.today().replace(day=23)
1
2
datetime.date(2019, 8, 4)
datetime.date(2021, 8, 23)

返回time.struct_time类型

exp

1
2
# 该方法为了兼容time.localtime(...)返回一个类型为time.struct_time的数组,但有关时间的部分元素值为0:
date.today().timetuple()
1
time.struct_time(tm_year=2021, tm_mon=8, tm_mday=4, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=216, tm_isdst=-1)

返回元年至今的天数

exp

1
2
3
# 返回公元公历开始到现在的天数。公元1年1月1日为1

date.today().toordinal()
1
738006

返回周一为0的星期

exp:

1
2
3
# 返回指定日期所在的星期数(周一为0…周日为6)

date.today().weekday()
1
2

返回周一为1的星期

exp:

1
2
3
# 返回符合ISO标准的指定日期所在的星期数(周一为1…周日为7)

date.today().isoweekday()
1
3

返回标准日历

exp:

1
2
3
# 返回一个包含三个值的元组,三个值依次为:year年份,week number周数,weekday星期数(周一为1…周日为7):

date.today().isocalendar()
1
datetime.IsoCalendarDate(year=2021, week=31, weekday=3)

返回 (YYYY-MM-DD) 的日期字符串

exp:

1
2
3
#返回符合ISO 8601标准 (YYYY-MM-DD) 的日期字符串

date.today().isoformat()
1
'2021-08-04'

返回指定的字符串日期格式

exp:

1
date.today().strftime('%Y-%m-%d-%a-%A-%W')
1
'2021-08-04-Wed-Wednesday-31'

time类

  • time类和time模块各自独立

  • datetime.time(hour[,minute[,decond[,microsecond[,tzinfo]]]])

常用类的方法和属性

time.max表示的最大时间
time.min表示的最小时间
time.resolution时间的最小单位,这里是1微秒

常用的方法和属性

t.hour时
t.minute
t.second
t.microsecond微秒
t.tzinfo时区信息
t.replace()用参数指定替代(时,分,秒,微秒,时区)对象,生成并返回新的对象
t.isoformat()返回'HH:MM:SS'格式字符串
t.strftime()返回自定义格式化字符串

最大最小时间

exp:

1
time.max,time.min
1
(datetime.time(23, 59, 59, 999999), datetime.time(0, 0))

最小时间单位

exp:

1
time.resolution
1
datetime.timedelta(microseconds=1)

返回指定的字符串时间格式

exp:

1
time(23, 57, 34, 345).strftime("%H:%M:%S")
1
'23:57:34'

返回标准的字符串格式

exp:

1
time(23, 57, 34, 345).isoformat()
1
'23:57:34.000345'

datetime类

  • 相当于date和time结合起来

  • datetime.datetime(year,month,day[,hour[,minute[,second[,microsecond[,tzinfo]]]]])

常用类的方法和属性

datetime.max最大日期
datetime.min最小日期
datetime.resolutiondatetime对象所表示日期的最小单位,1微秒
datetime.today()返回当前本地时间
datetime.now([tz])返回当前本地时间,如果指定tz,则返回tz时区当地时间
datetime.fromtimestamp(timestamp[,tz])根据给定的时间戳返回datetime对象,如果指定tz,则返回tz时区datetime对象
datetime.utcfromtimestamp(timestamp)根据时间戳创建一个datetime对象

常用的方法和属性

dt.year
dt.month
dt.day
dt.hour
dt.minute
dt.second 秒 
dt.microsecond微妙
dt.tzinfo时区信息
dt.date()获取dt的date对象
dt.time()获取dt的time对象,tzinfo为none
dt.timetz()获取dt的time对象,tzinfo为与datetime的tzinfo相同
dt.replace()指定参数替代(年,月,日,时,分,秒,微妙,时区),生成并返回新对象
dt.utctimetuple()返回UTC时间对应的时间元组(不包括tzinfo)
dt.timestamp()返回dt对象对应的时间戳
dt.toordinal()返回日期是是自0001-01-01开始的第多少天(与date类相同)
dt.weekday()返回日期是星期几,[1,7],1表示星期一(与date类相同)
dt.isocalendar()返回格式如(year,month,day)的时间元组(与date类相同)
dt.ctime()等价与time模块的time.ctime(time.mktime(d.timetuple()))
dt.strftime()返回指定格式的时间字符串

返回当前时刻

exp:

1
datetime.now()
1
datetime.datetime(2021, 8, 4, 1, 21, 55, 184731)

返回日期date

exp:

1
datetime.now().date()
1
datetime.date(2021, 8, 4)

返回时间time

exp:

1
datetime.now().time()
1
datetime.time(1, 21, 55, 216736)

返回UTC时间元组

exp:

1
datetime.now().utctimetuple()
1
time.struct_time(tm_year=2021, tm_mon=8, tm_mday=4, tm_hour=1, tm_min=21, tm_sec=55, tm_wday=2, tm_yday=216, tm_isdst=0)

将date对象和time对象合并

exp:

1
2
3
4
5
a=datetime.now()
d=a.date()
t=a.time()

datetime.combine(d,t)
1
datetime.datetime(2021, 8, 4, 1, 21, 55, 248728)

返回当前时刻的UTC

exp:

1
2
datetime.utcnow()
datetime.now()
1
2
datetime.datetime(2021, 8, 3, 17, 21, 55, 264729)
datetime.datetime(2021, 8, 4, 1, 21, 55, 264729)

根据字符串返回datetime

exp:

1
datetime.strptime("2021-07-31 23:45","%Y-%m-%d %H:%M")
1
datetime.datetime(2021, 7, 31, 23, 45)

timedelta类

  • 时间加减(代表了两个datetime之间的时间差)

  • datetime.timedalta(days=0,seconds=0,microseconds=0,milliseconds=0,minutes=0 ,hours=0,weeks=0)

  • 在日期上做天,小时,分钟,秒,毫秒,微秒,周 的时间计算

    • 1毫秒转换为1000微秒

    • 1分钟转换为60秒

    • 1小时转换为3600秒

    • 1周转换为7天

  • 其中,timedelta内部只存储 days,seconds,microseconds

常用类的方法和属性

td.days天(范围[-999999999,999999999])
td.seconds秒(范围[0,86399])
td.microseconds微秒(范围[0,999999])
td.total_seconds()以秒为单位返回该时间差
### 时间的加减

exp:

1
2
3
4
5
6
7
8
9
10
11
12
start_time = datetime.now()


# 指定天数:days=? 默认天,可以省略
# 指定小时:hours=?
# 指定分钟:minutes=?
# 指定秒钟:seconds=?
# 指定微秒:microseconds=?
# 指定星期:weeks=?

end1=start_time + timedelta(1)
end1
1
datetime.datetime(2021, 8, 5, 1, 21, 55, 296744)

exp:

1
start_time + timedelta(hours=16)
1
datetime.datetime(2021, 8, 4, 17, 21, 55, 296744)

exp:

1
start_time + timedelta(hours=16,minutes=35)
1
datetime.datetime(2021, 8, 4, 17, 56, 55, 296744)

exp:

1
start_time + timedelta(hours=16,seconds=40,weeks=2,days=1)
1
datetime.datetime(2021, 8, 19, 17, 22, 35, 296744)

计算上个月的最后一天和第一天的日期

exp:

1
2
3
4
5
6
7
8
9
# 计算上个月的最后一天和第一天的日期

td = date.today() # 获取当前日期
a = datetime(td.year, td.month, 1) # 获取本月的第一天
x = a + timedelta(days=-1)
x

y = datetime(x.year, x.month, 1)
y
1
2
datetime.datetime(2021, 7, 31, 0, 0)
datetime.datetime(2021, 7, 1, 0, 0)

计算上周一和周日的日期

exp:

1
2
3
4
w = date.today().isoweekday()
d1=date.today()-timedelta(w+6)
d7=date.today()-timedelta(w)
d1,d7
1
(datetime.date(2021, 7, 26), datetime.date(2021, 8, 1))

计算指定日期当月最后一天的日期和本月天数

exp:

1
2
3
4
a = "1978-9-2"
d = datetime.strptime(a, "%Y-%m-%d")
d1 = datetime(d.year, d.month + 1, 1) - timedelta(1)
d1.strftime("%Y-%m-%d"), d1.day
1
('1978-09-30', 30)

计算指定日期下个月当天的日期

exp:

1
2
3
4
a = "2002-1-9"
d = datetime.strptime(a, "%Y-%m-%d")
d1 = datetime(d.year, d.month + 1, d.day)
d1.strftime("%Y-%m-%d")
1
'2002-02-09'

获得本周一至今天的时间段并获得上周对应同一时间段

exp:

1
2
3
4
td=date.today().isoweekday()
d1=date.today()-timedelta(td-1)
[d1.isoformat(),date.today().isoformat(),]
[(d1-timedelta(weeks=1)).isoformat(),(date.today()-timedelta(weeks=1)).isoformat()]
1
2
['2021-08-02', '2021-08-04']
['2021-07-26', '2021-07-28']

日期的字符串输出

python中的日期时间格式化

符号说明
%y两位数的年份表示(00-99)
%Y四位数的年份表示(000-9999)
%m月份(01-12)
%d月内中的一天(0-31)
%H24小时制小时数(0-23)
%I12小时制小时数(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当前时区的名称
%%%号本身