回答

收藏

如何在python的datetime.date在对象中加入 3个月?

技术问答 技术问答 273 人阅读 | 0 人回复 | 2023-09-14

Python你在哪里计算日期?我有一个python应用程序需要每三个月绘制几年的日期。重要的是,日期每年准确发生4次,日期应尽可能在每年的同一天,日期应尽可能在每月的同一天,日期应尽可能接近$ c5 _" p& `) C1 I% L$ O
3个月”(这是一个不断变化的目标,尤其是在leap年)。不幸的是,datetime.timedelta几个月不支持!
3 N1 h+ \; ^- L' k1 O0 ^9 C有没有一种“标准”的方式来在python这个计算是在中间进行的?
8 \/ z1 m5 N* lSQL方式?如果最糟糕的情况变得更糟,我会打赌让我的应用程序走向PostgreSQL(确实对日期计算有很好的内置支持)给出以下答案:
" I, k! w& t. @4 h' E: G# `# select ('2010-11-29'::date   interval '3 months')::date;    date    ------------ 2011-02-28(1 row)               
" |2 i7 w5 u0 `) B  A    解决方案:                                                               
& K. a: W% F, x7 v. _5 {                                                                如果你想找到确切的日期或更准确的日期,最好检查一下dateutil。* [1 U# S) v) ^3 S
快速示例:1 Q1 ^  ~3 I- ^" P( \( F6 q" L/ o* j+ R
>>> from dateutil.relativedelta import relativedelta>>> import datetime>>> TODAY = datetime.date.today()>>> TODAYdatetime.date(2012,3,6)现在,加上3个月TODAY,观察它与当天完全匹配(请注意,relativedelta(months=3)并且relativedelta(month=3)行为不同。请确保使用。months这些示例!)。( e% K8 }9 R! _8 X
>>> three_mon_rel = relativedelta(months=3)>>> TODAY   three_mon_reldatetime.date(2012,6,6)并在整个一年内保持一致。字面上说,这一天是每三个月一次(必须继续添加,因为某种原因会发生a乘relativedelta并添加datetime.date对象会抛出TypeError):& B$ ^5 F0 C3 b8 a
>>> TODAY   three_mon_rel   three_mon_reldatetime.date(2012,9,6)>>> TODAY   three_mon_rel   three_mon_rel   three_mon_reldatetime.date(2012,12,6)>>> TODAY   three_mon_rel   three_mon_rel   three_mon_rel   three_mon_reldatetime.date(2013,3,6)而mVChr虽然建议解决方案必须足够好,但随着时间的推移会稍微漂移:6 j0 O7 }6 a$ A* N+ M+ U& Q  t" r
>>> three_mon_timedelta = datetime.timedelta(days=3 * 365/12)>>> TODAY   three_mon_timedeltadatetime.date(2012,6,5)一一年的过程中,一个月的某一天继续下降:
+ d! J$ G9 I8 l+ ]9 M4 U4 L: }8 S>>> TODAY   three_mon_timedelta * 2datetime.date(2012,9,4)>>> TODAY   three_mon_timedelta * 3datetime.date(2012,12,4)>>> TODAY   three_mon_timedelta * 4datetime.date(2013,3,5)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则