datetime Python 모듈을 사용하여 현재 날짜에서 6 개월 동안 날짜를 어떻게 계산합니까?


391

datetime Python 모듈을 사용하고 있습니다. 현재 날짜에서 6 개월 날짜를 계산하려고합니다. 누군가이 일을 조금 도와 줄 수 있습니까?

현재 날짜에서 6 개월 동안 날짜를 생성하려는 이유는 검토 날짜 를 생성하기위한 것 입니다. 사용자가 시스템에 데이터를 입력하면 데이터를 입력 한 날짜로부터 6 개월의 검토 날짜가됩니다.


2
보다 구체적이어야합니다. 3 월 31 일부터 6 개월은 언제입니까? 그리고 8 월 30 일부터?
kmkaplan

3
예, 편집이 도움이됩니다. 즉, 6 개월에서 183 일까지 아무런 영향을 미치지 않을 수 있습니다. 따라서 오늘에 183 일을 추가하면 속임수가됩니다.
kmkaplan

15
위의 의견은 나를 바보처럼 생각합니다. "6 개월 추가"라는 개념은 매우 분명 합니다. 12 월을 지나면 61 년 동안의 롤링 (및 월 순환)을 지원 하여 월 구성 요소를 가져와 추가 합니다 1. 이것은 정확히 무엇을 relativedelta하고 실제로 이런 종류의 개념을 지원하는 모든 프로그래밍 언어가하는 일입니다.
Kirk Woll

5
@ KirkWoll : 나는 그것이 분명하다는 것을 확신합니다. 그러나 여전히 말하는 사람마다 다릅니다. 파이썬 : date(2015, 3, 31) + relativedelta(months = 6)제공합니다 datetime.date(2015, 9, 30). 펄 : DateTime->new(year=>2000, month=>3, day=>31)->add(months=>6)제공합니다 2000-10-01T00:00:00. PHP : date_create('2000-03-31', new DateTimeZone('UTC'))->add(new DateInterval('P6M'))2000-10-01을 제공합니다. 독을 선택하십시오.
kmkaplan

2
... 182를 추가하면 검토 날짜 를 생성하는 것이 더 실용적입니다 . 요일을 그대로 유지합니다.
Wolf

답변:


1047

이 솔루션이 좋은 것으로 나타났습니다. (이것은 python-dateutil 확장명을 사용합니다 )

from datetime import date
from dateutil.relativedelta import relativedelta

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

이 방법의 장점은 28, 30, 31 일 등의 문제를 처리한다는 것입니다. 비즈니스 규칙 및 시나리오 (송장 생성 등)를 처리하는 데 매우 유용합니다.

$ 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 일 수 있다는 표시이며, 일과 연도에도 동일하게 적용됩니다. :)
securecurve

5
@sliders_alpha python-dateutil 패키지를 설치해야합니다 (pip install python-dateutil)
poiuytrez

18
이것이 올바른 해결책입니다. OP가 6 개월 대신 6 년을 요청한 경우 승인 된 답변이 비참하게 실패합니다. 따라서 답변이 더 일반화 될수록 더 가치가 있다는 것을 명심해야합니다.
Daniel F

3
relativedelta함수는 month인수로 도 사용됩니다. 이 인수는 기본적으로 통과 날짜의 월을 / 세트 / 수정하고 월을 추가하는 것과는 매우 다릅니다. 그들은 여분 잊었 때문에 함수가 고장 궁금 사람에 대한 그냥 사전 경고 .
shad0w_wa1k3r

1
궁금합니다. 기본적으로 왜 이것이 포함되어 있지 않은지 아는 사람이 있습니까? Timedelta는 datetime기본적으로 패키지 된 것으로 보입니다 . 실제로 "달"을 timedelta에 전달할 수 있다고 가정했습니다.
dTanMan

51

글쎄, 그것은 현재 날짜로부터 6 개월간 무슨 의미인지에 달려 있습니다.

  1. 자연 개월 사용 :

    (day, month, year) = (day, (month + 5) % 12 + 1, year + (month + 5)/12)
  2. 은행가 정의 사용, 6 * 30 :

    date += datetime.timedelta(6 * 30)

3
반년 정의 (183 일)와 26 주 정의도 함께 던질 수 있습니까? 한 곳에서 모두 사용할 수 있습니다.
S.Lott

11
간단히 말하면 : 6 월에는 수식이 대신 (월 + 5) % 12 + 1 b / c 일 것이라고 생각합니다. 수식은 0을 제공하지만 예상 결과는 12입니다 ...이 작은 오류에도 불구하고 내 마음, 당신의 대답은 질문에 가장 잘 대답하는 것입니다
PierrOz

3
연도 동일 : 연도 + (월 + 5) / 12
여야 함

7
날짜가 31 일 때 6 개월 후 31 일을 가질 수없는 경우 (31 일이있는 대부분의 달의 경우)?
akv

4
첫 번째 솔루션 (day, month, year) = (day, (month+6)%12, year+(month+6)/12)은 버그가있을 수 있기 때문에 다운 보트입니다 (31, 8, 2015).->(31, 2, 2016)
ohw

37

Python 3.x를 사용하면 다음과 같이 할 수 있습니다.

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

그러나 python-dateutil 모듈 을 설치해야 합니다.

pip install python-dateutil

대한 Upvotedpip install ...
나단

추천 from dateutil.relativedelta import relativedelta합니다. 사용 import *은 명시 적이 지 않습니다.
Sam Morgan

19

월 초부터 월까지 계산 :

from datetime import timedelta
from dateutil.relativedelta import relativedelta

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

18
이것은 주석에서 위에서 언급 한 상대 델타 솔루션이 아닙니다. 600 개 이상의 공감대가있는 솔루션을 계속 스크롤하십시오.
Nostalg.io

15

"6 개월"은 무슨 뜻인가요?

2009-02-13 + 6 개월 == 2009-08-13입니까? 아니면 2009-02-13 + 6 * 30 일입니까?

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 에 대한 추가 정보


14

따라서 dateutil.relativedelta지난 1 년 동안 반복하여 매월 한 달씩 현재 날짜로 건너 뛰는 데 유용한 예제가 있습니다.

>>> 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

다른 답변과 마찬가지로 "지금부터 6 개월"이 실제로 무엇을 의미하는지 알아 내야합니다. "미래 6 년 동안 그 달의 오늘의 날"을 의미하는 경우 :

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

14

이 솔루션은 12 월에 올바르게 작동하지만이 페이지의 답변 대부분은 그렇지 않습니다. 계수 (%) 또는 정수 나누기 (//)를 사용하기 전에 먼저 월을 기수 1 (예 : Jan = 1)에서 기수 0 (예 : Jan = 0)으로 이동해야합니다. 그렇지 않으면 11 월 (11)에 1 개월을 더한 값은 12입니다. 나머지 (12 % 12)를 찾을 때 0을 얻습니다.

(그리고 "(month % 12) + 1"또는 Oct + 1 = december를 제안하지 마십시오!)

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)

그러나 ... 1 월 31 일 + 1 개월과 같은 문제는 설명하지 않습니다. 다시 OP로 돌아갑니다. 한 달을 추가하면 무엇을 의미합니까? 한 가지 해결책은 대부분의 사람들이 1 월 마지막 날을 추정하고 1 개월은 2 월 마지막 날과 같다는 점을 감안할 때 유효한 날에 도달 할 때까지 역 추적하는 것입니다. 증명:

>>> 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
"Jan 31 + 1 개월"문제 수정 : days_in_month = calendar.monthrange (newyear, newmonth) [1]; newday = min (d.day, days_in_month); (2월 28/29에 2월 31일 예를 들어, 만약 너무 큰 하루 다운 범프)
커티스 Yallop

이것은 newyear를 정수 데이터 유형 def AddMonths (d, x)로 변환하여 나에게 효과적이었습니다 : newmonth = ((((d.month-1) + x) % 12) + 1 newyear = d.year + int (( (d.month-1) + x) / 12) datetime.date (newyear, newmonth, d.day) 반환
Singh

12

나는 이것이 6 개월이라는 것을 알고 있지만 한 달을 추가하면 답변이 Google에 "python에서 개월 추가"에 대해 표시됩니다.

import calendar

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

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

365/12를 사용하여 1 년의 1/12 광고를 반복하면 날짜가 반복되는 경우 단기 / 장기 문제가 발생할 수 있습니다.


11

파이썬의 날짜 시간으로 직접 할 수있는 방법은 없습니다.

python-dateutil 에서 relativedelta 유형을 확인하십시오 . 시간 델타를 개월 단위로 지정할 수 있습니다.


10

그냥 사용 timetuple의 , 달을 추출하여 개월을 추가하고 새로운 dateobject을 구축하는 방법을. 이미 존재하는 방법이 있다면 모르겠습니다.

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는 약간 어색하지만 예제로 작동합니다. 2008-01-31 + 1 개월과 같은 코너 케이스에서는 분명히 작동하지 않습니다. :)


3
코드 오류 : new_month % 12이어야합니다 (new_month % 12) or 12. 그렇지 않으면 11 월에 시도하면 오류가 발생합니다. :)
Jordan Reiter

이것은 실제로 받아 들여진 솔루션보다 훨씬 깨끗합니다. 이것은 새로운 수입을 요구하지 않고 단지 기본적인 수학
Simon PA

return datetime.date (year + (new_month / / 12), (new_month % 12) 또는 12, day)
월페이퍼

9

Dateutil 패키지 에는 이러한 기능이 구현되어 있습니다. 그러나 다른 사람들이 이미 지적했듯이 이것은 순진 할 것 입니다.


dateutil은 굉장합니다. easy_install과 함께 설치할 수도 있습니다.
Soviut

우수한. 제안 해 주셔서 감사합니다. 그것은 신이 보낸 것 같습니다.
ayaz

9

파이썬 표준 라이브러리를 사용 dateutil하거나 사용하지 않고 '2 월 31 일'문제를 해결합니다.

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

테스트 :

>>>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))

버그가 있습니다. 대상 월이 12 월이면 1 년 후 필요한 날짜를 반환합니다. 예 : add_months(datetime.date(2018, 11, 30), 1)반환 datetime.date(2019, 12, 30)(2019 년이 아니라 2018 년이어야 함). 따라서이를 위해 테스트를 거친 전용 라이브러리를 사용하는 것이 좋습니다! 표준 라이브러리 모듈 만 사용해야 하는 경우 비슷한 질문에 대한 내 대답을 참조하십시오 .
taleinat

5

'2 월 31 일'문제를 해결하는 더 좋은 방법이 있습니다.

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)

나는 그것이 음수와 함께 작동한다고 생각하지만 (개월을 빼기 위해) 이것을 많이 테스트하지는 않았습니다.


1
이 답변에는 내장 Python 라이브러리 만 사용하여 문제를 올바르게 해결하는 장점이 있습니다. 동일하지만 약간 더 간결한 답변은 stackoverflow.com/a/4131114/302264를 확인하십시오.
Eduardo Dobay

3

PyQt4의 QDate 클래스에는 addmonths 함수가 있습니다.

>>>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

이건 어때요? 다른 라이브러리 ( dateutil) 또는 timedelta?를 사용하지 않습니다 vartec 의 답변 을 바탕으로 나는 이것을했고 그것이 효과가 있다고 생각합니다.

import datetime

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

나는을 사용하려고했지만 timedelta일을 세 365/2거나 6*356/12항상 6 개월로 해석하지는 않지만 182 일로 해석하기 때문입니다. 예 :

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

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

필자는 일반적으로 특정 날짜의 6 개월이 같은 달에 6 개월 후에 도착한다고 가정합니다 (예 : 2015-03-10-> 2015-09-10, Not 2015-09-08)

도움이 되셨기를 바랍니다.


1
day + datetime.timedelta(6*365/12)몇 년 동안 365 일이 있고 다른 날에는 366 일이 있기 때문에 항상 작동하지는 않습니다.
3kstc

3

이것은 특정 질문에 대답하지 않지만 ( datetime다른 사람이 다른 모듈의 사용을 제안한 경우) 여기에을 사용하는 솔루션이 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

윤년에 예상대로 작동하는

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

2019-02-28 00:00:00

2

Zope에서 사용하고 유효하지 않은 날 번호를 처리하기 위해 AddMonths ()를 수정했습니다.

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)

이것은 윤년 (29 일 2 월)을 고려하지 않는 것 같습니다.
처리

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

1new_month = 121 경우의 Johannes Wei의 답변을 수정했습니다. 이것은 완벽하게 작동합니다. 월은 양수 또는 음수 일 수 있습니다.

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
시작 날짜의 날짜가 목표 월의 날짜 수보다 큰 경우 "완벽하게 작동"하지 않습니다. 예 : 2001-01-31에 1 개월을 더한 날짜 2001-02-31을 만들려고합니다.
John Machin

1

또 다른 해결책-누군가가 좋아하기를 바랍니다.

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

이 솔루션은 모든 경우에 29,30,31 일 동안 작동하지 않으므로 더 강력한 솔루션이 필요합니다 (더 이상 좋지 않습니다 :)).

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

에서 이 답변 을 참조 ParseDateTime을을 . 코드 예제는 다음과 같습니다. 자세한 내용 : 많은 자연 언어-> YYYY-MM-DD 변환 예제를 사용한 단위 테스트 및 명백한 구문 분석 시간 변환 문제 / 버그 .

#!/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')

위 코드는 MacOSX 시스템에서 다음을 생성합니다.

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

1

다음은 사용자가 하루가 해당 월의 일 수보다 큰 날짜를 반환하는 방법을 결정할 수있는 예입니다.

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 변수가 date라고 가정하면 :

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

x 개월 후 / 이후에 다음 날짜를 얻는 일반적인 기능.

날짜 / 시간 수입 일부터

데프 after_month (given_date, month) :
    yyyy = int (((given_date.year * 12 + given_date.month) + month) / 12)
    mm = int (((given_date.year * 12 + given_date.month) + month) % 12)

    mm == 0 인 경우 :
        yyyy-= 1
        mm = 12
    주어진 given_date.replace (년 = yyyy, 월 = mm)


__name__ == "__main__"인 경우 :
    오늘 = date.today ()
    인쇄 (오늘)

    [-12, -1, 0, 1, 2, 12, 20]에서 mm의 경우 :
        next_date = 이후 월 (오늘, mm)
        인쇄 (다음 날짜)

이것이 가장 좋은 대답입니다. 반올림 문제없이 간단하고 효과적입니다.
jprobichaud

1

빠른 제안은 Arrow입니다

핍 설치 화살표

>>> import arrow

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

0

python datetime 모듈을 사용하여 6 개월의 timedelta를 datetime.today ()에 추가하십시오.

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

물론 Johannes Weiß가 제기 한 문제를 해결 해야 합니다. 6 개월이란 무엇입니까?


1
timedelta는 몇 달을 지원하지 않으므로 "6 개월에 몇 일입니까?"라는 질문에 대한 가능한 답변을 회피합니다. Eef의 코드는 검토 날짜를 설정하므로 일 (6 * 30)을 사용하여 타임 델타를 설정하는 것이 좋습니다. 기간이 고객이 제품 / 서비스에 액세스하는 것을 나타내면 비즈니스 정의가 필요 / 선호 될 수 있습니다.
Carl

0

이것이 내가 생각해 낸 것입니다. 올바른 개월과 년을 이동하지만 일 (내 상황에서 필요한 것)은 무시합니다.

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

나는이 기능을 사용하여 년과 월을 변경하지만 일을 유지합니다.

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

당신은 작성해야합니다 :

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

수동으로 일을 추가하는 대신 이와 같은 작업을 수행하는 것이 더 안전하다고 생각합니다.

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.