| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 
 |  
"""
Class:  BusinessHours(datetime1,datetime2,worktiming=[9 ,18],weekends=[6,7],holidayfile=None)
 
Synopsis: Provides three date functions.
getdays()       - Returns the number of working days betweeen the two datetime object.
gethours()      - Returns the number of working hours between the two datetime objects.
dateinbetween() - Checks whether a given datetime lies between two datetime objects , used by the internal functions.
 
Class Parameters:
datetime1   - The datetime object with the starting date.
datetime2   - The datetime object with the ending date.
worktiming  - The working office hours . A list containing two values start time and end time
weekends    - The days in a week which have to be considered as weekends sent as a list, 1 for monday ...  7 for sunday.
holidayfile - A file consisting of the predetermined office holidays.Each date starts in a new line and currently must only be in the format dd-mm-yyyy
 
Example:
from BusinessHours import BusinessHours
from datetime import   datetime
 
testing = BusinessHours(datetime(2007,10,15),datetime.now())
print testing.getdays()
print testing.gethours()
 
 
"""
class BusinessHours:
 
    def __init__(self,datetime1,datetime2,worktiming=[9 ,18],weekends=[6,7],holidayfile=None):
        self.holidayfile = holidayfile
        self.weekends = weekends
        self.worktiming = worktiming
        self.datetime1 = datetime1
        self.datetime2 = datetime2
 
    def getdays(self):
        days = (self.datetime2-self.datetime1).days
        #exclude any day in the week marked as holiday (ex: saturday , sunday)
        noofweeks = days / 7
        extradays = days % 7
        startday = self.datetime1.isoweekday();
        days = days - (noofweeks * self.weekends.__len__())
        # this is for the extra days that dont make up 7 days , to remove holidays from them
        for weekend in self.weekends:
            if(startday==weekend):
                days = days - 1;
            else:
                if(weekend >= startday):
                    if(startday+extradays >= weekend):
                        days = days - 1 ;
                else:
                    if(7-startday+extraday>=weekend):
                        days = days - 1 ;
        # Read company holiday's from the file
        if(self.holidayfile is not None):
            f=open(self.holidayfile);
            fdata = f.read();
            definedholidays=fdata.split();
            f.close();
        #exclude any holidays that have been marked in the companies academic year
            for definedholiday in definedholidays:
                flag=0;
                day , month , year = definedholiday.split('-')
                holidate = date(int(year) , int(month) , int(day))
                for weekend in self.weekends:
                     #check if mentioned holiday lies in defined weekend , shouldnt deduct twice
                    if(holidate.isoweekday==weekend):
                        flag=1;
                        break;
                if(flag==1):
                    continue;
                if(self.dateinbetween(holidate)):
                    days = days - 1
        return days;
 
    def gethours(self):
        days = self.getdays()
        #calculate hours
        days = days - 2 # (-2)To remove the start day and the last day
        hoursinaday = self.worktiming[1]-self.worktiming[0]
        hours = days * hoursinaday
        # To calculate working hours in the first day.
        if(self.datetime1.hour < self.worktiming[0] ):
            hoursinfirstday = hoursinaday;
        elif(self.datetime1.hour > self.worktiming[1]):
            hoursinfirstday = 0;
        else:
            hoursinfirstday = worktiming[1]-self.datetime1.hour
        # To calculate working hours in the last day
        if(self.datetime2.hour > self.worktiming[1] ):
            hoursinlastday = hoursinaday;
        elif(self.datetime2.hour < self.worktiming[0]):
            hoursinlastday = 0;
        else:
            hoursinlastday = self.datetime2.hour-self.worktiming[0]
        hours = hours + hoursinfirstday + hoursinlastday
        return hours
 
    def dateinbetween(self,holidate):
        if(holidate.year > self.datetime1.year and holidate.year <= self.datetime2.year):
            return True
        if(holidate.year >= self.datetime1.year and holidate.year < self.datetime2.year):
            return True
        if(holidate.year == self.datetime1.year and holidate.year == self.datetime2.year):
            if(holidate.month > self.datetime1.month and holidate.month <= self.datetime2.month):
                return True
            if(holidate.month >= self.datetime1.month and holidate.month < self.datetime2.month):
                return True
            if(holidate.month == self.datetime1.month and holidate.month == self.datetime2.month):
                if(holidate.day >= self.datetime1.day and holidate.day <= self.datetime2.day):
                    return True
        return False; | 
Partager