[Erp5-report] r19146 - /erp5/trunk/products/ERP5Type/DateUtils.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Thu Feb 7 19:10:59 CET 2008
Author: nicolas
Date: Thu Feb 7 19:10:58 2008
New Revision: 19146
URL: http://svn.erp5.org?rev=19146&view=rev
Log:
Improve addToDate function with float handling
Modified:
erp5/trunk/products/ERP5Type/DateUtils.py
Modified: erp5/trunk/products/ERP5Type/DateUtils.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/DateUtils.py?rev=19146&r1=19145&r2=19146&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/DateUtils.py (original)
+++ erp5/trunk/products/ERP5Type/DateUtils.py Thu Feb 7 19:10:58 2008
@@ -40,7 +40,7 @@
'getMonthFraction', 'getYearFraction', 'getAccountableYearFraction',
'getBissextilCompliantYearFraction',
'getDecimalNumberOfYearsBetween','roundMonthToGreaterEntireYear',
- 'roundDate', 'convertDateToHour')
+ 'roundDate', 'convertDateToHour', 'getNumberOfDayInMonth')
millis = DateTime('2000/01/01 12:00:00.001') - DateTime('2000/01/01 12:00:00')
centis = millis * 10
@@ -51,7 +51,7 @@
number_of_days_in_year = 365.
hour = 1/24.
same_movement_interval = hour
-
+
accountable_days_in_month = 30.
accountable_months_in_year = 12.
number_of_hours_in_year = 8760
@@ -65,30 +65,64 @@
if to_add is not None:
kw.update(to_add)
to_add = kw
- for key in ('year', 'month', 'day', 'hour', 'minute', 'second'):
+ key_list = ('second', 'minute', 'hour', 'day', 'month', 'year')
+ reverse_key_list = key_list[::-1]
+ for key in reverse_key_list:
method = getattr(date, key)
return_value[key] = method()
- larger_key_dict = { 'second':'minute', 'minute':'hour',
- 'hour':'day', 'month':'year' }
+ larger_key_dict = { 'second':'minute',
+ 'minute':'hour',
+ 'hour' :'day',
+ 'month' :'year' }
number_of_in_dict = { 'second' : number_of_seconds_in_minute,
'minute' : number_of_minutes_in_hour,
'hour' : number_of_hours_in_day,
+ 'day' : getNumberOfDayInMonth(date),
'month' : number_of_months_in_year }
-
- for key in ('second', 'minute', 'hour', 'month'):
+ lesser_key_dict = {'minute':'second',
+ 'hour' :'minute',
+ 'day' :'hour',
+ 'month' :'day',
+ 'year' :'month'}
+ number_less_of_in_dict = {'minute' : number_of_seconds_in_minute,
+ 'hour' : number_of_minutes_in_hour,
+ 'day' : number_of_hours_in_day,
+ 'month' : getNumberOfDayInMonth(date),
+ 'year' : number_of_months_in_year}
+
+ def treatNegativeValues(return_value, key):
+ while key != 'day' and (key == 'month' and return_value[key] <= 0) or \
+ (key != 'month' and return_value[key] < 0):
+ return_value[key] = return_value[key] + number_of_in_dict[key]
+ return_value[larger_key_dict[key]] = return_value[larger_key_dict[key]] - 1
+
+ def treatPositiveValues(return_value, key):
+ while key != 'day' and (key == 'month' and return_value[key] >\
+ number_of_in_dict[key]) or (key != 'month' and return_value[key] >= \
+ number_of_in_dict[key]):
+ return_value[key] = return_value[key] - number_of_in_dict[key]
+ return_value[larger_key_dict[key]] = return_value[larger_key_dict[key]] + 1
+
+ for key in key_list:
if to_add.get(key, None) is not None:
return_value[key] = return_value[key] + to_add[key]
- while (key == 'month' and return_value[key] <= 0) or \
- (key != 'month' and return_value[key] < 0):
- return_value[key] = return_value[key] + number_of_in_dict[key]
- return_value[ larger_key_dict[key] ] = return_value[ larger_key_dict[key] ] - 1
- while (key == 'month' and return_value[key] > number_of_in_dict[key]) or \
- (key != 'month' and return_value[key] >= number_of_in_dict[key]):
- return_value[key] = return_value[key] - number_of_in_dict[key]
- return_value[ larger_key_dict[key] ] = return_value[ larger_key_dict[key] ] + 1
-
+ del to_add[key]
+ if key not in ('day', 'year'):
+ treatNegativeValues(return_value, key)
+ treatPositiveValues(return_value, key)
+ for key in reverse_key_list[:-1]:
+ if 1 > return_value[key] % 1 > 0:
+ return_value[lesser_key_dict[key]] += return_value[key] % 1 * number_less_of_in_dict[key]
+ return_value[key] = int(return_value[key])
+ for local_key in return_value.keys():
+ if local_key not in ('day', 'year'):
+ treatPositiveValues(return_value, local_key)
+ if key in ('day', 'year') and to_add.get(key, None) is not None:
+ del to_add[key]
+
if to_add.get('year', None) is not None:
return_value['year'] = return_value['year'] + to_add['year']
+
day_to_add = return_value['day'] - 1
if to_add.get('day', None) is not None:
day_to_add += to_add['day']
@@ -100,9 +134,10 @@
return_value['minute'],
return_value['second'],
date.timezone()))
+
return_date += day_to_add
return return_date
-
+
def getClosestDate(date=None, target_date=None,
precision='month', before=1, strict=1):
"""
@@ -396,3 +431,17 @@
date._millis = millis
return date
+def getNumberOfDayInMonth(date):
+ month = date.month()
+ if month < 10 and month != 2:
+ if month % 2 == 0:
+ return 30
+ return 31
+ elif month >=10 and month != 2:
+ if month % 2 == 0:
+ return 31
+ return 30
+ else:
+ if date.isLeapYear():
+ return 29
+ return 28
More information about the Erp5-report
mailing list