Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
How to find current date from web
Message
From
05/03/2010 02:29:54
 
 
To
04/03/2010 18:24:50
General information
Forum:
Visual FoxPro
Category:
Web Services
Environment versions
Visual FoxPro:
VFP 9 SP1
Miscellaneous
Thread ID:
01452651
Message ID:
01452690
Views:
60
Hi Alejandro,

long time, no see. Here's a Findtime() function I found many years ago. You must change it a little bit, but that is "piece of cake" for you.
*****************************************************************************************
**** 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 #<A HREF="/wconnect/wc.dll?LevelExtreme~2,84,14,7864" TARGET="_blank">7864</A>
   **** 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
>How can you find out current date from the web (not using DATE() function)
>
>TIA,
>
>Alex
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform