1. 需求描述
1、 从文件中读取两个日期,一个起始日期,一个终止日期,例如
2、 生成这两个日期间所有以小时为间隔的时间点,并写入文件中
2. 代码实现
2.1 思路
经过一番搜索,最后得出可以使用 python3 内置的 datetime 模块记录时间, 这个类里面记录了日期的各个指标,比如年份、月份、日、小时、秒、毫秒都有,不仅如此,该模块提供的 datetime 对象还支持加减运算。不过它不支持输出时间戳,故时间戳需要使用 time模块。
使用 python3 内置的 timedelta 模块来计算不同时间的差值,比如 :计算三天后的日期
now = datetime.now()
threeDays = now + timedelta(days=3)
根据需求描述,每个月的最后一天16:00 后的时间都要归于下一个月,通过使用 datetime 、timedelta这两个模块很容易实现,只需要考虑以下几个问题即可:
- 将类似于2022-08-24 的文本转化为 datetime 型的对象
通过 datetime.的 strptime 方法实现,不过需要指定时间表达式,例如 %Y-%m-%d
- 判断当前时间的天是否为本月的最后一天
当前的时间加一天,看看是否加一天后的 datetime 的月份是否和之前的相同,如果不同则说明是本月的最后一天。
- 判断当前时间是否超过16:00
通过访问 datetime 内置的 hour 对象就可以获取到 int 型的小时
2.3 代码实现
脚本基本的代码实现:从最简单的方式出发,不考虑脚本的参数,先实现其功能。
import time
from datetime import date, timedelta, datetime
""" ---------------------------------------|
功能函数
-----------------------------------------"""
# 1. 获取下一天
def nextDay(now: datetime) -> datetime:
return now + timedelta(days=1)
# 2. 判断是否为当月的最后一天
def isLastDayInMonth(now: datetime) -> bool:
tomorrow = nextDay(now)
return now.month != tomorrow.month
# 3. 判断时间是否超过 16:00
def isPasHourThan16(now: datetime) -> bool:
return now.hour > 16
""" --------------------------------------------------|
读取文件
----------------------------------------------------"""
with open('test.txt') as fp:
params = {
}
for line in fp.readlines():
# 去掉空格和换行符
line = line.replace(' ', '').replace('\n', '')
# 将参数放入字典
k, v = line.split('=')
params[k] = datetime.strptime(v, "%Y-%m-%d")
print(params)
start_time = params['Start']
end_time = params['End']
ym_set = set() # 表示年月
while start_time < end_time:
ym = None # 当前的年月
# 特殊处理: 每个月最后一天 16:00 之后的时间点需打印在下一个月
if isLastDayInMonth(start_time) and isPasHourThan16(start_time):
ym = nextDay(start_time).strftime('%Y_%m')
else:
ym = start_time.strftime('%Y_%m')
# 若年月未出现过则打印
if ym not in ym_set:
print(ym)
ym_set.add(ym)
print(' ', start_time)
# 遍历下一个小时
start_time += timedelta(hours=1)
测试文本:
Start = 2020-01-01
End = 2021-01-01
代码优化:
以上的代码能实现基本功能,但是还需要读代码的内容,修改源代码才能满足需求,现在将代码进行优化,使得可以直接通过命令行来实现需求指定的功能:
main.py