>>>***************************************************************************************** >>>**** Internet syncronization time base on article >>>**** founded at http://www.programmersheaven.com/articles/userarticles/atomicsync.htm >>>***************************************************************************************** >>> >>> >>>#define INTERNET_OPEN_TYPE_PRECONFIG 0x00 && use registry >>>#define INTERNET_FLAG_RELOAD 0x80000000 && retrieve the original item >>>#define BEGIN_UTC_TIME 0x69 >>>#define LEN_UTC_TIME 0x11 >>>#define TIME_ZONE_ID_UNKNOWN 0x00 >>>#define TIME_ZONE_ID_STANDARD 0x01 >>>#define TIME_ZONE_ID_DAYLIGHT 0x02 >>> >>>#DEFINE ID_INVALID -1 >>>#DEFINE ID_UNKNOWN 0 >>>#DEFINE ID_STANDARD 1 >>>#DEFINE ID_DAYLIGHT 2 >>> >>> >>>**** DLL Declarations >>>DECLARE INTEGER InternetOpen IN wininet STRING lpszAgent, INTEGER dwAccessType, STRING lpszProxy, STRING lpszProxyBypass, INTEGER dwFlags >>>DECLARE INTEGER InternetCloseHandle IN wininet INTEGER hInternet >>>DECLARE INTEGER InternetOpenUrl IN wininet INTEGER hInternet, STRING lpszUrl, STRING lpszHeaders, INTEGER dwHeadersLength, INTEGER dwFlags, INTEGER dwContext >>>DECLARE INTEGER InternetReadFile IN wininet INTEGER hFile, STRING @lpBuffer, INTEGER dwNumberOfBytesToRead, INTEGER @lpdwNumberOfBytesRead >>>DECLARE LONG SetLocalTime IN win32api STRING @ >>>DECLARE INTEGER GetLocalTime IN win32api STRING @ >>> >>>LOCAL m.hInternet, m.Context, m.hHttp, m.buff, m.NumberOfBytesRead, m.bRet >>>LOCAL m.utcTimeBuff, m.mntbuff, m.nYear, m.nMonth, m.nDay, m.nHour, m.nMin, m.nSec >>> >>>m.hInternet = InternetOpen("BSAtomicEdu", INTERNET_OPEN_TYPE_PRECONFIG , NULL, NULL, 0) >>> >>>if m.hInternet == 0 >>> MessageBox("Internet open error! Test your system and try again.") >>> return >>>ENDIF >>> >>>m.Context = 777 >>>m.hHttp = InternetOpenUrl(m.hInternet, [http://tycho.usno.navy.mil/cgi-bin/timer.pl], NULL, -1, INTERNET_FLAG_RELOAD, Context) >>>IF hHttp == 0 >>> MessageBox("URL open error!") >>> InternetCloseHandle(m.hInternet) >>> return >>>ENDIF >>>m.buff = SPACE(1024) >>>m.NumberOfBytesRead = 0 >>>m.bRet = InternetReadFile(m.hHttp, @m.buff, 1024, @m.NumberOfBytesRead) >>>InternetCloseHandle(m.hHttp) >>>InternetCloseHandle(m.hInternet) >>> >>>IF m.bRet == 0 >>> MessageBox( "URL reading error! Test internet connection and try again.") >>> RETURN >>>ENDIF >>>MessageBox(m.buff) >>> >>>m.utcTimeBuff = SUBSTR(buff,BEGIN_UTC_TIME,LEN_UTC_TIME) >>>m.mntbuff ="JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC" >>> >>>nYear = YEAR(DATE()) && :o)))) >>>nMonth = INT(AT(UPPER(left(utcTimeBuff,3)),mntbuff)/3)+1 >>>nDay = VAL(SUBSTR(utcTimeBuff,6,2)) >>>nHour = VAL(SUBSTR(utcTimeBuff,10,2)) >>>nMin = VAL(SUBSTR(utcTimeBuff,13,2)) >>>nSec = VAL(SUBSTR(utcTimeBuff,16,2)) >>> >>>VFPSetDateTime(m.nYear, m.nMonth, m.nDay, m.nHour, m.nMin, m.nSec) >>>CLEAR DLLS >>> >>> >>>FUNCTION VFPSetDateTime(m.pYear, m.pMonth, m.pDay, m.pHour, m.pMinute, m.pSecond) >>> >>> ************************************************************************ >>> **** Taken from www.levelextreme.com FAQ #7864 >>> **** Created by Terence Tam - Hong Kong >>> ************************************************************************ >>> >>> LOCAL oUniverslTime AS Custom, oLocalTime AS Custom, oNewTime AS Custom >>> LOCAL m.lpcount, m.cBuff, m.sYear, m.sMonth, m.sWeekDay, m.sDay, m.sHour, m.sMinute, m.sSecond, m.sMinSecond >>> LOCAL m.nYear, m.nMonth, m.nDay, m.nWeekDay, m.nHour, m.nMinute, m.nSecond, m.nMinSecond >>> m.lpcount = PCOUNT() >>> IF m.lpcount < 3 >>> MESSAGEBOX("Usage: VFPSetDateTime(Year, Month, Day [[[, Hour ], Minute ], Second ])", ; >>> 32, "Wrong Usage, Note: Only for 24 Hours Setting") >>> RETURN >>> ENDIF >>> >>> >>> m.cBuff = SPACE(16) && Each Information (WORD) worth 2 bytes >>> GetLocalTime(@cBuff) >>> m.sYear = ALLTRIM(STR( ASC(SUBSTR(cBuff,1,1))+ASC(SUBSTR(cBuff,2,1))*256)) >>> m.sMonth = ALLTRIM(STR( ASC(SUBSTR(cBuff,3,1))+ASC(SUBSTR(cBuff,4,1))*256)) >>> m.sWeekDay = ALLTRIM(STR( ASC(SUBSTR(cBuff,5,1))+ASC(SUBSTR(cBuff,6,1))*256)) >>> m.sDay = ALLTRIM(STR( ASC(SUBSTR(cBuff,7,1))+ASC(SUBSTR(cBuff,8,1))*256)) >>> m.sHour = ALLTRIM(STR( ASC(SUBSTR(cBuff,9,1))+ASC(SUBSTR(cBuff,10,1))*256)) >>> m.sMinute = ALLTRIM(STR( ASC(SUBSTR(cBuff,11,1))+ASC(SUBSTR(cBuff,12,1))*256)) >>> m.sSecond = ALLTRIM(STR( ASC(SUBSTR(cBuff,13,1))+ASC(SUBSTR(cBuff,14,1))*256)) >>> m.sMinSecond = ALLTRIM(STR( ASC(SUBSTR(cBuff,15,1))+ASC(SUBSTR(cBuff,16,1))*256)) >>> >>> m.nYear = pYear >>> m.nMonth = pMonth >>> m.nDay = pDay >>> m.nWeekDay = DOW(CTOD(ALLTRIM(STR(nMonth)) + [/] + ALLTRIM(STR(nDay)) + [/] + ALLTRIM(STR(nYear)))) && MDY >>> >>> DO CASE >>> CASE m.lpcount = 3 >>> m.nHour = HOUR(DATETIME()) >>> m.nMinute = MINUTE(DATETIME()) >>> m.nSecond = SEC(DATETIME()) >>> CASE m.lpcount = 4 >>> m.nHour = pHour >>> m.nMinute = MINUTE(DATETIME()) >>> m.nSecond = SEC(DATETIME()) >>> CASE m.lpcount = 5 >>> m.nHour = pHour >>> m.nMinute = pMinute >>> m.nSecond = SEC(DATETIME()) >>> CASE m.lpcount = 6 >>> m.nHour = pHour >>> m.nMinute = pMinute >>> m.nSecond = pSecond >>> ENDCASE >>> m.nMinSecond = VAL(sMinSecond) >>> >>> ******************************* >>> *** Changes made by me :o) >>> oUniverslTime = CREATEOBJECT("Custom") >>> oUniverslTime.AddProperty("Year" ,pYear) >>> oUniverslTime.AddProperty("Month" ,pMonth) >>> oUniverslTime.AddProperty("Day" ,pDay) >>> oUniverslTime.AddProperty("Hour" , pHour) >>> oUniverslTime.AddProperty("Minute" , pMinute) >>> oUniverslTime.AddProperty("Seconds", pSecond) >>> >>> oLocalTime = CREATEOBJECT("Custom") >>> oLocalTime.AddProperty("Year" , nYear) >>> oLocalTime.AddProperty("Month" , nMonth) >>> oLocalTime.AddProperty("Day" , nDay) >>> oLocalTime.AddProperty("Hour" , nHour) >>> oLocalTime.AddProperty("Minute" , nMinute, ) >>> oLocalTime.AddProperty("Seconds", nSecond, ) >>> >>> >>> oNewTime = LocalZoneTime(oUniverslTime, oLocalTime) >>> >>> nBuff = CHR(oNewTime.Year%256) + CHR(INT(oNewTime.Year/256)) +; >>> CHR(oNewTime.Month%256) + CHR(INT(oNewTime.Month/256)) +; >>> CHR(nWeekday%256) + CHR(INT(nWeekday/256)) +; >>> CHR(oNewTime.Day%256) + CHR(INT(oNewTime.Day/256)) +; >>> CHR(oNewTime.Hour%256) + CHR(INT(oNewTime.Hour/256)) +; >>> CHR(oNewTime.Minute%256) + CHR(INT(oNewTime.Minute/256))+; >>> CHR(oNewTime.Seconds%256) + CHR(INT(oNewTime.Seconds/256))+; >>> CHR(nMinSecond%256) + CHR(INT(nMinSecond/256)) >>> >>> SetLocalTime(@nBuff) >>>ENDPROC >>> >>> >>> >>>FUNCTION LocalZoneTime(oUniverslTime AS Collection , oLocalTime AS Collection) >>> >>> >>> ************ ************ ************ ************ ************ ************ >>> ** Taken from MSDN HOWTO: Obtain Time Zone Information in Visual FoxPro >>> ** Article KB194576 >>> ************ ************ ************ ************ ************ ************ >>> >>> * the definition for TIME_ZONE_INFORMATION is: >>> * >>> *typedef struct _TIME_ZONE_INFORMATION { // tzi >>> * LONG Bias; >>> * WCHAR StandardName[ 32 ]; >>> * SYSTEMTIME StandardDate; >>> * LONG StandardBias; >>> * WCHAR DaylightName[ 32 ]; >>> * SYSTEMTIME DaylightDate; >>> * LONG DaylightBias; >>> *} TIME_ZONE_INFORMATION; >>> >>> * buffer to receive TIME_ZONE_INFORMATION >>> TZInfo = REPLICATE(CHR(0),172) >>> >>> DECLARE INTEGER GetTimeZoneInformation IN kernel32 STRING @TZInfo >>> liRetCode = GetTimeZoneInformation(@TZInfo) >>> DO CASE >>> CASE liRetCode = ID_UNKNOWN >>> =MESSAGEBOX ("TIME_ZONE_ID_UNKNOWN") >>> RETURN oUniverslTime >>> CASE liRetCode = ID_STANDARD >>> =MESSAGEBOX ("TIME_ZONE_ID_STANDARD") >>> CASE liRetCode = ID_DAYLIGHT >>> =MESSAGEBOX ("TIME_ZONE_ID_DAYLIGHT") >>> ENDCASE >>> >>> * now, parse the returned structure >>> * Daylight savings time bias is a negative value >>> * stored in 2s complement, so subtract 2^32 to obtain a decimal value >>> liBias = StrToLong(SUBSTR(TZInfo, 1, 4)) - 2 ^ 32 >>> >>> * lcStandardName is a Unicode string - strip out chr(0)s for >>> * US/English >>> lcStandardName = SUBSTR(TZInfo, 5, 64) >>> lcStandardName = STRTRAN(lcStandardName, CHR(0), "") >>> >>> * lcStandardDate is a SYSTEMTIME structure, defined as follows: >>> * >>> *typedef struct _SYSTEMTIME { // st >>> * WORD wYear; >>> * WORD wMonth; >>> * WORD wDayOfWeek; >>> * WORD wDay; >>> * WORD wHour; >>> * WORD wMinute; >>> * WORD wSecond; >>> * WORD wMilliseconds; >>> *} SYSTEMTIME; >>> >>> * this SYSTEMTIME struct must be parsed again >>> lcStandardDate = SUBSTR(TZInfo, 69, 16) >>> lcSDYear = Str2Word(SUBSTR(lcStandardDate, 1, 2)) >>> lcSDMonth = Str2Word(SUBSTR(lcStandardDate, 3, 2)) >>> lcSDDayofWeek = Str2Word(SUBSTR(lcStandardDate, 5, 2)) >>> lcSDDay = Str2Word(SUBSTR(lcStandardDate, 7, 2)) >>> lcSDHour = Str2Word(SUBSTR(lcStandardDate, 9, 2)) >>> lcSDMinute = Str2Word(SUBSTR(lcStandardDate, 11, 2)) >>> lcSDSecond = Str2Word(SUBSTR(lcStandardDate, 13, 2)) >>> lcSDMSec = Str2Word(SUBSTR(lcStandardDate, 15, 2)) >>> >>> >>> liStandardBias = StrToLong(SUBSTR(TZInfo, 85, 4)) >>> >>> * lcDaylightname is also a Unicode string >>> lcDaylightName = SUBSTR(TZInfo, 89, 64) >>> lcDaylightName = STRTRAN(lcDaylightName, CHR(0), "") >>> >>> * this SYSTEMTIME struct must be parsed again, same as above >>> lcDaylightDate = SUBSTR(TZInfo, 153, 16) >>> lcDDYear = Str2Word(SUBSTR(lcDaylightDate, 1, 2)) >>> lcDDMonth = Str2Word(SUBSTR(lcDaylightDate, 3, 2)) >>> lcDDDayofWeek = Str2Word(SUBSTR(lcDaylightDate, 5, 2)) >>> lcDDDay = Str2Word(SUBSTR(lcDaylightDate, 7, 2)) >>> lcDDHour = Str2Word(SUBSTR(lcDaylightDate, 9, 2)) >>> lcDDMinute = Str2Word(SUBSTR(lcDaylightDate, 11, 2)) >>> lcDDSecond = Str2Word(SUBSTR(lcDaylightDate, 13, 2)) >>> lcDDMSec = Str2Word(SUBSTR(lcDaylightDate, 15, 2)) >>> >>> >>> * Daylight savings time bias is a negative value >>> * stored in 2s complement, so subtract 2^32 to obtain a decimal value >>> liDaylightBias = StrToLong(SUBSTR(TZInfo, 169, 4)) - 2 ^ 32 >>> >>> >>> nZoneCorrection = liBias >>> DO CASE >>> CASE liRetCode == TIME_ZONE_ID_STANDARD >>> nZoneCorrection = nZoneCorrection + liStandardBias >>> CASE liRetCode== TIME_ZONE_ID_DAYLIGHT >>> nZoneCorrection = nZoneCorrection + liDaylightBias >>> ENDCASE >>> nZoneCorrection = -nZoneCorrection >>> nTotalMinutes = oUniverslTime.Hour * 60 + oUniverslTime.Minute + nZoneCorrection >>> IF nTotalMinutes < 0 >>> nTotalMinutes = nTotalMinutes + 24*60 >>> ENDIF >>> IF nTotalMinutes>24*60 >>> nTotalMinutes = nTotalMinutes - 24*60 >>> ENDIF >>> oLocalTime.Year = oUniverslTime.Year >>> oLocalTime.Month = oUniverslTime.Month >>> oLocalTime.Day = oUniverslTime.Day >>> oLocalTime.Hour = INT(nTotalMinutes /60) >>> oLocalTime.Minute = nTotalMinutes - oLocalTime.Hour*60 >>> oLocalTime.Seconds = oUniverslTime.Seconds >>> >>>RETURN oLocalTime >>> >>>********************* >>>FUNCTION StrToLong(m.lcLongstr) >>>********************* >>> * Passed: 4-byte character string (lcLongstr) in low-high ASCII format >>> * Returns: long integer value >>> * Example: >>> * m.longstr = "1111" >>> * m.longval = strtolong(m.longstr) >>> >>> LOCAL i, lnRetval >>> >>> m.lnRetval = 0 >>> FOR m.i = 0 TO 24 STEP 8 >>> m.lnRetval = m.lnRetval + (ASC(m.lcLongstr) * (2^i)) >>> m.lcLongstr = RIGHT(m.lcLongstr, LEN(m.lcLongstr) - 1) >>> NEXT >>> >>>RETURN lnRetval >>> >>> ********************** >>>FUNCTION Str2Word(m.wordstr) >>> >>> LOCAL m.i, m.retval >>> m.retval = 0 >>> FOR i = 0 TO 8 STEP 8 >>> m.retval = m.retval + (ASC(m.wordstr) * (2^i)) >>> m.wordstr = RIGHT(m.wordstr, LEN(m.wordstr) - 1) >>> NEXT >>> >>>RETURN m.retval >>>