কীভাবে এক দিন বাড়িয়ে দিন?


152

তারিখের দিনটি কীভাবে বাড়ানো যায়?

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

কিন্তু আমার কি মাস এবং বছরগুলি সঠিকভাবে পার হওয়া দরকার? কোন ধারনা?

উত্তর:


246
date = datetime.datetime(2003,8,1,12,4,5)
for i in range(5): 
    date += datetime.timedelta(days=1)
    print(date) 

7
আপনার যদি দিবালোকের সময় সাশ্রয় করার সময় বিবেচনা করতে হয়; এটি আরও জটিল, উদাহরণস্বরূপ, অজগর তারিখ থেকে আমি কীভাবে একটি দিন বিয়োগ করতে পারি?
jfs


12

ডেটুটিলের আপেলডেল্টা ব্যবহার করে তারিখে দিন যুক্ত করার জন্য এখানে আরও একটি পদ্ধতি রয়েছে।

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()স্টাডলিবের পরিবর্তে কেন এটি ব্যবহার করবেন?
jfs

2
@ জেফেসেবাস্টিয়ান দিন যোগ করার জন্য আরও একটি সম্ভাব্য উপায় শেয়ার করতে।
অতুল অরবিন্দ

1
যদি কোনও সুবিধা না থাকে তবে আমি মনে করি না যে এটির মান যুক্ত হয়।
তেজস মনোহর

10

বর্তমান উত্তরগুলির সবগুলিই কিছু ক্ষেত্রে ভুল কারণ তারা বিবেচনা করে না যে টাইম অঞ্চলগুলি ইউটিসির তুলনায় তাদের অফসেট পরিবর্তন করে। সুতরাং কিছু ক্ষেত্রে 24 ঘন্টা যোগ করা একটি ক্যালেন্ডার দিন যুক্ত করার চেয়ে পৃথক।

প্রস্তাবিত সমাধান

নিম্নলিখিত সমাধান সামোয়া জন্য কাজ করে এবং স্থানীয় সময় স্থির রাখে।

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

অন্যের উত্তরগুলি সম্পূর্ণ ভুল নয়, ইউটিসি বা ভোল্ট ( tzinfo == None) তারিখের সময় নিয়ে কাজ করার সময় সেগুলি পুরোপুরি ঠিক আছে ।
দেলগান

3

এটি আমার জন্য একটি সহজ সমাধান ছিল:

from datetime import timedelta, datetime

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

0

আপনি কোডডেল্টা আমদানি করতে পারেন তাই কোড পরিষ্কার হয়।

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

নিশ্চিত হয়ে নিন যে " স্ট্রিং ডি " আসলে এমন আকারে রয়েছে %m/%d/%Yযাতে আপনার এক মাস থেকে পরের মাসে রূপান্তর করতে সমস্যা না হয়।


2
যদি আপনি সেট dকরে থাকেন 8/31/18তবে এই রিটার্ন দেয় 8/32/18। আপনি যদি বছর থেকে পরিবর্তন করেন তবে 18তা কেবল বিরতি।
andrewsi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.