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

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.