Break On
'Cur Date: ' @DATE ' 00:00:00' ?
'Cur Cval: ' TimeConvert(@DATE + ' 00:00:00') ?
; Get today as cTime, subtract 50 days, convert back to Date string
$FiftyDaysAgo = TimeConvert(TimeConvert(@DATE + ' 00:00:00') - (50 * 86400))
'FDA Cval: ' TimeConvert(@DATE + ' 00:00:00') - (50 * 86400) ?
'FDA Date: ' $FiftyDaysAgo ?
$dFDAvalue = 0.0 ; cast as double
'Using 1601/1/1 epoch' ?
'FDA Cval: ' TimeConvert($FiftyDaysAgo, '1601/01/01') ?
; convert adjusted date back to cTime, using required epoch, then
; multiply by 1000 to get ms instead of seconds
$dFDAvalue = TimeConvert($FiftyDaysAgo, '1601/01/01') * 1000.0
'FDA ms: ' $dFDAvalue ?
;;
;;======================================================================
;;
;;FUNCTION TimeConvert()
;;
;;ACTION Converts time formats between cTime and Kix Time
;;
;;AUTHOR Glenn Barnas
;; Based on Rata Die algorithms of Peter Baum
;;
;;VERSION 2.0 / 2007/01/20 - Eliminated 2Gig bug,
;; Add support of negative cTime values
;; Fixed Epoch bug, allowing any date value
;; Allow numeric or string Epoch value
;; 1.0 / 2006/11/20 - first release
;;
;;SYNTAX TimeConvert(CValue [, Epoch])
;;
;;PARAMETERS CValue - REQUIRED - The time value to be converted. This may
;; be an integer value representing the number of seconds since
;; the Epoch, or a Date Time string in the format YYYY/MM/DD hh:mm:ss
;; Given one type, the function returns the other type.
;;
;; Epoch - OPTIONAL - A date string (YYYY/MM/DD format) or days value that
;; represents the "beginning of time". The default is 1970/1/1 (719163).
;; To accurately specify time from the year 1, use an Epoch value of 0.
;; Negative Epoch values were not tested.
;;
;;REMARKS This function simply changes a between date strings and cTime values
;; and vice-versa. Any time zone conversions should be performed external
;; to this function.
;;
;; Validated by generating sequential date values from 1/1/1883 to 12/31/2105,
;; a range of just over 8.5 Billion seconds.
;;
;; This function does not take into account changes to the calendar which occurred
;; throughout history.
;;
;;RETURNS Time string in Kix format (yyyy/mm/dd hh:mm:ss) if cTime format is provided
;; cTime value (double) if Kix format time string is provided
;;
;;DEPENDENCIES none
;;
;;TESTED WITH Kix 4.50, W2K, WXP, W2K3
;;
;;EXAMPLES
;; ; What time will it be in 15 minutes?
;; TimeConvert(TimeConvert(@DATE + ' ' + @TIME) + 900)
;; ; Specialized use of EPOCH value
;; ; How many seconds before 2007 US taxes are due? (or overdue??)
;; TimeConvert(@DATE + ' ' + @TIME, '2007/04/15') ?
;
Function TimeConvert($_CValue, OPTIONAL $_Epoch)
Dim $_ ; generic counter / increment
Dim $_Return ; value calculated by the engine to return to the calling routine
Dim $_Date, $_Time ; values used by the Date to cTime routine
Dim $_A, $_B, $_C, $_D, $_E ; intermediate variables used in the calendar calculation
; Validate/Define the Epoch value
If VarType($_Epoch) > 1
If VarType($_Epoch) = 8 ; yyyy/mm/dd format
$_Epoch = Split($_Epoch, '/')
If UBound($_Epoch) <> 2 Exit 87 EndIf ; Bad Epoch date format!
For $_ = 0 to 2
$_Epoch[$_] = Val($_Epoch[$_]) ; insure values are numeric
Next
; Adjust for Feb
If $_Epoch[1] < 3
$_Epoch[1] = $_Epoch[1] + 12
$_Epoch[0] = $_Epoch[0] - 1
EndIf
; Calculate days since Year 0, accounting for leap years
$_Epoch = CDbl($_Epoch[2]) + (153 * $_Epoch[1] - 457) / 5 + 365 * $_Epoch[0] + $_Epoch[0] / 4 - $_Epoch[0] / 100 + $_Epoch[0] / 400 - 306
EndIf
Else
$_Epoch = 719163 ; default to 1970/1/1
EndIf
; perform the time conversion
If $_CValue + 0 = $_CValue ; convert cTime to Date/Time
$_ = $_CValue
Dim $_CValue[5] ; Prepare CValue array to hold date/time components
$_CValue[5] = $_
$_CValue[2] = Int($_CValue[5] / 86400) ; Days for DATE part
$_CValue[5] = $_CValue[5] - (86400.0 * $_CValue[2]) ; Remaining seconds for TIME part
If $_CValue[5] < 0
$_CValue[2] =$_CValue[2] - 1 ; Adjust for negative cTime values
EndIf
$_CValue[2] = $_CValue[2] + $_Epoch
$_E = $_CValue[2] + 306 ; Process m/d/y values, accounting for calendar changes
$_D = 100 * $_E - 25 ; and leap years
$_A = $_D / 3652425
$_B = $_A - $_A / 4
$_CValue[0] = (100 * $_B + $_D) / 36525
$_C = $_B + $_E - 365 * $_CValue[0] - $_CValue[0] / 4
$_CValue[1] = (5 * $_C + 456) / 153
$_CValue[2] = $_C - (153 * $_CValue[1] - 457) / 5
If $_CValue[1] > 12 ; More than 12 months?
$_CValue[0] = $_CValue[0] + 1 ; Add a year
$_CValue[1] = $_CValue[1] - 12 ; subtract 12 months
EndIf
$_CValue[3] = Int($_CValue[5] / 3600)
$_CValue[4] = Int(($_CValue[5] - $_CValue[3] * 3600) / 60)
$_CValue[5] = $_CValue[5] - Int($_CValue[3] * 3600) - $_CValue[4] * 60
; deal with negative cTime values
If $_CValue[5] < 0
$_CValue[5] = 60 + $_CValue[5]
$_CValue[4] = $_CValue[4] - 1
EndIf
If $_CValue[4] < 0
$_CValue[4] = 60 + $_CValue[4]
$_CValue[3] = $_CValue[3] - 1
EndIf
If $_CValue[3] < 0
$_CValue[3] = 24 + $_CValue[3]
EndIf
; format the return string
$_Return ='' + $_CValue[0] + '/' + right('00'+ $_CValue[1], 2) + '/' + right('00' + $_CValue[2], 2)
$_Return = $_Return + ' ' + right('00' + $_CValue[3], 2) + ':' + right('00' + $_CValue[4], 2) + ':' + right('00'+$_CValue[5] , 2)
Else ; Convert Date/Time to cTime
; convert to array & verify correct # of fields
$_CValue = Split(Join(Split(Join(Split($_CValue + ':0', '/'), ' '), ':'), ' '), ' ', 6)
If UBound($_CValue) <> 5 Exit 87 EndIf ; Bad date/time format!
; convert to numeric values
For $_ = 0 to 5 $_CValue[$_] = Val($_CValue[$_]) Next
If $_CValue[1] < 3
$_CValue[1] = $_CValue[1] + 12
$_CValue[0] = $_CValue[0] - 1
EndIf
$_Date = CDbl($_CValue[2]) + (153 * $_CValue[1] - 457) / 5 + 365 * $_CValue[0] + $_CValue[0] / 4 - $_CValue[0] / 100 + $_CValue[0] / 400 - 306
$_Time = (Val(CDbl($_CValue[3])) * 3600) + (Val($_CValue[4]) * 60) + Val($_CValue[5])
$_Return = (($_Date - $_Epoch) * 86400 + $_Time)
EndIf
; Return the value
$TimeConvert = $_Return
Exit 0
EndFunction