'===========================================================================
' Subject: VB DATE ROUTINES UPDATE            Date: 10-11-99 (20:31)       
'  Author: Dave Navarro, Jr.                  Code: PBCC, PBDLL            
'  Origin: dave@powerbasic.com              Packet: PBCC.ABC
'===========================================================================
'==============================================================================
'
'  Dealing with Visual Basic dates in PowerBASIC
'  Compatible with both PB/CC and PB/DLL
'  by Dave Navarro, Jr. (dave@powerbasic.com)
'
'  A VB time variable is stored as an 8-byte real value (double), representing
'  a date between January 1, 1753 and December 31, 2078, inclusive. The value
'  2.0 represents January 1, 1900; 3.0 represents January 2, 1900, and so on.
'  Adding 1 to the value increments the date by a day. The fractional part of
'  the value represents the time of day. Therefore, 2.5 represents noon on
'  Janurary 1, 1900; 3.25 represents 6:00 A.M. on January 2, 1900, and so on.
'  Negative numbers represent the dates prior to December 30, 1899. '
'
'==============================================================================

$IF %DEF(%pb_dll32)
  $COMPILE EXE
$ENDIF
$INCLUDE "WIN32API.INC"

FUNCTION uString(BYVAL x AS STRING) AS STRING

  LOCAL y AS STRING
  LOCAL n AS INTEGER

  IF LEN(x) THEN
    FOR n = 1 TO LEN(x)
      y = y + MKI$(ASC(x, n))
    NEXT n
  END IF

  FUNCTION = y

END FUNCTION

FUNCTION StrToVbDate(BYVAL dt AS STRING) AS DOUBLE

  LOCAL vbdate AS DOUBLE

  dt = uString(dt)
  IF ISFALSE(VarDateFromStr(BYVAL STRPTR(dt), 0, 0, vbdate)) THEN
    FUNCTION = vbdate
  END IF

END FUNCTION

FUNCTION VbDateToStr(BYVAL vbdate AS DOUBLE) AS STRING

  LOCAL d  AS ASCIIZ * 64
  LOCAL dt AS STRING
  LOCAL st AS SYSTEMTIME

  VariantTimeToSystemTime vbdate, st
  GetDateFormat 0, 1, st, BYVAL %NULL, d, 64

  dt = d

  GetTimeFormat 0, 12, st, BYVAL %NULL, d, 64
  dt = dt & " " & d

  FUNCTION = dt

END FUNCTION

FUNCTION Now() AS DOUBLE

  LOCAL st     AS SYSTEMTIME
  LOCAL vbDate AS DOUBLE

  GetSystemTime st
  SystemTimeToVariantTime st, vbDate

  FUNCTION = vbDate

END FUNCTION

'------------------------------------------------------------------------------

FUNCTION PbMain()

  LOCAL dt AS STRING
  LOCAL vb AS DOUBLE

  dt = "March 20, 1967 11:46:00"

  vb = StrToVbDate(dt)

$IF %DEF(%pb_cc32)
  PRINT dt; " ="; vb
$ELSE
  MsgBox dt & " =" & STR$(vb)
$ENDIF

  dt = VbDateToStr(vb)

$IF %DEF(%pb_cc32)
  PRINT vb; "= "; dt
$ELSE
  MsgBox STR$(vb) & " = " & dt
$ENDIF

END FUNCTION
