Python日期时间前后推移

2024-01-19 13:38:20 浏览数 (3)

Python日期时间前后推移

在开发某个功能时需要计算当前时间往前推移N个月、半年、三年的时间,现有的datetime.timedelta()只支持日、小时、分、秒、毫秒推移,不支持月与年。所以自己实现了一下月份与年的推移,并结合datetime.timedelta(),最终实现完整的日期时间前后推移功能。

一、日、小时、分、秒、毫秒推移

建议使用datetime.timedelta()

代码语言:python代码运行次数:0复制
from datetime import datetime
from datetime import timedelta as td

def time_delata(sourcedate:datetime,days:int,hours:int,minutes:int,seconds:int,microseconds:int):
    return sourcedate   td(days=days, hours=hours, minutes=minutes, seconds=seconds, microseconds=microseconds)

优点:官方模块,有持续维护,文档说明齐全

二、月份、年份推移

自定义代码实现月份、年份的前后推移

1. 月份推移

代码语言:python代码运行次数:0复制
def month_delta(months):

    month = sourcedate.month   months

    if month % 12 == 0:

        if month // 12 == 1:

            year = sourcedate.year

        else:

            year = sourcedate.year   floor(months / 12)

        month = 12

    else:

        year = sourcedate.year   floor(months / 12)

        month = month % 12

    day = min(sourcedate.day, calendar.monthrange(year, month)[1])



    return datetime.datetime(year, month, day, hour=sourcedate.hour, minute=sourcedate.minute,

                             second=sourcedate.second,

                             microsecond=sourcedate.microsecond, )

2. 年份推移

代码语言:python代码运行次数:0复制
def year_delta(years):

    year = sourcedate.year  years

    return datetime.datetime(year, month=sourcedate.month, day=sourcedate.day, hour=sourcedate.hour, minute=sourcedate.minute,  second=sourcedate.second,microsecond=sourcedate.microsecond, )

三、年、月、日、小时、分、秒、毫秒推移

将章节一与章节二的内容相结合,写一个代理方法,即可实现

四、第三方库python-dateutil

一通搞完,发现居然有第三方库已经实现了这个功能,人都麻了。

不过使用第三方库也不是完全没有缺点。

优点:简单方便、高效

缺点:第三方库,不稳定,上次版本更新已经是在2021年,已经过了3年了

代码语言:python代码运行次数:0复制
def timedelta(sourcedate,years, months, days, hours, minutes, seconds, microseconds):

    dst_date = sourcedate

    if years:

        dst_date = dst_date   relativedelta(years=years)

    if months:

        dst_date = dst_date   relativedelta(months=months)

    if days:

        dst_date = dst_date   relativedelta(days=days)

    if hours:

        dst_date = dst_date   relativedelta(hours=hours)

    if minutes:

        dst_date = dst_date   relativedelta(minutes=minutes)

    if seconds:

        dst_date = dst_date   relativedelta(seconds=seconds)

    if microseconds:

        dst_date = dst_date   relativedelta(microseconds=microseconds)

    return dst_date

0 人点赞