Datetime Python modülünü kullanarak geçerli tarihten altı ay sonraki tarihi nasıl hesaplayabilirim?


391

Datetime Python modülünü kullanıyorum. Şu anki tarihten 6 ay sonra tarihi hesaplamak istiyorum. Birisi bana bunu yaparken biraz yardım edebilir mi?

Geçerli tarihten 6 ay sonra bir tarih oluşturmak istememin nedeni, bir inceleme tarihi oluşturmaktır . Kullanıcı sisteme veri girerse, verileri girdiği tarihten itibaren 6 aylık bir inceleme tarihine sahip olacaktır.


2
Daha spesifik olmanız gerekecek: 31 Mart'tan altı ay ne zaman? Peki 30 Ağustos?
kmkaplan

3
Evet, düzenleme yardımcı olur: Bu, 6 ay ila 183 gün arasında kötü bir etki olmadan yaklaşık tahmin edebileceğiniz anlamına gelir. Yani bugün 183 gün eklemek hileyi yapacak.
kmkaplan

15
Yukarıdaki yorumlar bana aptalca geliyor. "Altı ay ekleme" kavramı oldukça açıktır - Aralık ayı geçecek olursak 6, yıl bileşenini (ve ayı geri dönüş 1) destekleyerek ay bileşenini alın ve ekleyin . Bu, tam da relativedeltabu tür bir kavramı destekleyen her programlama dilinin yaptığı ve aslında yaptığı şeydir.
Kirk Woll

5
@KirkWoll: Eminim oldukça açıktır. Ama kim konuşuyorsa hala farklı. Python: date(2015, 3, 31) + relativedelta(months = 6)verir datetime.date(2015, 9, 30). Perl: DateTime->new(year=>2000, month=>3, day=>31)->add(months=>6)verir 2000-10-01T00:00:00. Php: date_create('2000-03-31', new DateTimeZone('UTC'))->add(new DateInterval('P6M'))2000-10-01 verir. Zehirini seç.
kmkaplan

2
... 182 eklenmesi bir inceleme tarihi oluşturmak için daha pragmatik görünüyor : haftanın gününü olduğu gibi bırakıyor.
Kurt

Yanıtlar:


1047

Bu çözümü iyi buldum. (Bu, python-dateutil uzantısını kullanır )

from datetime import date
from dateutil.relativedelta import relativedelta

six_months = date.today() + relativedelta(months=+6)

Bu yaklaşımın avantajı, 28, 30, 31 gün vb. Konuları ele almasıdır. Bu, iş kurallarını ve senaryolarını (fatura oluşturma vb.

$ date(2010,12,31)+relativedelta(months=+1)
  datetime.date(2011, 1, 31)

$ date(2010,12,31)+relativedelta(months=+2)
  datetime.date(2011, 2, 28)

2
+6, -6 olabileceğinin bir göstergesi, aynı şey günler ve yıllar için de geçerlidir :)
securecurve

5
@sliders_alpha Python-dateutil paketini kurmanız gerekiyor (pip install python-dateutil)
poiuytrez

18
Bu doğru çözüm. OP 6 ay yerine 6 yıl soracak olursa, onaylanan cevap sefil bir şekilde başarısız olur. Bu yüzden, cevapların daha genel hale geldiklerinde daha değerli olduğunu akılda tutmak gerekir.
Daniel F

3
Bu relativedeltafonksiyonun month, geçen aydaki temelde ayı değiştiren / ayarlayan / değiştiren bir argüman olarak da ele aldığını ve bu da daha fazla ay eklemekten çok farklı olduğunu lütfen unutmayın . Sadece aylar içinde ekstra s unuttukları için fonksiyon bozuk olup olmadığını merak millet için bir önsöz .
shad0w_wa1k3r

1
Merak ediyorum: kimse bunun neden varsayılan olarak dahil olmadığını biliyor mu? Timedelta datetimevarsayılan olarak paketlenmiş gibi görünüyor . Aslında "ayları" timedelta'ya geçirebileceğimi sanıyordum.
dTanMan

51

Bu, şu andan itibaren 6 ay ne demek istediğinize bağlı.

  1. Doğal ayları kullanma:

    (day, month, year) = (day, (month + 5) % 12 + 1, year + (month + 5)/12)
  2. Bir bankacının tanımını kullanarak, 6 * 30:

    date += datetime.timedelta(6 * 30)

3
Yarım yıl tanımını (183 gün) artı 26 hafta tanımını da söyleyebilir misiniz? Hepsinin tek bir yerde olmasına yardımcı olur.
S.Lott

11
sadece hızlı bir açıklama: Bence, ay için formül haziran için (ay + 5)% 12 + 1 b / c olur, formülünüz 0 verir, ancak beklenen sonuç 12 olur ... bu küçük hataya rağmen, aklım, cevabınız soruyu en iyi cevaplayan soru
PierrOz

3
ve yıl için aynı: yıl + (ay + 5) / 12 olmalıdır
PierrOz

7
Tarih 31 ise ve altı ay sonraki ayın 31 günü olamazsa (31 gün olan çoğu ay için durum budur)?
akv

4
Downvote çünkü ilk çözüm (day, month, year) = (day, (month+6)%12, year+(month+6)/12)buggy olabilir, çünkü geçersiz tarihler üretir gibi (31, 8, 2015)->(31, 2, 2016)
ohw

37

Python 3.x ile şu şekilde yapabilirsiniz:

from datetime import datetime, timedelta
from dateutil.relativedelta import *

date = datetime.now()
print(date)
# 2018-09-24 13:24:04.007620

date = date + relativedelta(months=+6)
print(date)
# 2019-03-24 13:24:04.007620

ancak python-dateutil modülünü kurmanız gerekir :

pip install python-dateutil

İçin seçildipip install ...
Nathan

Ben tavsiye ederim from dateutil.relativedelta import relativedelta. Kullanmak import *açık değildir.
Sam Morgan

19

Aydan aya kadar hesaplama için:

from datetime import timedelta
from dateutil.relativedelta import relativedelta

end_date = start_date + relativedelta(months=delta_period) + timedelta(days=-delta_period)

18
Bu, yorumlarda yukarıda belirtilen relativedelta çözümü değildir. 600+ upvotes ile çözüm için ilerlemeye devam edin.
Nostalg.io

15

"6 ay" ile ne demek istiyorsun?

2009-02-13 + 6 ay == 2009-08-13 mi? Yoksa 2009-02-13 + 6 * 30 gün mü?

import mx.DateTime as dt

#6 Months
dt.now()+dt.RelativeDateTime(months=6)
#result is '2009-08-13 16:28:00.84'

#6*30 days
dt.now()+dt.RelativeDateTime(days=30*6)
#result is '2009-08-12 16:30:03.35'

Mx.DateTime hakkında daha fazla bilgi


14

Bu yüzden, dateutil.relativedeltageçen yıl yineleme yapmak için şu anki tarihe her ay bir ay atlamak için yararlı bulduğum bir örnek :

>>> import datetime
>>> from dateutil.relativedelta import relativedelta
>>> today = datetime.datetime.today()
>>> month_count = 0
>>> while month_count < 12:
...  day = today - relativedelta(months=month_count)
...  print day
...  month_count += 1
... 
2010-07-07 10:51:45.187968
2010-06-07 10:51:45.187968
2010-05-07 10:51:45.187968
2010-04-07 10:51:45.187968
2010-03-07 10:51:45.187968
2010-02-07 10:51:45.187968
2010-01-07 10:51:45.187968
2009-12-07 10:51:45.187968
2009-11-07 10:51:45.187968
2009-10-07 10:51:45.187968
2009-09-07 10:51:45.187968
2009-08-07 10:51:45.187968

Diğer cevaplarda olduğu gibi, “şimdi 6 ay” ile ne demek istediğinizi anlamanız gerekir. "Gelecekte altı yıl içinde ayın bugünkü günü" demek istiyorsan, o zaman bu olurdu:

datetime.datetime.now() + relativedelta(months=6)

14

Bu çözüm, bu sayfadaki cevapların çoğunun çalışmadığı Aralık için doğru çalışır. Modülü (%) veya tamsayı bölümünü (//) kullanmadan önce ayları temel 1'den (yani Ocak = 1) taban 0'a (yani Ocak = 0) kaydırmanız gerekir, aksi takdirde Kasım (11) artı 1 ay size 12 verir geri kalanını (% 12 12) bulurken 0 verir.

(Ve "(ay% 12) + 1" veya Ekim + 1 = Aralık!

def AddMonths(d,x):
    newmonth = ((( d.month - 1) + x ) % 12 ) + 1
    newyear  = int(d.year + ((( d.month - 1) + x ) / 12 ))
    return datetime.date( newyear, newmonth, d.day)

Ancak ... Bu 31 Ocak + bir ay gibi bir sorunu açıklamaz. OP'ye geri dönüyoruz - bir ay ekleyerek ne demek istiyorsun? Bir çözüm, çoğu insanın jan'ın son gününü ve bir ayın Şubat'ın son gününe eşit olduğu düşünülürse, geçerli bir güne ulaşıncaya kadar geri takip etmektir. Kanıt:

>>> import datetime
>>> AddMonths(datetime.datetime(2010,8,25),1)
datetime.date(2010, 9, 25)
>>> AddMonths(datetime.datetime(2010,8,25),4)
datetime.date(2010, 12, 25)
>>> AddMonths(datetime.datetime(2010,8,25),5)
datetime.date(2011, 1, 25)
>>> AddMonths(datetime.datetime(2010,8,25),13)
datetime.date(2011, 9, 25)
>>> AddMonths(datetime.datetime(2010,8,25),24)
datetime.date(2012, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-1)
datetime.date(2010, 7, 25)
>>> AddMonths(datetime.datetime(2010,8,25),0)
datetime.date(2010, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-12)
datetime.date(2009, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-8)
datetime.date(2009, 12, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-7)
datetime.date(2010, 1, 25)>>> 

3
"31 Ocak + bir ay" sorununu düzeltir: days_in_month = calendar.monthrange (newyear, newmonth) [1]; yeni gün = dk (gün, gün_ay_ay); (çok büyükse güne çarpar örneğin 31 Şubat - 28 Şubat 29)
Curtis Yallop

Bu benim için sadece newyear'ı tam sayı veri türüne dönüştürerek çalıştı def AddMonths (d, x): newmonth = (((d.month - 1) + x)% 12) + 1 newyear = d.year + int (( (d.ay - 1) + x) / 12) datetime.date (newyear, newmonth, d.day) dönüşü
Manmeet Singh

12

Bunun 6 ay olduğunu biliyorum, ancak bir ay ekliyorsanız cevap Google'da "python'a ay eklemek" için gösteriyor:

import calendar

date = datetime.date.today()    //Or your date

datetime.timedelta(days=calendar.monthrange(date.year,date.month)[1])

bu, geçerli aydaki günleri sayar ve bunları geçerli tarihe ekler; 365/12 kullanmak yılın 1/12 reklamını tarih üzerinden yinelemeniz halinde kısa / uzun aylar için sorunlara neden olabilir.



10

Ayları ayıklamak, aylarınızı eklemek ve yeni bir dateobject oluşturmak için timetuple yöntemini kullanmanız yeterlidir. Bunun için zaten mevcut bir yöntem varsa bunu bilmiyorum.

import datetime

def in_the_future(months=1):
    year, month, day = datetime.date.today().timetuple()[:3]
    new_month = month + months
    return datetime.date(year + (new_month / 12), (new_month % 12) or 12, day)

API biraz beceriksiz, ancak örnek olarak çalışıyor. Ayrıca 2008-01-31 + 1 ay gibi köşe davalarında da çalışmayacak. :)


3
Kodunuzdaki hata: new_month % 12olmalıdır (new_month % 12) or 12. Aksi takdirde bunu Kasım ayında denerseniz bir hata alırsınız. :)
Jordan Reiter

Bu aslında kabul edilen çözümden çok daha temiz. Bu yeni bir ithalat gerektirmez, sadece temel matematik
Simon PA

dönüş datetime.date (yıl + (yeni_ay / 12), (yeni_ay% 12) veya 12, gün)
paytam

9

Dateutil paketi bu işlevselliğin uygulanmasına sahiptir. Ancak , diğerlerinin işaret ettiği gibi , bunun naif olacağını unutmayın .


dateutil harika. Easy_install ile de kurulabilir.
Soviut

Mükemmel. Bunu önerdiğin için teşekkürler. Tanrý-yollu gibi görünüyor.
ayaz

9

Python standart kitaplıklarını, yani dateutilya da başkalarını kullanmak ve '31 Şubat' problemini çözmek:

import datetime
import calendar

def add_months(date, months):
    months_count = date.month + months

    # Calculate the year
    year = date.year + int(months_count / 12)

    # Calculate the month
    month = (months_count % 12)
    if month == 0:
        month = 12

    # Calculate the day
    day = date.day
    last_day_of_month = calendar.monthrange(year, month)[1]
    if day > last_day_of_month:
        day = last_day_of_month

    new_date = datetime.date(year, month, day)
    return new_date

Test yapmak:

>>>date = datetime.date(2018, 11, 30)

>>>print(date, add_months(date, 3))
(datetime.date(2018, 11, 30), datetime.date(2019, 2, 28))

>>>print(date, add_months(date, 14))
(datetime.date(2018, 12, 31), datetime.date(2020, 2, 29))

Bunun bir hatası var: Hedef ay Aralık ise, gerekenden bir yıl sonra bir tarih döndürür. Örnek: add_months(datetime.date(2018, 11, 30), 1)iadeler datetime.date(2019, 12, 30)(yıl 2019 değil 2018 olmalı). Bu nedenle, bunun için özel, iyi test edilmiş bir kütüphane kullanın! Gerçekten sadece standart kütüphane modüllerini kullanmanız gerekiyorsa, benzer bir soruya verdiğim cevaba bakın .
taleinat

5

'31 Şubat' sorununu çözmenin daha iyi bir yolu var:

def add_months(start_date, months):
    import calendar

    year = start_date.year + (months / 12)
    month = start_date.month + (months % 12)
    day = start_date.day

    if month > 12:
        month = month % 12
        year = year + 1

    days_next = calendar.monthrange(year, month)[1]
    if day > days_next:
        day = days_next

    return start_date.replace(year, month, day)

Sanırım negatif sayılarla da çalışıyor (ayları çıkarmak için), ama bunu çok fazla test etmedim.


1
Bu yanıt, sorunu yalnızca yerleşik Python kitaplıklarını kullanarak doğru bir şekilde çözmenin avantajına sahiptir. Eşdeğer fakat biraz daha kısa bir cevap için stackoverflow.com/a/4131114/302264 adresini kontrol edin.
Eduardo Dobay

3

PyQt4'ün QDate sınıfı bir addmonths işlevine sahiptir.

>>>from PyQt4.QtCore import QDate  
>>>dt = QDate(2009,12,31)  
>>>required = dt.addMonths(6) 

>>>required
PyQt4.QtCore.QDate(2010, 6, 30)

>>>required.toPyDate()
datetime.date(2010, 6, 30)

3

Buna ne dersin? Başka bir kitaplık ( dateutil) kullanmıyor timedeltamusunuz? bina vartec yanıt 'ın Bunu yaptım ve bunun işe yaradığını inanıyoruz:

import datetime

today = datetime.date.today()
six_months_from_today = datetime.date(today.year + (today.month + 6)/12, (today.month + 6) % 12, today.day)

Kullanmayı denedim timedelta, çünkü günleri sayıyor 365/2veya 6*356/12her zaman 6 aya çevirmiyor, daha ziyade 182 gün. Örneğin

day = datetime.date(2015, 3, 10)
print day
>>> 2015-03-10

print (day + datetime.timedelta(6*365/12))
>>> 2015-09-08

Genellikle belirli bir günden 6 ayın ayın aynı gününe ancak 6 ay sonra ineceğini varsayıyoruz (yani, 2015-03-10-> 2015-09-10, Değil 2015-09-08)

Umarım bunu faydalı bulursun.


1
day + datetime.timedelta(6*365/12)bazı yıllar 365 gün, diğerleri 366 gün olduğu için her zaman çalışmaz.
3kstc

3

Bu belirli soruya cevap vermiyor ( datetimesadece kullanarak ), ancak başkalarının farklı modüllerin kullanılmasını önerdiği göz önüne alındığında, burada bir çözüm var pandas.

import datetime as dt
import pandas as pd

date = dt.date.today() - \
       pd.offsets.DateOffset(months=6)

print(date)

2019-05-04 00:00:00

Artık yıllarda beklendiği gibi çalışıyor

date = dt.datetime(2019,8,29) - \
       pd.offsets.DateOffset(months=6)
print(date)

2019-02-28 00:00:00

2

Zope'de kullanmak ve geçersiz gün sayılarını işlemek için AddMonths () üzerinde değişiklik yapıldı:

def AddMonths(d,x):
    days_of_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    newmonth = ((( d.month() - 1) + x ) % 12 ) + 1
    newyear  = d.year() + ((( d.month() - 1) + x ) // 12 ) 
    if d.day() > days_of_month[newmonth-1]:
      newday = days_of_month[newmonth-1]
    else:
      newday = d.day() 
    return DateTime( newyear, newmonth, newday)

Bu artık yılları (Şubat ayında 29 gün) dikkate almıyor gibi görünüyor.
sap

2
import time

def add_month(start_time, months):  

        ret = time.strptime(start_time, '%Y-%m-%d')
        t = list(ret)

        t[1] += months

        if t[1] > 12:
            t[0] += 1 + int(months / 12)

            t[1] %= 12

        return int(time.mktime(tuple(t)))

1
import datetime


'''
Created on 2011-03-09

@author: tonydiep
'''

def add_business_months(start_date, months_to_add):
    """
    Add months in the way business people think of months. 
    Jan 31, 2011 + 1 month = Feb 28, 2011 to business people
    Method: Add the number of months, roll back the date until it becomes a valid date
    """
    # determine year
    years_change = months_to_add / 12

    # determine if there is carryover from adding months
    if (start_date.month + (months_to_add % 12) > 12 ):
        years_change = years_change + 1

    new_year = start_date.year + years_change

    # determine month
    work = months_to_add % 12
    if 0 == work:
        new_month = start_date.month
    else:
        new_month = (start_date.month + (work % 12)) % 12

    if 0 == new_month:
        new_month = 12 

    # determine day of the month
    new_day = start_date.day
    if(new_day in [31, 30, 29, 28]):
        #user means end of the month
        new_day = 31


    new_date = None
    while (None == new_date and 27 < new_day):
        try:
            new_date = start_date.replace(year=new_year, month=new_month, day=new_day)
        except:
            new_day = new_day - 1   #wind down until we get to a valid date

    return new_date


if __name__ == '__main__':
    #tests
    dates = [datetime.date(2011, 1, 31),
             datetime.date(2011, 2, 28),
             datetime.date(2011, 3, 28),
             datetime.date(2011, 4, 28),
             datetime.date(2011, 5, 28),
             datetime.date(2011, 6, 28),
             datetime.date(2011, 7, 28),
             datetime.date(2011, 8, 28),
             datetime.date(2011, 9, 28),
             datetime.date(2011, 10, 28),
             datetime.date(2011, 11, 28),
             datetime.date(2011, 12, 28),
             ]
    months = range(1, 24)
    for start_date in dates:
        for m in months:
            end_date = add_business_months(start_date, m)
            print("%s\t%s\t%s" %(start_date, end_date, m))

1

Johannes Wei'nin 1new_month = 121 davasındaki cevabı değiştirildi. Bu benim için mükemmel bir şekilde çalışıyor. Aylar olumlu veya olumsuz olabilir.

def addMonth(d,months=1):
    year, month, day = d.timetuple()[:3]
    new_month = month + months
    return datetime.date(year + ((new_month-1) / 12), (new_month-1) % 12 +1, day)

2
Başlangıç ​​tarihindeki gün, hedef aydaki gün sayısından fazla olduğunda "mükemmel çalışmaz". Örnek: 2001-01-31 artı bir ay 2001-02-31 tarihi oluşturmaya çalışır.
John Machin

1

Yine başka bir çözüm - umarım birisi beğenir:

def add_months(d, months):
    return d.replace(year=d.year+months//12).replace(month=(d.month+months)%12)

Bu çözüm tüm durumlar için 29,30,31 günlerde çalışmaz, bu nedenle daha sağlam bir çözüme ihtiyaç vardır (bu artık çok hoş değil :)):

def add_months(d, months):
    for i in range(4):
        day = d.day - i
        try:
            return d.replace(day=day).replace(year=d.year+int(months)//12).replace(month=(d.month+int(months))%12)
        except:
            pass
    raise Exception("should not happen")

1

Gönderen bu cevap , bkz parsedatetime . Kod örneği aşağıdadır. Daha fazla detay: birçok doğal dille birim testi -> YYYY-AA-GG dönüştürme örnekleri ve görünür parsedatetime dönüştürme zorlukları / hataları .

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time, calendar
from datetime import date

# from https://github.com/bear/parsedatetime
import parsedatetime as pdt

def print_todays_date():
    todays_day_of_week = calendar.day_name[date.today().weekday()]
    print "today's date = " + todays_day_of_week + ', ' + \
                              time.strftime('%Y-%m-%d')

def convert_date(natural_language_date):
    cal = pdt.Calendar()
    (struct_time_date, success) = cal.parse(natural_language_date)
    if success:
        formal_date = time.strftime('%Y-%m-%d', struct_time_date)
    else:
        formal_date = '(conversion failed)'
    print '{0:12s} -> {1:10s}'.format(natural_language_date, formal_date)

print_todays_date()
convert_date('6 months')

Yukarıdaki kod bir MacOSX makinesinden aşağıdakileri üretir:

$ ./parsedatetime_simple.py 
today's date = Wednesday, 2015-05-13
6 months     -> 2015-11-13
$ 

1

Kullanıcının, günün aydaki gün sayısından daha büyük olduğu bir tarihin nasıl döndürüleceğine karar vermesini sağlayan bir örnek.

def add_months(date, months, endOfMonthBehaviour='RoundUp'):
    assert endOfMonthBehaviour in ['RoundDown', 'RoundIn', 'RoundOut', 'RoundUp'], \
        'Unknown end of month behaviour'
    year = date.year + (date.month + months - 1) / 12
    month = (date.month + months - 1) % 12 + 1
    day = date.day
    last = monthrange(year, month)[1]
    if day > last:
        if endOfMonthBehaviour == 'RoundDown' or \
            endOfMonthBehaviour == 'RoundOut' and months < 0 or \
            endOfMonthBehaviour == 'RoundIn' and months > 0:
            day = last
        elif endOfMonthBehaviour == 'RoundUp' or \
            endOfMonthBehaviour == 'RoundOut' and months > 0 or \
            endOfMonthBehaviour == 'RoundIn' and months < 0:
            # we don't need to worry about incrementing the year
            # because there will never be a day in December > 31
            month += 1
            day = 1
    return datetime.date(year, month, day)


>>> from calendar import monthrange
>>> import datetime
>>> add_months(datetime.datetime(2016, 1, 31), 1)
datetime.date(2016, 3, 1)
>>> add_months(datetime.datetime(2016, 1, 31), -2)
datetime.date(2015, 12, 1)
>>> add_months(datetime.datetime(2016, 1, 31), -2, 'RoundDown')
datetime.date(2015, 11, 30)

1

datetime değişkeninize tarih adı verildiğinde:

date=datetime.datetime(year=date.year+int((date.month+6)/12),
                       month=(date.month+6)%13 + (1 if (date.month + 
                       months>12) else 0), day=date.day)

1

Genel işlev x aydan sonraki / sonraki ayları almak için kullanılır.

datetime içe aktarma tarihinden

ay sonra def (verilen_tarihi, ay):
    yyyy = int (((verilen_tarihi.yıl * 12 + verilen_tarihi.ay) + ay) / 12)
    mm = int (((verilen_tarihi.yıl * 12 + verilen_tarihi.ay) + ay)% 12)

    mm == 0 ise:
        yyyy - = 1
        mm = 12
    return_date.replace (yıl = yyyy, ay = mm)


__name__ == "__main__" ise:
    bugün = date.today ()
    Baskı (bugün)

    mm için [-12, -1, 0, 1, 2, 12, 20]:
        next_date = ay sonrası (bugün, mm)
        yazdırmak (next_date)

Bu en iyi cevaptır. Yuvarlama sorunu olmadan basit ve etkili.
jprobichaud

1

Hızlı bir öneri Arrow

pip install oku

>>> import arrow

>>> arrow.now().date()
datetime.date(2019, 6, 28)
>>> arrow.now().shift(months=6).date()
datetime.date(2019, 12, 28)

0

Datetime.today () öğesine altı aylık bir zaman aralığı eklemek için python datetime modülünü kullanın.

http://docs.python.org/library/datetime.html

Elbette Johannes Weiß'in gündeme getirdiği sorunu çözmek zorunda kalacaksınız - 6 ayda ne demek istiyorsun?


1
timedelta ayları desteklemez ve bu nedenle "6 ayda kaç gün?" sorusuna olası cevapları kaldırır. Eef'in kodu bir gözden geçirme tarihi ayarlayacaktır, böylece bir gün (6 * 30) kullanarak timedelta ayarlamayı düşünebilirsiniz. Süre, müşterilerin bir ürüne / hizmete erişimini temsil ediyorsa, bir işletme tanımı gerekli / tercih edilebilir.
Carl

0

Ben de bunu buldum. Doğru sayıda ay ve yıl taşır ancak günleri göz ardı eder (bu benim durumumda ihtiyacım olan şeydi).

import datetime

month_dt = 4
today = datetime.date.today()
y,m = today.year, today.month
m += month_dt-1
year_dt = m//12
new_month = m%12
new_date = datetime.date(y+year_dt, new_month+1, 1)

0

Yıl ve ay değiştirmek için bu işlevi kullanın, ancak gün tutmak:

def replace_month_year(date1, year2, month2):
    try:
        date2 = date1.replace(month = month2, year = year2)
    except:
        date2 = datetime.date(year2, month2 + 1, 1) - datetime.timedelta(days=1)
    return date2

Yazmalısınız:

new_year = my_date.year + (my_date.month + 6) / 12
new_month = (my_date.month + 6) % 12
new_date = replace_month_year(my_date, new_year, new_month)

0

El ile gün eklemek yerine böyle bir şey yapmak daha güvenli olacağını düşünüyorum:

import datetime
today = datetime.date.today()

def addMonths(dt, months = 0):
    new_month = months + dt.month
    year_inc = 0
    if new_month>12:
        year_inc +=1
        new_month -=12
    return dt.replace(month = new_month, year = dt.year+year_inc)

newdate = addMonths(today, 6)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.