Guys,

I'm using Glenn's TimeDiff() function to calculate the difference between a timestamp and today’s timestamp like shown below.
The function comments say:
 Quote:

When a format value is specified, it returns the fractional part (ie 0.5 days for 12 hours).


so if I do something like below I would expect it to return a fractional value because it is more than 1 year ago but less than two years ago. All I get is the full years and no decimal characters. Me and my colleague have been staring at this for some time and cannot see anything wrong. Am I doing something wrong or is the UDF not ok?

 Code:
Break on

$date = "2008/05/02 10:20:12"

TimeDiff($date, "now", "y")

Sleep 5


;FUNCTION       TimeDiff() 
; 
;AUTHOR         Glenn Barnas 
; 
;VERSION        2.2 / 2007/10/14 
;		 Modified to increase accuracy, permit fracional second calculations 
;		 2.1 / 2007/03/17 
;               added "now" and "today" options for both start and end times 
;               2.0 / 2006/11/20 
;               Changes for code efficiency; added defaults for midnight  
; 
;ACTION         Calculates the time difference between two given date/time strings 
; 
;SYNTAX         TimeDiff(Start [, End] [, Format] [, MSec]) 
; 
;PARAMETERS     Start  - REQUIRED, String value representing the start timestamp 
;                 Format yyyy/mm/dd hh:mm:ss 
; 
;               End    - OPTIONAL, Defaults to "now" 
;		   String value representing the ending time 
;                 Format yyyy/mm/dd hh:mm:ss 
;		   Can be the special value "now" for the current date/time, or "today" 
;                 for midnight of the current day. 
; 
;                 When the time value is not specified, it defaults to 00:00:00.000 (midnight) 
; 
;		 Format - OPTIONAL, one of: 
;		  "m" - return minutes 
;		  "h" - return hours 
;		  "d" - return days 
;		  "y" - return years 
;		 When a format value is specified, it returns the fractional part (ie 0.5 days for 12 hours). 
; 
;		 MSec	- OPTIONAL, True if the fractional seconds should be returned. Default 
;		  is false, returning whole seconds, to maintain compatibility with earlier versions. 
;		  MSec only affects the return of fractional seconds, not fractional parts of other time formats. 
; 
;REMARKS        Returns a value representing the difference in time between two date/time 
;		 strings. Assumes that "Start" is in the past, but will properly return a 
;		 negative value if it is in the future. 
; 
;RETURNS        Double - difference between Start and End timestamps in seconds 
; 
;DEPENDENCIES   None 
; 
;TESTED WITH    Kix 4.2+, NT4, W2K, WXP, W2K3 
; 
;EXAMPLES       If TimeDiff(GetFileTime('SomeFile.txt'),  'now', 'h') > 48 
;		   "File is more than 2 days old!" ? 
;		 EndIf 
; 
Function TimeDiff($_Start, OPTIONAL $_End, OPTIONAL $_Fmt, OPTIONAL $_MSec)
	 
	Dim $_, $_SDate, $a_Start, $_EDate, $a_End, $_Duration
	 
	; Check for special START parameters 
	Select
		Case $_Start = 'now'
			$_Start = @DATE + ' ' + @TIME + '.' + @MSECS
		Case $_START = 'today'
			$_Start = @DATE + ' 00:00:00.000'
	EndSelect
	 
	; Check for special END parameters 
	Select
		Case $_End = 'now' Or $_End = '' 
			$_End = @DATE + ' ' + @TIME + '.' + @MSECS
		Case $_End = 'today'
			$_End = @DATE + ' 00:00:00.000'
	EndSelect
	 
	; Validate parameters 
	; Parameters passed are "yyyy/mm/dd hh:mm:ss[.sss]" - make sure the default time is added 
	$a_Start = Split(Join(Split(Join(Split($_Start + ' 00:00:00.000', '/'), ' '), ':'), ' '), ' ', 6)
	If UBound($a_Start) <> 5 Exit 87 EndIf 	; bad start time parameter 
	For $_ = 0 to 5
		$a_Start[$_] = CDbl($a_Start[$_]) 	; convert to numeric values 
	Next
	 
	$a_End = Split(Join(Split(Join(Split($_End + ' 00:00:00.000', '/'), ' '), ':'), ' '), ' ', 6)
	If UBound($a_End) <> 5 Exit 87 EndIf 	; bad start time parameter 
	For $_ = 0 to 5
		$a_End[$_] = CDbl($a_End[$_]) 	; convert to numeric values 
	Next
	 
	; Convert dates to Days, then convert to seconds and add the time value 
	If $a_Start[1] < 3
		$a_Start[1] = $a_Start[1] +12
		$a_Start[0] = $a_Start[0] -1
	EndIf
	$_SDate = $a_Start[2] + (153 * $a_Start[1] -457) /5 + 365 * $a_Start[0] + $a_Start[0] /4 - $a_Start[0] /100 + $a_Start[0] /400 - 306
	$_SDate = CDbl($_SDate) * 86400.0
	$_SDate = $_SDate + $a_Start[3] * 3600 + $a_Start[4] * 60 + $a_Start[5]
	 
	If $a_End[1] < 3
		$a_End[1] = $a_End[1] +12
		$a_End[0] = $a_End[0] -1
	EndIf
	$_EDate = $a_End[2] + (153 * $a_End[1] -457) /5 + 365 * $a_End[0] + $a_End[0] /4 - $a_End[0] /100 + $a_End[0] /400 - 306
	$_EDate = CDbl($_EDate) * 86400.0
	$_EDate = $_EDate + $a_End[3] * 3600 + $a_End[4] * 60 + $a_End[5]
	 
	; Get the duration between the timestamps 
	$_Duration = CDbl($_EDate - $_SDate)
	 
	; Trim fractional seconds if the MSec flag wasn't set 
	; Value returned is whole seconds 
	If Not $_MSec
		$_Duration = CInt($_Duration)
	EndIf
	 
	; Return data as a Double - seconds (default), hours, minutes, days, or years 
	Select
		Case $_Fmt = 'm' ; minutes 
			$TimeDiff = $_Duration /60.0
		Case $_Fmt = 'h' ; hours 
			$TimeDiff = $_Duration /3600.0
		Case $_Fmt = 'd' ; days 
			$TimeDiff = $_Duration /86400.0
		Case $_Fmt = 'y' ; years 
			$TimeDiff = $_Duration /31536000.0
		Case 1
			$TimeDiff = $_Duration
	EndSelect
	 
	Exit 0
	 
EndFunction


Edited by Mart (2010-01-07 08:53 AM)
Edit Reason: D#mn those typos.
_________________________
Mart

- Chuck Norris once sold ebay to ebay on ebay.