2016-08-03 7 views
1

ここに私の問題があります。私は彼に家賃を支払わなければならない次の日をユーザーに与える小さなプログラムをしようとしています。ここでPythonで日付を更新

私のコードです:

curdate = datetime.date(2015, 01, 01) 
rent_date = datetime.date(curdate.year, curdate.month+1, 01) 

one_day = datetime.timedelta(days = 1) 
one_week = datetime.timedelta(weeks = 1) 
one_month = datetime.timedelta(weeks = 4) 

def rent_date_calc(cd, rd): 
    if cd.month == 12: 
     rd.replace(cd.year+1, 01, 01) 
    else: 
     rd.replace(cd.year, cd.month+1, 01) 

def time_pass(rd, cd, a, al): 
    if rd < cd: 
     for a in al: 
      a.finances -= a.rent 

move_fwd = raw_input("Would you like to move forward one day(1), one week (2) or one month (3)?") 
if move_fwd == "1": 
    curdate += one_day 
elif move_fwd == "2": 
    curdate += one_week 
else: 
    curdate += one_month 

time_pass(rent_date, curdate, prodcomp, prodcomps) 
rent_date_calc(curdate, rent_date) 
print "Rent date: " + str(rent_date) 

私が持っている問題はrent_dateは常に(2015年2月1日)同じままということです 任意のアイデアなぜですか?

+2

['date.replace'](https://docs.python.org/2/library/datetime.html#datetime.date.replace)は新しい日付を返します。あなたは 'rd.replace'を呼び出していますが、結果をキャプチャしていません。おそらく 'rent_date_calc'から新しい日付を返してそれを印刷する必要があります。 – khelwood

答えて

1

datetimeは不変なオブジェクトなので、あなたのコードは何も変更されていません。また、replaceを呼び出すと、最初のものを変更する代わりに新しいdatetimeが返されます。

あなたは戻っrent_dateにそれを関数から新しいオブジェクトをreturnassign必要があります。

def rent_date_calc(cd, rd): 
    if cd.month == 12: 
     return rd.replace(cd.year+1, 01, 01) 
    else: 
     return rd.replace(cd.year, cd.month+1, 01) 

... 

rent_date = rent_date_calc(curdate, rent_date) 
+1

あなたは不健全です。 @pistacheの説明に感謝します。あなたは[回答を受け入れる]べきです(http://stackoverflow.com/help/accepted-answer)。 –

0

あなたの関数は新しい家賃の日付を返すことがあります。

  • new_rent_date = rent_date_calc(CURDATE、rent_date)
  • ====

    • リターンCD:あなたは自分のコードに次の行を追加する必要があります========================================== ==============

      curdate = datetime.date(2015, 1, 1) 
      rent_date = datetime.date(curdate.year, curdate.month+1, 1) 
      
      one_day = datetime.timedelta(days = 1) 
      one_week = datetime.timedelta(weeks = 1) 
      one_month = datetime.timedelta(weeks = 4) 
      
      
      def rent_date_calc(cd, rd): 
          if cd.month == 12: 
           new_date = rd.replace(cd.year+1, 1, 1) 
          else: 
           new_date = rd.replace(cd.year, cd.month+1, 1) 
          return new_date 
      
      def time_pass(rd, cd, a, al): 
          if rd < cd: 
           for a in al: 
            a.finances -= a.rent 
           # Not sure what this function should return... 
      
      move_fwd = raw_input("Would you like to move forward one day(1), one week (2) or one month (3)?") 
      if move_fwd == "1": 
          curdate += one_day 
      elif move_fwd == "2": 
          curdate += one_week 
      else: 
          curdate += one_month 
      
      # time_pass(rent_date, curdate, prodcomp, prodcomps) 
      new_rent_date = rent_date_calc(curdate, rent_date) 
      print "Rent date: " + str(new_rent_date) 
      
    +0

    'cd'と' rd'は関数内で変更されていません –

    +0

    本当にありがとう@OhadEytan。 – datahero

    関連する問題