python标准库之时间与日期

python具有良好的时间和日期管理功能,主要涉及time和datetime两个模块。time包基于C语言的库函数(library functions)。datetime包是基于time包的一个高级包, 为我们提供了多一层的便利。

一、time模块

实际上,计算机只会维护一个挂钟时间(wall clock time),这个时间是从某个固定时间起点到现在的时间间隔。时间起点的选择与计算机相关,但一台计算机的话,这一时间起点是固定的。其它的日期信息都是从这一时间计算得到的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import time

print(time.clock()) # 处理器时间(processor clock time), 单位是秒
print(time.time()) # 挂钟时间(wall clock time), 单位是秒

time.sleep(3) # 程序休眠直到某时间间隔之后再唤醒

print(time.time())

##############################################

st = time.gmtime() # 返回struct_time格式的UTC时间
st = time.localtime() # 返回struct_time格式的当地时间, 当地时区根据系统环境决定。

s = time.mktime(st) # 将struct_time格式转换成wall clock time
print(s)

二、datetime模块

datetime可以理解为date和time两个组成部分。date是指年月日构成的日期(相当于日历),time是指时分秒微秒构成的一天24小时中的具体时间(相当于手表)。你可以将这两个分开管理(datetime.date类,datetime.time类),也可以将两者合在一起(datetime.datetime类)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import datetime

# 返回本地时区当前时间的datetime对象
print(datetime.datetime.today())

#返回当前时间的datetime对象,时间到微秒,如果tz为None,返回和today()一样
print(datetime.datetime.now())

#没有时区的当前时间
print(datetime.datetime.utcnow())

#从一个时间戳返回一个datetime对象
print(datetime.datetime.fromtimestamp)
print(datetime.datetime.fromtimestamp(int(1559225186)))

#返回一个到微秒的时间戳
print(datetime.datetime.now().timestamp())

#构造方法,year、month、day、hour、minute、second、microsecond,取datetime对象的年月日时分秒及微秒
print(datetime.datetime(2018, 9, 17, 10, 30, 43, 79043))

#返回星期的天,周一0,周日6
print(datetime.datetime.now().weekday())

#返回星期的天,周一1,周日7
print(datetime.datetime.now().isoweekday())

#返回日期date对象
print(datetime.datetime.now().date())

#返回时间time对象
print(datetime.datetime.now().time())

#修改并返回新的时间
print(datetime.datetime.now())
print(datetime.datetime.now().replace(2018,6,18))

#返回一个三元组(年,周数,周的天)
print(datetime.datetime.now())
print(datetime.datetime.now().isocalendar())

截取日期时间段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import datetime

def create_assist_date(datestart=None, dateend=None):
# 创建日期辅助表

if datestart is None:
datestart = '2016-01-01'
if dateend is None:
dateend = datetime.datetime.now().strftime('%Y-%m-%d')

# 转为日期格式
datestart=datetime.datetime.strptime(datestart,'%Y-%m-%d')
dateend=datetime.datetime.strptime(dateend,'%Y-%m-%d')
date_list = []
date_list.append(datestart.strftime('%Y-%m-%d'))
while datestart<dateend:
# 日期叠加一天
datestart+=datetime.timedelta(days=+1)
# 日期转字符串存入列表
date_list.append(datestart.strftime('%Y-%m-%d'))
return date_list

d_list = create_assist_date(datestart='2021-12-27', dateend='2022-01-15')
print(d_list)

此前的第n天

1
2
def get_history_day(n):
return str(datetime.datetime.now() - datetime.timedelta(days=n))[:10]

下月月初

1
2
3
4
5
6
7
8
9
10
11
12
def get_begin_of_next_month():
today = datetime.date.today()
year = today.year
month = today.month
if month == 12:
year += 1
month = 1
else:
month += 1

begin_of_next_month = str(datetime.date(year, month, 1)).replace('-','')
return begin_of_next_month

三、时间转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

import time,datetime

#========================================================
# 时间转换
#========================================================
def get_now_str():
'''
获得字符串格式的当前时间
'''
t = datetime.datetime.now()
strtime = t.strftime('%Y-%m-%d %H:%M:%S')
return strtime

def get_now_timedelta():
'''
获得时间戳格式的当前时间
'''
t = datetime.datetime.now()
timedelta = time.mktime(t.timetuple())
return timedelta

def datetime_to_str(date_time):
'''
标准日期转为文本日期
INPUT -> 标准日期
OUTPUT -> 文本日期
'''
strtime = date_time.strftime('%Y-%m-%d %H:%M:%S')
return strtime

def str_to_datetime(str_time):
'''
文本日期转为标准日期
INPUT -> 文本日期
OUTPUT -> 标准日期
'''
date_time = datetime.datetime.strptime(str_time, '%Y-%m-%d %H:%M:%S')
return date_time

def str_to_timedelta(str_time):
'''
字符串格式时间转为时间戳格式时间
INPUT -> 字符串格式时间
OUTPUT -> 时间戳格式时间
'''
t = time.strptime(str_time,'%Y-%m-%d %H:%M:%S')
timedelta = time.mktime(t)
return timedelta

def timedelta_to_str(timedelta):
'''
时间戳转为文本日期
INPUT -> 时间戳
OUTPUT -> 文本日期
'''
t = time.localtime(timedelta)
str_time = time.strftime('%Y-%m-%d %H:%M:%S', t)
return str_time

def timedelta_to_datetime(timedelta):
'''
时间戳转为标准日期
INPUT -> 时间戳
OUTPUT -> 标准日期
'''
date_time = datetime.datetime.fromtimestamp(timedelta)
return date_time

def datetime_to_timedelta(date_time):
'''
标准日期转为时间戳
INPUT -> 标准日期
OUTPUT -> 时间戳
'''
timedelta = time.mktime(date_time.timetuple())
return timedelta

def time_migration(str_time, dd, hh, mm):
'''
时间偏移
INPUT -> 文本日期, 天的偏移, 小时的偏移, 分钟的偏移
OUTPUT -> 偏移后的文本日期
'''
date_time = str_to_datetime(str_time)
date_time = date_time + datetime.timedelta(days=dd)
date_time = date_time + datetime.timedelta(hour=hh)
date_time = date_time + datetime.timedelta(hour=mm)
str_time = date_time.strftime("%Y-%m-%d %H:%M:%S")
return str_time

def time_migration_days(str_time, dd, hh):
'''
固定时间的日期偏移
INPUT -> 文本日期, 天的偏移, 固定小时
OUTPUT -> 偏移后的文本日期
'''
date_time = str_to_datetime(str_time)
date_time = date_time + datetime.timedelta(days=dd)
str_time = date_time.replace(hour=hh, minute=00, second=00).strftime("%Y-%m-%d %H:%M:%S")
return str_time