날짜 시간을 하루 씩 늘리는 방법은 무엇입니까?


152

날짜 시간의 날짜를 늘리는 방법은 무엇입니까?

for i in range(1, 35)
    date = datetime.datetime(2003, 8, i)
    print(date)

그러나 몇 개월과 몇 년을 올바르게 통과해야합니까? 어떤 아이디어?

답변:




12

다음은 dateutil의 relativedelta를 사용하여 날짜를 추가하는 또 다른 방법입니다.

from datetime import datetime
from dateutil.relativedelta import relativedelta

print 'Today: ',datetime.now().strftime('%d/%m/%Y %H:%M:%S') 
date_after_month = datetime.now()+ relativedelta(day=1)
print 'After a Days:', date_after_month.strftime('%d/%m/%Y %H:%M:%S')

산출:

오늘 : 25/06/2015 20:41:44

하루 후 : 01/06/2015 20:41:44


1
timedelta()stdlib 대신 왜 사용 하시겠습니까?
jfs 2016 년

2
@JFSebastian 하루를 추가 할 수있는 가능한 다른 방법을 공유하십시오.
Atul Arvind

1
이점이 없다면 가치가 있다고 생각하지 않습니다.
Tejas Manohar

10

표준 시간대가 UTC를 기준으로 오프셋을 변경한다고 생각하지 않기 때문에 모든 현재 답변이 일부 경우에 잘못되었습니다. 따라서 어떤 경우에는 24 시간을 추가하는 것이 달력 날짜를 추가하는 것과 다릅니다.

제안 된 해결책

다음 솔루션은 Samoa에서 작동하며 현지 시간을 일정하게 유지합니다.

def add_day(today):
    """
    Add a day to the current day.

    This takes care of historic offset changes and DST.

    Parameters
    ----------
    today : timezone-aware datetime object

    Returns
    -------
    tomorrow : timezone-aware datetime object
    """
    today_utc = today.astimezone(datetime.timezone.utc)
    tz = today.tzinfo
    tomorrow_utc = today_utc + datetime.timedelta(days=1)
    tomorrow_utc_tz = tomorrow_utc.astimezone(tz)
    tomorrow_utc_tz = tomorrow_utc_tz.replace(hour=today.hour,
                                              minute=today.minute,
                                              second=today.second)
    return tomorrow_utc_tz

테스트 된 코드

# core modules
import datetime

# 3rd party modules
import pytz


# add_day methods
def add_day(today):
    """
    Add a day to the current day.

    This takes care of historic offset changes and DST.

    Parameters
    ----------
    today : timezone-aware datetime object

    Returns
    -------
    tomorrow : timezone-aware datetime object
    """
    today_utc = today.astimezone(datetime.timezone.utc)
    tz = today.tzinfo
    tomorrow_utc = today_utc + datetime.timedelta(days=1)
    tomorrow_utc_tz = tomorrow_utc.astimezone(tz)
    tomorrow_utc_tz = tomorrow_utc_tz.replace(hour=today.hour,
                                              minute=today.minute,
                                              second=today.second)
    return tomorrow_utc_tz


def add_day_datetime_timedelta_conversion(today):
    # Correct for Samoa, but dst shift
    today_utc = today.astimezone(datetime.timezone.utc)
    tz = today.tzinfo
    tomorrow_utc = today_utc + datetime.timedelta(days=1)
    tomorrow_utc_tz = tomorrow_utc.astimezone(tz)
    return tomorrow_utc_tz


def add_day_dateutil_relativedelta(today):
    # WRONG!
    from dateutil.relativedelta import relativedelta
    return today + relativedelta(days=1)


def add_day_datetime_timedelta(today):
    # WRONG!
    return today + datetime.timedelta(days=1)


# Test cases
def test_samoa(add_day):
    """
    Test if add_day properly increases the calendar day for Samoa.

    Due to economic considerations, Samoa went from 2011-12-30 10:00-11:00
    to 2011-12-30 10:00+13:00. Hence the country skipped 2011-12-30 in its
    local time.

    See https://stackoverflow.com/q/52084423/562769

    A common wrong result here is 2011-12-30T23:59:00-10:00. This date never
    happened in Samoa.
    """
    tz = pytz.timezone('Pacific/Apia')
    today_utc = datetime.datetime(2011, 12, 30, 9, 59,
                                  tzinfo=datetime.timezone.utc)
    today_tz = today_utc.astimezone(tz)  # 2011-12-29T23:59:00-10:00
    tomorrow = add_day(today_tz)
    return tomorrow.isoformat() == '2011-12-31T23:59:00+14:00'


def test_dst(add_day):
    """Test if add_day properly increases the calendar day if DST happens."""
    tz = pytz.timezone('Europe/Berlin')
    today_utc = datetime.datetime(2018, 3, 25, 0, 59,
                                  tzinfo=datetime.timezone.utc)
    today_tz = today_utc.astimezone(tz)  # 2018-03-25T01:59:00+01:00
    tomorrow = add_day(today_tz)
    return tomorrow.isoformat() == '2018-03-26T01:59:00+02:00'


to_test = [(add_day_dateutil_relativedelta, 'relativedelta'),
           (add_day_datetime_timedelta, 'timedelta'),
           (add_day_datetime_timedelta_conversion, 'timedelta+conversion'),
           (add_day, 'timedelta+conversion+dst')]
print('{:<25}: {:>5} {:>5}'.format('Method', 'Samoa', 'DST'))
for method, name in to_test:
    print('{:<25}: {:>5} {:>5}'
          .format(name,
                  test_samoa(method),
                  test_dst(method)))

시험 결과

Method                   : Samoa   DST
relativedelta            :     0     0
timedelta                :     0     0
timedelta+conversion     :     1     0
timedelta+conversion+dst :     1     1

다른 답변은 완전히 틀린 것이 아니며 UTC 또는 순진한 tzinfo == None날짜 시간으로 작업하는 동안 완벽하게 좋습니다.
Delgan

3

이것은 나를위한 간단한 해결책이었습니다.

from datetime import timedelta, datetime

today = datetime.today().strftime("%Y-%m-%d")
tomorrow = datetime.today() + timedelta(1)


0

코드가 더 깨끗해 지도록 timedelta를 가져올 수도 있습니다.

from datetime import datetime, timedelta
date = datetime.now() + timedelta(seconds=[delta_value])

그런 다음 날짜를 문자열로 변환

date = date.strftime('%Y-%m-%d %H:%M:%S')

파이썬 하나의 라이너는

date = (datetime.now() + timedelta(seconds=[delta_value])).strftime('%Y-%m-%d %H:%M:%S')

-2

라이브러리가없는 짧은 솔루션. :)

d = "8/16/18"
day_value = d[(d.find('/')+1):d.find('/18')]
tomorrow = f"{d[0:d.find('/')]}/{int(day_value)+1}{d[d.find('/18'):len(d)]}".format()
print(tomorrow)
# 8/17/18

" string d "가 실제로 %m/%d/%Y한 달에서 다음 달로 전환하는 데 문제가없는 형태 인지 확인하십시오 .


2
로 설정하면이 값 d8/31/18반환합니다 8/32/18. 에서 연도를 변경하면 18중단됩니다.
andrewsi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.