home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / progmisc / nfsrc21.zip / WORKDAYS.PRG < prev    next >
Text File  |  1992-03-07  |  3KB  |  108 lines

  1. /*
  2.  * File......: WORKDAYS.PRG
  3.  * Author....: John F. Kaster
  4.  * CIS_ID....: 71510,3321
  5.  * Date......: $Date:   07 Mar 1992 22:15:06  $
  6.  * Revision..: $Revision:   1.2  $
  7.  * Log file..: $Logfile:   E:/nanfor/src/workdays.prv  $
  8.  * 
  9.  * The functions contained herein are the original work of John Kaster
  10.  * and are placed in the public domain.
  11.  *
  12.  * Modification history:
  13.  * ---------------------
  14.  *
  15.  * $Log:   E:/nanfor/src/workdays.prv  $
  16.  * 
  17.  *    Rev 1.2   07 Mar 1992 22:15:06   GLENN
  18.  * Mark K. Zechiel discovered a bug where the incorrect number of
  19.  * workdays was reported when <dStart> was a Tuesday through Friday and
  20.  * dStop was a multiple of 7 days away from dStart (i.e., 7, or 14, or
  21.  * 21, etc).  Fixed.
  22.  * 
  23.  *    Rev 1.1   15 Aug 1991 23:05:48   GLENN
  24.  * Forest Belt proofread/edited/cleaned up doc
  25.  * 
  26.  *    Rev 1.0   12 Jun 1991 01:33:10   GLENN
  27.  * Initial revision.
  28.  *
  29.  */
  30.  
  31. /*  $DOC$
  32.  *  $FUNCNAME$
  33.  *     FT_WORKDAYS()
  34.  *  $CATEGORY$
  35.  *     Date/Time
  36.  *  $ONELINER$
  37.  *     Return number of work days between two dates
  38.  *  $SYNTAX$
  39.  *     FT_WORKDAYS( [ <dStart> ], [ <dStop> ] ) -> nDays
  40.  *  $ARGUMENTS$
  41.  *     <dStart> is the beginning value for the date range.
  42.  *
  43.  *     <dStop> is the ending value for the date range.
  44.  *
  45.  *  $RETURNS$
  46.  *     The number of work days (Monday through Friday) between two dates.
  47.  *
  48.  *  $DESCRIPTION$
  49.  *     FT_WORKDAYS() returns a number indicating the number of work days
  50.  *     between two dates.  Work days are considered Monday through Friday.
  51.  *         (The five day work week none of us Clipper programmers have.)
  52.  *
  53.  *  $EXAMPLES$
  54.  *    ? FT_WorkDays( CTOD("5/16/91"), CTOD("5/20/91") ) // 3  (Th - Mo)
  55.  *    ? FT_WorkDays( CTOD("5/18/91"), CTOD("5/19/91") ) // 0  (Sa - Su)
  56.  *    ? FT_WorkDays( CTOD("5/17/91"), CTOD("5/17/91") ) // 1  (Fr - Fr)
  57.  *  $SEEALSO$
  58.  *  $END$
  59. */
  60.  
  61. #ifdef FT_TEST
  62.   function main( cStart, cStop )
  63.      return qout( ft_workdays( ctod( cStart ), ctod( cStop ) ) )
  64. #endif
  65.  
  66.  
  67. FUNCTION FT_WorkDays( dStart, dStop )
  68.   LOCAL nWorkDays := 0, nDays, nAdjust
  69.  
  70.   IF dStart # NIL .AND. dStop # NIL
  71.        IF dStart # dStop
  72.         IF dStart > dStop   // Swap the values
  73.             nAdjust    := dStop
  74.             dStop    := dStart
  75.             dStart    := nAdjust
  76.         ENDIF
  77.  
  78.         IF ( nDays := Dow( dStart ) ) == 1 // Sunday (change to next Monday)
  79.            dStart++
  80.         ELSEIF nDays == 7 // Saturday (change to next Monday)
  81.            dStart += 2
  82.         ENDIF
  83.          
  84.         IF ( nDays := Dow( dStop ) ) == 1 // Sunday (change to prev Friday)
  85.            dStop -= 2
  86.         ELSEIF nDays == 7 // Saturday (change to prev Friday)
  87.            dStop--
  88.         ENDIF
  89.          
  90.         nAdjust := ( nDays := dStop - dStart + 1 ) % 7
  91.          
  92.         IF Dow( dStop ) + 1 < Dow( dStart ) // Weekend adjustment
  93.            nAdjust -= 2
  94.         ENDIF
  95.          
  96.         nWorkDays := Int( nDays / 7 ) * 5 + nAdjust
  97.  
  98.       ELSEIF ( Dow( dStart ) # 1 .AND. Dow( dStart ) # 7 )
  99.  
  100.          nWorkDays := 1
  101.  
  102.       ENDIF
  103.  
  104.    ENDIF
  105.  
  106. RETURN ( IIF(nWorkDays>0,nWorkDays,0) )
  107.  
  108.