Page 1 of 1

Some more Time-Functions

Posted: Wed Feb 27, 2008 10:28 pm
by ukoenig
Some more Time-Functions

Code: Select all


/* FUNCNAME     FT_ELAPMIN()
 *  Return difference, in minutes, between two mil format times.
 *  SYNTAX
 *     FT_ELAPMIN( <cTIME1>, <cTIME2> ) -> nMINUTES
 *  ARGUMENTS
 *     <cTIME1, cTIME2>  character strings of military form "hhmm",
 *         where 0<=hh<24.
 *  RETURNS
 *     <nMINUTES>
 *  DESCRIPTION
 *     Finds the arithmetic difference between time two times 
 *     (time 2 - time 1).
 *     If time 2 is smaller than time 1, a NEGATIVE value is returned.
 *  EXAMPLES
 *     FT_ELAPMIN( "1718", "2040" ) ->  322
 *     FT_ELAPMIN( "2040", "1718" ) -> -322
 */

FUNCTION FT_ELAPMIN(cTIME1,cTIME2)
RETURN ((VAL(LEFT(cTIME2,2))*60) + (VAL(RIGHT(cTIME2,2)))) - ;
         ((VAL(LEFT(cTIME1,2))*60) + (VAL(RIGHT(cTIME1,2))))

// -----------------------------------------------------------

/*  FUNCNAME     FT_ELTIME()
 *     Compute difference between times in hours, minutes, seconds.
 *  SYNTAX
 *     FT_ELTIME( <cTime1>, <cTime2> ) -> cDiff
 *  ARGUMENTS
 *     <cTime1, cTime2>  character strings representing times in
 *        hh:mm:ss format.
 *  RETURNS
 *     <cDiff>  character string representing time difference in
 *        hh:mm:ss format.
 *  DESCRIPTION
 *     Return the abs. difference between two times in hh:mm:ss format
 *     in character hours, minutes and seconds (hh:mm:ss).
 *  EXAMPLES
 *     FT_ELTIME( "22:40:12", "23:55:17" ) -> 01:15:05
 *     FT_ELTIME( "23:55:17", "22:40:12" ) -> 01:15:05
 */

FUNCTION FT_ELTIME(cTIME1,cTIME2)
LOCAL  nTIME1, nTIME2, nDELSECS, nHRS, nMINS, nSECS, nSECS1, nSECS2

nSECS1   := (val(substr(cTIME1,1,2)) * 3600) +;
              (val(substr(cTIME1,4,2)) * 60) + (val(substr(cTIME1,7)))
nSECS2   := (val(substr(cTIME2,1,2)) * 3600) +;
              (val(substr(cTIME2,4,2)) * 60) + (val(substr(cTIME2,7)))
nDELSECS := abs(nSECS2 - nSECS1)
nHRS     := int(nDELSECS / 3600)
nMINS    := int((nDELSECS - nHRS * 3600) / 60)
nSECS    := nDELSECS - (nHRS * 3600) - (nMINS * 60)

RETURN right("00" + ltrim(str(nHRS)),2) + ;
		":" + ;
		right("00" + ltrim(str(nMINS)),2) + ;
		":" + ;
		right("00" + ltrim(str(nSECS)),2)

// --------------------------------------------------------------

/*  FUNCNAME
 *     FT_MIN2DHM()
 *     Convert numeric minutes to days, hours and minutes.
 * SYNTAX
 *     FT_MIN2DHM( <nMinutes> ) -> aDHM_
 * ARGUMENTS
 *     <nMinutes>  the number of minutes.
 *  RETURNS
 *     <aDHM_>
 *        where: 
 *           aDHM_[1] = cDAYS, aDHM_[2] = cHours, aDHM_[3] = cMinutes
 *  DESCRIPTION
 *     Converts numeric minutes into a character array containing
 *     days, hours & minutes.
 *  EXAMPLES
 *     aDHM_ = MIN2DHM(16789) -> aDHM_[1] = 11, aDHM_[2] = 15,     
* aDHM_[3] = 49
 */

FUNCTION FT_MIN2DHM(nMINS)
LOCAL aDHM_[3]

aDHM_[1] = ltrim((str(int(nMINS/1440))))
aDHM_[2] = ltrim(str(int((nMINS%1440)/60)))
aDHM_[3] = ltrim(str(int((nMINS%1440)%60)))

RETURN aDHM_

// ---------------------------------------------------

/* FUNCNAME    FT_MIL2CIV()
 *     Convert time in military format to civilian format.
 *  SYNTAX
 *     FT_MIL2CIV( <cCIVTIME> ) -> dMILTIME
 *  ARGUMENTS
 *     <cMILTIME>  character string of form hhmm, where 0<=hh<24.
 *  RETURNS
 *     <cCIVTIME>  character string of form hh:mm (am,pm,n or m), 
 *        where 0<hh<12.
 *  DESCRIPTION
 *     Converts time from military to civilian format
 *  EXAMPLES
 *     FT_MIL2CIV( "1640" ) ->  4:40 pm
 *
 *     FT_MIL2CIV( "0440" ) ->  4:40 am
 *
 *     FT_MIL2CIV( "1200" ) -> 12:00 n
 *
 *     FT_MIL2CIV( "0000" ) and FT_MIL2CIV( "2400" ) -> 12:00 m
 *
 *     Caution:  leading blanks are irrelevant.
 */

FUNCTION FT_MIL2CIV(cMILTIME)
LOCAL cHRS,cMINS,nHRS,cCIVTIME

nHRS  := val(LEFT(cMILTIME,2))
cMINS := right(cMILTIME,2)

DO CASE
   CASE (nHRS == 24 .OR. nHRS == 0) .AND. (cMINS == "00")  // Midnight
      cCIVTIME = "12:00 m"
  CASE (nHRS == 12)                                       // Noon to 12:59pm
   IF cMINS == "00"
     cCIVTIME = "12:00 n"
  ELSE
     cCIVTIME = "12:" + cMINS + " pm"
  ENDIF
CASE (nHRS < 12)                                        // AM
   IF nHRS == 0
       cHRS = "12"
   ELSE
       cHRS = right("  " + ltrim(str(int(nHRS))),2)
   ENDIF
   cCIVTIME = cHRS + ":" + cMINS + " am"
OTHERWISE                                             // PM
   cCIVTIME = right("  " + ltrim(str(int(nHRS - 12))), 2) + ;
	":" + cMINS + " pm"
ENDCASE

RETURN cCIVTIME

// ------------------------------------

/*  FUNCNAME     FT_CIV2MIL()
 *     Convert usual civilian format time to military time.
 *  SYNTAX
 *     FT_CIV2MIL( <cCIVTIME> ) -> cMILTIME
 *  ARGUMENTS
 *     <cCIVTIME>  character string of form hh:mm (am,pm,n or m), 
 *        where 0<hh<12.
 *  RETURNS
 *     <cMILTIME>  character string of form hhmm, where 0<=hh<24.
 *  DESCRIPTION
 *     Converts time from 12-hour civilian format to military.
 *  EXAMPLES
 *     FT_CIV2MIL( " 5:40 pm" ) -> 1740
 *
 *     FT_CIV2MIL( " 5:40 am" ) -> 0540
 *
 *     FT_CIV2MIL( "12:00 n" ) -> 1200
 *
 *     FT_CIV2MIL( "12:00 m" ) -> 0000
 *     
 *     Caution:  leading blanks are irrelevant; p,a,n,m must be preceded by
 *               one and only one space.
 */

FUNCTION FT_CIV2MIL(cTIME)
LOCAL cKEY, cMILTIME

// Insure leading 0's
cTIME = REPLICATE("0", 3 - at(":", ltrim(cTIME))) + ltrim(cTIME)

// Adjust for popular use of '12' for first hour after noon and midnight
if left(ltrim(cTIME),2) == "12"
   cTIME = stuff(cTIME, 1, 2, "00")
endif

// am, pm, noon or midnight
cKEY = substr(ltrim(cTIME), 7, 1)

DO CASE
   CASE upper(cKEY) == "N"       // noon
       IF left(cTIME,2) + substr(cTIME,4,2) == "0000" 
	cMILTIME = "1200"
       ELSE
	cMILTIME = "    "
       ENDIF
   CASE upper(cKEY) == "M"         // midnight
      IF left(cTIME,2) + substr(cTIME,4,2) == "0000" 
	cMILTIME = "0000"
      ELSE
	cMILTIME = "    "
      ENDIF
   CASE upper(cKEY) == "A"           // am
     cMILTIME = right("00" + ltrim(str(val(left(cTIME,2)))),2) + ;
	 substr(cTIME,4,2)
   CASE upper(cKEY) == "P"           // pm
	cMILTIME = right("00" + ltrim(str(val(left(cTIME,2))+12)),2) + ;
	 substr(cTIME,4,2)
   OTHERWISE
       cMILTIME = "    "                   // error
ENDCASE

RETURN cMILTIME

// --------------------------------------------

/*  FUNCNAME     FT_SYS2MIL()
 *     Convert system time to military time format.
 *  SYNTAX
 *     FT_SYS2MIL() -> cMILTIME
 *  ARGUMENTS
 *     none
 *  RETURNS
 *     <cMILTIME>  character string of form hhmm, where 0<=hh<24.
 *  DESCRIPTION
 *     Return current system time as character string in military format.
 *  EXAMPLES
 *     FT_SYS2MIL() -> 1623
 */

FUNCTION FT_SYS2MIL()
RETURN left(stuff(time(),3,1,""),4)

Regards
Uwe :lol: