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

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

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



답변

이 솔루션이 좋은 것으로 나타났습니다. (이것은 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)


답변

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

  1. 자연 개월 사용 :

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

    date += datetime.timedelta(6 * 30)

답변

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


답변

월 초부터 월까지 계산 :

from datetime import timedelta
from dateutil.relativedelta import relativedelta

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


답변

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


답변

따라서 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)


답변

이 솔루션은 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)>>>