2015-12-16 65 views
4

我有三個字段start_date,end_datetotal_days計算python openerp中兩個日期的總天數

如果我輸入start_dateend_date字段,它應該自動顯示total_days

這是我的功能不工作。

<field name="start_date" on_change="get_number_of_days(start_date,end_date)"/> 
<field name="end_date" on_change="get_number_of_days(end_date,start_date)"/> 
<field name="total_days" /> 

def get_number_of_days(self, cr, uid, ids, start_date, end_date): 
     """Returns a float equals to the timedelta between two dates given as string.""" 
     result = self.browse(cr, uid, ids) 
     if (end_date and start_date) and (start_date <= end_date): 
      DATETIME_FORMAT = "%d/%m/%Y %H:%M:%S" 
      from_dt = datetime.datetime.strptime(start_date, DATETIME_FORMAT) 
      to_dt = datetime.datetime.strptime(end_date, DATETIME_FORMAT) 
      timedelta = to_dt - from_dt 
      diff_day = timedelta.days + float(timedelta.seconds)/86400 
      result['value']['total_days'] = round(math.floor(diff_day))+1 
     return result 

有沒有其他方法?或可能是什麼問題

+0

請提供一個什麼樣的錯誤的信息,這將簡化錯誤查找 –

+1

它沒有給予任何錯誤。只是它沒有計算就節省了。我無法追蹤它出錯的地方 –

+1

聽起來好像你的條件從不計算爲「真」,結果總是與「self.browse(...)」提供的相同。 – jbndlr

回答

2

的部分:

 diff_day = timedelta.days + float(timedelta.seconds)/86400 
     result['value']['total_days'] = round(math.floor(diff_day))+1 

在很大程度上是不必要的,因爲datetime.timedelta已經作爲一種價值timedelta.days的整個天數 - 我懷疑你的問題是,你是不是轉換成字符串嘗試:

  result['value']['total_days'] = str(timedelta.days) 

你也應該考慮抓住問題時strptime功能無法轉換電流值,例如當它是空白的。

2

如果你的日期(如您的文檔字符串表示)給出的字符串,你的條件的第二部分可能會意外行爲(根據上的日期/時間格式化),因爲你進行逐一比較:

if (end_date and start_date) and (start_date <= end_date): 
    # ... 

您應該將它們轉換爲datetime-objects 第一個然後檢查您的條件。

0

謝謝你,

我寫了這個新功能,有助於給總天數:

def _get_days(self, cr, uid, ids, field_name, arg ,context=None): 
     res = {} 
     fmt = '%Y-%m-%d' 
     for object in self.browse(cr, uid, ids, context=context): 
      res[object.id] = {'total_days':0, } 
      from_date = object.start_date 
      to_date = object.end_date 
      d1 = datetime.strptime(from_date, fmt) 
      d2 = datetime.strptime(to_date, fmt) 
      daysDiff = str((d2-d1).days+1) 
      res[object.id]['total_days'] = daysDiff 
      return res 

'start_date': fields.date('Start Date', required=True), 
     'end_date': fields.date('End Date', required=True), 
     'total_days': fields.function(_get_days, string="Diff days", multi='sums', store=True), 
相關問題