Python脚本2 打印文本内两个日期之间的所有小时

本文档介绍了一个Python脚本,用于从文件中读取两个日期并生成它们之间所有以小时为间隔的时间点,使用datetime和timedelta模块。脚本包含了功能实现、参数校验和测试,支持命令行交互和简化输出。
摘要由CSDN通过智能技术生成

1. 需求描述


1、 从文件中读取两个日期,一个起始日期,一个终止日期,例如
2、 生成这两个日期间所有以小时为间隔的时间点,并写入文件中

2. 代码实现


2.1 思路

经过一番搜索,最后得出可以使用 python3 内置的 datetime 模块记录时间, 这个类里面记录了日期的各个指标,比如年份、月份、日、小时、秒、毫秒都有,不仅如此,该模块提供的 datetime 对象还支持加减运算。不过它不支持输出时间戳,故时间戳需要使用 time模块。

使用 python3 内置的 timedelta 模块来计算不同时间的差值,比如 :计算三天后的日期

now = datetime.now()

threeDays = now + timedelta(days=3)

根据需求描述,每个月的最后一天16:00 后的时间都要归于下一个月,通过使用 datetime 、timedelta这两个模块很容易实现,只需要考虑以下几个问题即可:

  1. 将类似于2022-08-24 的文本转化为 datetime 型的对象

通过 datetime.的 strptime 方法实现,不过需要指定时间表达式,例如 %Y-%m-%d

  1. 判断当前时间的天是否为本月的最后一天

当前的时间加一天,看看是否加一天后的 datetime 的月份是否和之前的相同,如果不同则说明是本月的最后一天。

  1. 判断当前时间是否超过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


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值