KNOWLEDGE BASE
Log In    |    Knowledge Base    |    4D Home
Tech Tip: Extracting hours, minutes, and seconds from a Time value
PRODUCT: 4D | VERSION: 11.5 | PLATFORM: Mac & Win
Published On: January 8, 2010
Your current browser may not allow you to download the asset. We recommend Mozilla Firefox or Google Chrome.
Log In

When the need arises to extract one of the three parts of a time value (hours, minutes, or seconds), native commands do not exist in 4D for the task. Below are three 4D methods; each will retrieve the different parts to a Time value.

If (True)
    If (False)
       `*****************************************************************************
       `//
       `// TIME_HourOf
       `//
       `// Purpose: Return the hour of a time value
       `//
       `// $0 - LONGINT - Hour value
       `// $1 - TIME - Time value
       `//
       `*****************************************************************************

    End if
    C_TEXT($MethodName_T)
    $MethodName_T:=Current method name
    `===================== Declare Variables ==================================
    C_LONGINT($0;$Hr)
    C_TIME($Time;$1)
End if
`====================== Initialize and Setup ================================

$Time:=$1

`======================== Method Actions ==================================

$TiStr:=String($Time;HH MM SS )
$Hr:=Num(Substring($TiStr;1;2))

`======================== Clean up and Exit =================================

$0:=$Hr



If (True)
    If (False)
       `*****************************************************************************
       `//
       `// TIME_MinuteOf
       `//
       `// Purpose: Return the Minute of a time value
       `//
       `// $0 - LONGINT - Minute value
       `// $1 - TIME - Time value
       `//
       `*****************************************************************************

    End if
    C_TEXT($MethodName_T)
    $MethodName_T:=Current method name
    `===================== Declare Variables ==================================
    `method_parameters_declarations
    C_LONGINT($0;$Min)
    C_TIME($Time;$1)
    C_STRING(15;$TiStr)
End if
`====================== Initialize and Setup ================================

$Time:=$1

`======================== Method Actions ==================================

$TiStr:=String($Time;HH MM SS )
$Min:=Num(Substring($TiStr;4;2))

`======================== Clean up and Exit =================================

$0:=$Min



If (True)
    If (False)
       `*****************************************************************************
       `//
       `// TIME_SecondOf
       `//
       `// Purpose: Return the second of a time value
       `//
       `// $0 - LONGINT - Second value
       `// $1 - TIME - Time value
       `//
       `*****************************************************************************

    End if
    C_TEXT($MethodName_T)
    $MethodName_T:=Current method name
    `===================== Declare Variables ==================================
    `method_parameters_declarations

    C_LONGINT($0;$Sec)
    C_TIME($Time;$1)
    C_STRING(15;$TiStr)
End if
`====================== Initialize and Setup ================================

$Time:=$1

`======================== Method Actions ==================================

$TiStr:=String($Time;HH MM SS )
$Sec:=Num(Substring($TiStr;7;2))

`======================== Clean up and Exit =================================

$0:=$Sec

Commented by Tim Nevels on January 10, 2010 at 2:03 PM
These methods suffer from a false assumption that 4D time values are limited to 99 hours. 4D v11 documentation specifies the range of values for time as 00:00:00 to 596,000:00:00. These methods will return incorrect results for time values over 99:59:59.

Here are some modifications to these 3 methods so that they handle all 4D time values and also all 4D language versions.

TIME_HourOf Method Modifications:

Before line 27, add this line: GET SYSTEM FORMAT(Time separator ;$timeSeparator_t)
Change line 28 to this line: $Hr:=Num(Substring($TiStr;1;(Position($timeSeparator_t;$TiStr)-1))) 


TIME_MinuteOf Method Modifications

Before line 29, add this line: GET SYSTEM FORMAT(Time separator ;$timeSeparator_t)
Change line 30 to this line: $Min:=Num(Substring($TiStr;(Position($timeSeparator_t;$TiStr)+1);2))


TIME_SecondOf Method Modifications

Change line 28 to this line: $Sec:=Num(Substring($TiStr;(Length($TiStr)-1);2))


With these modifications the three methods will now return proper results for 4D time values greater than 99:59:59.