KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q188897: HOWTO: Setting the System Date and Time Programmatically

Article: Q188897
Product(s): Microsoft FoxPro
Version(s): WINDOWS:5.0,5.0a
Operating System(s): 
Keyword(s): 
Last Modified: 30-JUL-1999

-------------------------------------------------------------------------------
The information in this article applies to:

- Microsoft Visual FoxPro for Windows, versions 5.0, 5.0a 
-------------------------------------------------------------------------------

SUMMARY
=======

Although the system date and time can be set manually from Control Panel,
programatically changing these settings requires using the Win32 SetLocalTime
function.

SetLocalTime is passed a SYSTEMTIME structure, containing the following members:

  WORD wYear
  WORD wMonth
  WORD wDayOfWeek
  WORD wDay
  WORD wHour
  WORD wMinute
  WORD wSecond
  WORD wMilliseconds

Similar to all structures, you must construct a string containing its proper
memory representation. The Word2Str function in the code below performs this
conversion.

Also, note that it is necessary to subtract 1 from the result of the FoxPro dow()
function to obtain the wDayOfWeek member. Win32 treats Sunday as day 0 (zero)
and Saturday as day 6, whereas dow() treats Sunday as day 1 and Saturday as day
7.

It is more convenient to use the SetLocalTime function rather than the
intuitively more obvious choice, SetSystemTime, because the former treats the
SYSTEMTIME structure as a timezone-adjusted local time, while the latter
function treats the SYSTEMTIME structure as Greenwich Mean Time.

MORE INFORMATION
================

Create and execute a program containing the code below. The program stores the
current system date and time, changes it to 10:30:15.00 AM on 06/30/2001,
displays the FoxPro time() and date() functions to demonstrate that the date and
time have been changed, then resets them to their previous values.

Sample Code
-----------

     SET CENTURY ON

     * Save the current date and time, reset it at the end.
     m.olddate = DATE()
     m.oldtime = TIME(1)

     * Set the system time arbitrarily to 10:30:15 AM on 06/30/2001.
     m.updtdate = {06/30/2001}
     m.updttime = "10:30:15.00"
     =setsystime(m.updtdate, m.updttime)

     =MESSAGEBOX("Old date: " + DTOC(m.olddate) + CHR(13) + ;
        "Old time: " + m.oldtime + CHR(13) + ;
        "New system date: " + DTOC(DATE()) + CHR(13) + ;
        "New system time: " + TIME(1), ;
        0 + 64 + 0, ;
        "SetLocalTime()")

     * Now, reset it to its original value.
     m.updtdate = m.olddate
     m.updttime = m.oldtime
     =setsystime(m.updtdate, m.updttime)

     * Function setsystime.
     * Parameters: date, character time in the form HH:MM:SS:hh.
     * Returns: nothing.
     FUNCTION setsystime

     PARAMETERS m.updtdate, m.updttime

     DECLARE SHORT SetLocalTime IN win32api STRING SystemTime

     * Use SendMessage to tell everybody that we've changed the system time.
     DECLARE INTEGER SendMessage IN win32api ;
        INTEGER WindowHandle, ;
        INTEGER MESSAGE, ;
        STRING Param1, ;
        STRING Param2

     * SendMessage constants.
     #DEFINE HWND_BROADCAST 65535
     #DEFINE WM_TIMECHANGE 30

     m.SystemTime = word2str(YEAR(m.updtdate)) + ;
        word2str(MONTH(m.updtdate)) + ;
        word2str(DOW(m.updtdate) - 1) + ;
        word2str(DAY(m.updtdate)) + ;
        word2str(VAL(LEFT(m.updttime, 2))) + ;
        word2str(VAL(SUBSTR(m.updttime, 4, 2))) + ;
        word2str(VAL(SUBSTR(m.updttime, 7, 2))) + ;
        word2str(VAL(RIGHT(m.updttime, 2)))

     m.retval = SetLocalTime(m.SystemTime)

     * Send the message that the time has changed.
     m.retval = SendMessage(HWND_BROADCAST, WM_TIMECHANGE, "", "")

     * Function word2str.
     * Parameters: 16-bit value.
     * Returns: low-high format string for use in structures
     * requiring a WORD value.
     FUNCTION word2str

     PARAMETERS m.wordval

     PRIVATE i, m.retstr

     m.retstr = ""
     FOR i = 8 TO 0 STEP -8
        m.retstr = CHR(INT(m.wordval/(2^i))) + m.retstr
        m.wordval = MOD(m.wordval, (2^i))
     NEXT
     RETURN m.retstr

REFERENCES
==========

The Win32 API help file included in the MSDN Platform SDK CD.

Additional query words: kbDSupport SYSTEMTIME SETLOCALTIME SETSYSTEMTIME time date kbDSE kbvfp500

======================================================================
Keywords          :  
Technology        : kbVFPsearch kbAudDeveloper kbVFP500 kbVFP500a
Version           : WINDOWS:5.0,5.0a
Issue type        : kbhowto

=============================================================================

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.