Get the time and date from a serverTag(s): Powerscript WinAPI/Registry
First we need these local function declarations
[local function declaration]
FUNCTION ULONG GetTimeOfDayInfo &
( REF s_timeofday dest, ULONG source, ULONG size ) &
LIBRARY "KERNEL32.DLL" ALIAS FOR "RtlMoveMemory"
FUNCTION ULONG NetRemoteTOD &
(REF CHAR server[], REF ULONG bufferPtr) LIBRARY "NETAPI32.DLL"
FUNCTION ULONG LocalhostTOD &
(ref long null, REF ULONG bufferPtr) LIBRARY "NETAPI32.DLL" &
ALIAS FOR "NetRemoteTOD"
[s_timeofday structure] elapsedt uLong msecs uLong hours uLong mins uLong secs uLong hunds uLong timezone Long tinterval uLong day uLong month uLong year uLong weekday uLong
[powerscript]
// ------------------------------------------------------------
of_StringToUnicode (String as_string, ref character ac_unicode[])
int li_loop, li_len, li_uni
li_len = Len( as_string )
FOR li_loop = 1 TO li_len
li_uni++
ac_unicode[ li_uni ] = Mid( as_string, li_loop, 1 )
li_uni++
ac_unicode[ li_uni ] = Char( 0 )
NEXT
li_uni++
ac_unicode[ li_uni ] = Char( 0 )
li_uni++
ac_unicode[ li_uni ] = Char( 0 )
// ------------------------------------------------------------
datetime of_relativetimedate(datetime adt_start, long al_offset)
// stolen from the PFC!
datetime ldt_null
date ld_sdate
time lt_stime
long ll_date_adjust
long ll_time_adjust, ll_time_test
//Initialize date and time portion
ld_sdate = date(adt_start)
lt_stime = time(adt_start)
//Find out how many days are contained
//Note: 86400 is # of seconds in a day
ll_date_adjust = al_offset / 86400
ll_time_adjust = mod(al_offset, 86400)
//Adjust date portion
ld_sdate = RelativeDate(ld_sdate, ll_date_adjust)
//Adjust time portion
// Allow for time adjustments periods crossing over days
// Check for time rolling forwards a day
IF ll_time_adjust > 0 THEN
ll_time_test = SecondsAfter(lt_stime,time('23:59:59'))
IF ll_time_test < ll_time_adjust THEN
ld_sdate = RelativeDate(ld_sdate,1)
ll_time_adjust = ll_time_adjust - ll_time_test -1
lt_stime = time('00:00:00')
END IF
lt_stime = RelativeTime(lt_stime, ll_time_adjust)
//Check for time rolling backwards a day
ELSEIF ll_time_adjust < 0 THEN
ll_time_test = SecondsAfter(lt_stime,time('00:00:00'))
IF ll_time_test > ll_time_adjust THEN
ld_sdate = RelativeDate(ld_sdate,-1)
ll_time_adjust = ll_time_adjust - ll_time_test +1
lt_stime = time('23:59:59')
END IF
lt_stime = RelativeTime(lt_stime, ll_time_adjust)
END IF
RETURN (datetime(ld_sdate,lt_stime))
[powerscript]
char lc_logonserver[]
string ls_logonserver
boolean lb_logonserver
ulong ul_prtTimeOfDayInfo
ulong ul_rc
long ll_null
s_timeofday lstr_timedate
ContextKeyword lcxk_base
String ls_result
string ls_values[]
datetime ldt_locale
date ld_server
time lt_server
datetime ldt_server
// get the logon server
this.GetContextService("Keyword", lcxk_base)
lcxk_base.GetContextKeywords("LOGONSERVER", ls_values)
IF Upperbound(ls_values) > 0 THEN
ls_logonserver = ls_values[1]
// transform logon server to unicode
of_StringToUnicode(ls_logonserver, lc_logonserver)
lb_logonserver = true
ELSE
// lc_logonserver is null --> no server -> localhost
lb_logonserver = false
END IF
// get the current time of day
IF lb_logonserver THEN
ul_rc = NetRemoteTOD(lc_logonserver, ul_prtTimeOfDayInfo)
ELSE
ll_null = 0
ul_rc = LocalhostTOD(ll_null, ul_prtTimeOfDayInfo)
END IF
//
IF NOT ul_rc = 0 THEN
MessageBox("Oups", String (ul_rc))
ELSE
// convert to our structure
GetTimeOfDayInfo(lstr_timedate, ul_prtTimeOfDayInfo, 48)
ls_result = string(lstr_timedate.year) + "-" &
+ string(lstr_timedate.month) &
+ "-" + string(lstr_timedate.day) &
+ " " + string(lstr_timedate.hours) + ":" &
+ string(lstr_timedate.mins) &
+ ":" + string(lstr_timedate.secs)
MessageBox("result before conversion" , ls_result )
// convert to local time taking into account the timezone
ld_server = Date (string(lstr_timedate.year) + "-" &
+ string(lstr_timedate.month) + &
"-" + string(lstr_timedate.day))
lt_server = Time (string(lstr_timedate.hours) + ":" &
+ string(lstr_timedate.mins) + &
":" + string(lstr_timedate.secs))
ldt_locale = of_relativeDatetime &
(datetime(ld_server, lt_server), &
- (lstr_timedate.timezone * 60))
Messagebox("result after conversion" , &
String(ldt_locale, "yyyy-mm-dd hh:mm"))
END IF
See also this HowTo
mail_outline
Send comment, question or suggestion to howto@rgagnon.com
Send comment, question or suggestion to howto@rgagnon.com