datetime时间加减操作

加减日期

可以采用两种方式来实现日期时间上的加减操作 ,一种是采用第三方库dateutil 这个是最简单的方式。另一种是使用python的基本库datetimecalendar结合使用,结合使用的原因是datetime的时间加减操作只能在周,天,时,分,秒,毫秒和微秒上进行时间的加减操作。下面时两种方式的实现方式 。

三方库dateutil

安装库

pip install python-dateutil

实现代码

导入dateutil.relativedelta中的relativedelta类,relativedelta 类定义了 __add____sub__ 方法,这些方法接收 datetime 对象并根据 relativedelta 中的属性(如年、月、日等)进行相应的计算。当你执行 datetime_object + relativedelta_object 时,Python 实际上调用的是 relativedelta__add__ 方法,该方法会返回一个新的 datetime 对象。

from dateutil.relativedelta import relativedelta
from datetime import datetime

def add(
    current_time=None,
    adjust_type="add",
    length=0,
    unit="seconds"
):
    # 时间增减逻辑
    time_deltas = {
        "second": relativedelta(seconds=length),
        "minute": relativedelta(minutes=length),
        "hour": relativedelta(hours=length),
        "day": relativedelta(days=length),
        "month": relativedelta(months=length),
        "year": relativedelta(years=length),
    }

    # 调整时间
    if adjust_type == "add":
        new_time = current_time + time_deltas[unit]
    else:
        new_time = current_time - time_deltas[unit]

    # 返回结果
    return new_time

datetimecalendar结合

这两个都是python的基本库,不需要进行安装。

datetime只能进行周,天,时,分,秒,毫秒和微秒上的时间操作,所以我们主要是完成在实现对年月进行加减的逻辑处理问题。问题产生的原因是年的增减,影响 特定月2月天数28和29的变化,月的变化会影响到天和年,同样是 2月,当然也包含了其他月份30天和31天的一个变化。

  1. 首先年的变化,直接增加或者减少
  2. 月份的变化,需要进行一个转化,超出范围1-12后,我做的逻辑是区分大于12,还是小于1,通过循环,每满12个月就改变一次年和月,正确的将月份和年份对应的进行改变。
  3. 处理完年和月以后,要处理日期溢出问题,比如,从2024年2月29日减少12个月到2023年2月,2023年2月只有28天,此时如果只改变月份和年份,则会产生错误的日期数据,同时也会导致datetime时间对象报错。calendar.monthrange(new_year, new_month),拿到月份的日期范围,再获取到最大日期,进行取小操作,就能获取到正确的时间。
  4. 最后根据入参,使用datetime的timedelta进行剩下时间的操作。
from datetime import datetime
import calendar
def add_(current_time=None, years=0, months=0, days=0, hours=0, minutes=0, seconds=0):

    # 加年份
    new_year = current_time.year + years
    # 加月份
    new_month = current_time.month + months
    while new_month > 12:
        new_year += 1
        new_month -= 12
    while new_month < 1:
        new_year -= 1
        new_month += 12

    # 处理日期溢出
    last_day = calendar.monthrange(new_year, new_month)[1]
    new_day = min(current_time.day, last_day)

    # 创建新的日期
    current_time = current_time.replace(year=new_year, month=new_month, day=new_day)
    current_time += timedelta(days=days, hours=hours, minutes=minutes, seconds=seconds)
    return current_time

同样我们可以简化这个代码,但是只能对一个时间类型进行操作,根据需要选择

from datetime import datetime
import calendar
def add__(current_time=None, unit="second", length=0):

    unit_time = {
        "year": 0,
        "month": 0,
        "day": 0,
        "hour": 0,
        "minute": 0,
        "second": 0,
    }
    unit_time[unit] = length
    # 加年份
    new_year = current_time.year + unit_time["year"]
    # 加月份
    new_month = current_time.month + unit_time["month"]
    # 年月调整
    while new_month > 12:
        new_year += 1
        new_month -= 12
    while new_month < 1:
        new_year -= 1
        new_month += 12

    # 处理日期溢出
    last_day = calendar.monthrange(new_year, new_month)[1]
    new_day = min(current_time.day, last_day)

    # 创建新的日期
    current_time = current_time.replace(year=new_year, month=new_month, day=new_day)
    current_time += timedelta(
        days=unit_time["day"],
        hours=unit_time["hour"],
        minutes=unit_time["minute"],
        seconds=unit_time["second"],
    )
    return current_time

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/883071.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为云centos7.9按装ambari 2.7.5 hostname 踩坑记录

华为云centos7.9按装ambari 2.7.5踩坑记录 前言升华总结 前言 一般都是废话&#xff0c;本人专业写bug业余运维。起初找了三台不废弃的台式机&#xff0c;开始重装centos系统&#xff0c;开始了HDP3.1.5Ambari2.7.5安装。 推荐一波好文&#xff0c;一路长绿。跑了一段时间没啥…

学习国语的时候需要用到什么翻译工具?《维汉翻译通》app现在已经支持国语拼音和维汉词典查单词功能

《维汉翻译通》App是一款免费的翻译工具&#xff0c;专为维吾尔语与中文之间的沟通设计。它不仅是一款翻译应用&#xff0c;也是新疆人学习中文的得力助手。 功能亮点 免费翻译服务&#xff1a;提供快速准确的短文本翻译&#xff0c;无论是日常用语还是专业术语。智能OCR技术&…

mysql批量修改表前缀

现有表前缀xh,批量修改为fax_需要怎么做 SELECTCONCAT(ALTER TABLE ,table_name, RENAME TO fax_,substring(table_name, 3),;) FROMinformation_schema. TABLES WHEREtable_name LIKE xh_%; 运行之后可以但是生成了一批修改表明的命令 此时批量复制执行就可实现批量修改表前…

基于Node.js+Express+MySQL+VUE新闻网站管理系统的设计与实现

1. 引言 随着互联网技术的发展&#xff0c;人们获取信息的方式发生了巨大的变化。传统的新闻媒体逐渐向数字化、智能化方向发展。新闻推荐网站管理系统能够帮助新闻网站更好地管理和推荐新闻内容&#xff0c;提高用户体验。本文将详细介绍一个新闻推荐网站管理系统的整体设计与…

申论笔记杉树林

同义词尽量用文章中的词进行拼凑不一定要有前置词分条 单一题 同义词给分不一定需要前置词分条 1、2、3、尽量抄文章中的词&#xff0c;通顺即可&#xff0c;不一定要成句子不要过分关注形式 题干&#xff1a; 条理清晰&#xff1a;要求分条&#xff0c;尽量有提示词…

Python网络爬虫获取Wallhaven壁纸图片(源码)

** 话不多说&#xff0c;直接附源码&#xff0c;可运行&#xff01; ** import requests from lxml import etree from fake_useragent import UserAgent import timeclass wallhaven(object):def __init__(self):# yellow# self.url "https://wallhaven.cc/search?co…

浙大数据结构:05-树8 File Transfer

数据结构MOOC PTA习题 这道题考察并查集的操作&#xff0c;合并以及找根结点 机翻&#xff1a; 1、条件准备 node是数组存放1-N结点的根节点的&#xff0c;n为总结点数 #include <iostream> using namespace std;const int N 1e4 5; int node[N]; int n; 先初始化…

C++ | Leetcode C++题解之第420题强密码检验器

题目&#xff1a; 题解&#xff1a; class Solution { public:int strongPasswordChecker(string password) {int n password.size();bool has_lower false, has_upper false, has_digit false;for (char ch: password) {if (islower(ch)) {has_lower true;}else if (isu…

华为HarmonyOS灵活高效的消息推送服务(Push Kit) -- 10 推送实况窗消息

场景介绍 实况窗是一种帮助用户聚焦正在进行的任务&#xff0c;方便快速查看和即时处理的通知形态。有关实况窗简介、权限申请、开放场景、设计规范等说明&#xff0c;请参见Live View Kit简介。 通过Push Kit发送的实况窗消息支持三种操作类型&#xff0c;分别是&#xff1a…

可变剪接分析一步到位,这个 R 包够猛!

生信碱移 ASpediaFI可变剪接 可变剪接&#xff08;Alternative Splicing, AS&#xff09;是基因表达过程中一种重要的调控机制&#xff0c;通过这种机制&#xff0c;单个基因可以产生多个不同的mRNA转录本&#xff0c;这些转录本通过不同的剪接方式&#xff08;即选择性地包括…

Vue使用axios二次封装、解决跨域问题

1、什么是 axios 在实际开发过程中&#xff0c;浏览器通常需要和服务器端进行数据交互。而 Vue.js 并未提供与服务器端通信的接口。从 Vue.js 2.0 版本之后&#xff0c;官方推荐使用 axios 来实现 Ajax 请求。axios 是一个基于 promise 的 HTTP 客户端。 关于 promise 的详细介…

AGV小车全双工通信应用-低延迟、8路并发全双工通信

随着智能制造和物流行业的不断发展&#xff0c;AGV小车&#xff08;自动导引车&#xff09;在工厂、仓库、物流中心的应用日益广泛。AGV小车凭借其自动化、高效、灵活的特点&#xff0c;逐渐成为物料搬运中的关键设备。在这种复杂多变的环境中&#xff0c;数据传输的可靠性、实…

c语言200例 063 信息查询

大家好&#xff0c;欢迎来到无限大的频道。 今天给大家带来的是c语言200例 题目要求&#xff1a; 从键盘当中输入姓名和电话号&#xff0c;以“#”结束&#xff0c;编程实现输入姓名、查询电话号的功能。 参考代码如下&#xff1a; #include <stdio.h> #include <st…

计算机视觉的应用34-基于CV领域的人脸关键点特征智能提取的技术方法

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用34-基于CV领域的人脸关键点特征智能提取的技术方法。本文主要探讨计算机视觉领域中人脸关键点特征智能提取的技术方法。详细介绍了基于卷积神经网络模型进行人脸关键点提取的过程&#xff0c;包括使…

css-functions伪类选择器系列二

一张图浏览CSS Functions 概述 本文主要讲述CSS的部分伪类选择器第二篇,包括::nth-child、:nth-last-child、:nth-of-type和:nth-last-of-type。 :nth-child() :nth-child伪类是根据父元素的子元素列表中的索引来选择元素。 语法 :nth-child是以一个参数nth来描述匹配兄…

apache paimon简介(官翻)

介绍 如下架构所示: 读/写操作: Paimon 支持多样化的数据读写方式,并支持 OLAP 查询。 读取: 支持从历史快照(批处理模式)中消费数据,从最新偏移量(流处理模式)中读取数据,或以混合方式读取增量快照。写入: 支持从数据库变更日志(CDC)进行流式同步,从离线数据中…

Android平台使用VIA创建语音交互应用

Android平台使用VIA创建语音交互应用 概述 在 Android 平台上开发一款语音助手应用需要整合多种技术,包括语音识别(ASR)、文字转语音(TTS)、以及热词检测(Hotword Detection)。这些技术共同构成了语音助手应用的核心交互方式,使用户能够通过语音命令与设备进行无缝交…

EfficientNet(2019):基于复合缩放的自动化架构搜索高效网络!

EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks EfficientNet&#xff1a;重新思考卷积神经网络的模型扩展 论文下载地址&#xff1a; https://arxiv.org/abs/1905.11946 学习笔记参考了这位大佬&#xff1a;https://blog.csdn.net/qq_37541097/ar…

ProgrammerAI—AI辅助编程学习指南

前言 随着AIGC&#xff08;AI生成内容&#xff09;技术的快速发展&#xff0c;诸如ChatGPT、MidJourney和Claude等大语言模型相继涌现&#xff0c;AI辅助编程工具正逐步改变程序员的工作方式。这些工具不仅可以加速代码编写、调试和优化过程&#xff0c;还能帮助解决复杂的编程…

python标识符和关键字

1、标识符 1.1 写法 标识符由字母、下划线和数字组成&#xff0c;且数字不能开头。严格区分大小写。不能使用关键字。 # 标识符由字母、下划线和数字组成&#xff0c;且数字不能开头。 # a_1_$ 1 # print(a_1_$)# 严格区分大小写。 # Animal 1 # print(animal)# 不能使用关…