Download text file
#if 0
    ----------------------------                      PowerBASIC v8.x
 ---|          DASoft          |------------------------------------------
    ----------------------------         Code           DATE: 2006-04-08
    | FILE NAME  TimeStamp.bas |          by
    ----------------------------  Don Schullian, Jr.

              This code is released into the Public Domain
       ----------------------------------------------------------
        No guarantee as to the viability, accuracy, or safety of
         use of this code is implied, warranted, or guaranteed
       ----------------------------------------------------------
                         Use at your own risk!
       ----------------------------------------------------------
                  CONTACT AUTHOR AT don@DASoftVSS.com
 -------------------------------------------------------------------------

This 32 bit time stamp holds the date and time with a resolution of 2 secs.
The span of dates capable of being held is variable by setting the constant
%DateOffset. Two values are offered in this file. To be able to extract the
day of the week from the day count (Days??) the first date (Day 1) must be
Jan. 1 of a year that is the first year after a leap year and the day of the
week must be Monday.

By setting %DateOffset to zero you can use the date packers as longs and have
a spread of 5M years.

#endif


#COMPILE EXE
#COMPILER PBWIN 8, PBCC 4
#DEBUG ERROR ON
#TOOLS ON
#DIM ALL

TYPE SYSTEMTIME
  wYear         AS WORD
  wMonth        AS WORD
  wDayOfWeek    AS WORD
  wDay          AS WORD
  wHour         AS WORD
  wMinute       AS WORD
  wSecond       AS WORD
  wMilliseconds AS WORD
END TYPE

DECLARE SUB GetLocalTime LIB "KERNEL32.DLL" ALIAS "GetLocalTime" (lpSystemTime AS SYSTEMTIME)

 %DateOffset = 728658 ' Jan 1, 1996 -> Jun 5, 2175
'%DateOffset = 685195 ' Jan 1, 1877 -> Jun 5, 2056
'
'------------------------------------------------------------------------------
'
FUNCTION fLeapYear (BYVAL Year AS LONG) AS LONG

  IF ( ( Year MOD   4 ) = 0 ) AND _
     ( ( Year MOD 100 ) > 0 )  OR _
     ( ( Year MOD 400 ) = 0 ) THEN FUNCTION = 1

END FUNCTION
'
'------------------------------------------------------------------------------
'
FUNCTION fJulianDay (BYVAL Year  AS LONG, _
                     BYVAL Month AS LONG, _
                     BYVAL Day   AS LONG  ) AS LONG

  Day = Day + VAL(READ$(Month))
  IF Month > 2 THEN
    Day = Day + fLeapYear(Year)
  END IF

  FUNCTION = Day

  DATA 000, 031, 059, 090, 120, 151
  DATA 181, 212, 243, 273, 304, 334

END FUNCTION
'
'------------------------------------------------------------------------------
'
SUB Julian2MD ( BYVAL Year  AS LONG, _
                BYVAL Days  AS LONG, _
                      Month AS LONG, _
                      Day   AS LONG  )


  DIM LeapYear AS LOCAL LONG

  LeapYear = fLeapYear(Year)
  Month    = 12

  DO
    Day = VAL(READ$(Month)) + LeapYear
    IF Days > Day THEN
      Day = Days - Day
      EXIT SUB
    END IF
    DECR Month
    IF Month = 2 THEN LeapYear = 0
  LOOP UNTIL Month = 0

  DATA 000, 031, 059, 090, 120, 151
  DATA 181, 212, 243, 273, 304, 334

END SUB
'
'------------------------------------------------------------------------------
'
FUNCTION fDaysInMonth (BYVAL Year  AS LONG, _
                       BYVAL Month AS LONG  ) AS LONG

  DIM Days AS LOCAL LONG

  Days = VAL(READ$(Month))
  IF Month = 2 THEN Days = Days + fLeapYear(Year)

  FUNCTION = Days

  DATA 31, 28, 31, 30, 31, 30
  DATA 31, 31, 30, 31, 30, 31

END FUNCTION
'
'------------------------------------------------------------------------------
'
FUNCTION fDays2YMD (BYVAL Days  AS LONG, _
                          Year  AS LONG, _
                          Month AS LONG, _
                          Day   AS LONG  ) AS LONG

  DIM DoW  AS LOCAL LONG
  DIM Temp AS LOCAL LONG

  Days = Days + %DateOffset
  DoW  = (Days MOD 7)
  Year = (Days \ 365)
  Temp = (Year \ 4) - (Year \ 100) + (Year \ 400)
  Days = (Days MOD 365) - Temp

  WHILE Days < 1
    Days = Days + 365 + fLeapYear(Year)
    DECR Year
  WEND

  INCR Year

  Julian2MD Year, Days, Month, Day

  FUNCTION = DoW

END FUNCTION
'
'------------------------------------------------------------------------------
'
FUNCTION fYMD2Days (BYVAL Year  AS LONG, _
                    BYVAL Month AS LONG, _
                    BYVAL Day   AS LONG  ) AS LONG

  IF ( Year  = 0 )   OR _
     ( Month = 0 )   OR _
     ( Day   = 0 ) THEN EXIT FUNCTION

  IF Month > 1 THEN Day = fJulianDay(Year,Month,Day)     'compute Julian day
  DECR Year                                              'don't count 'this year'
  Day = Day + (Year * 365) + _                           ' add full years
              (Year \   4) - _                           ' add a day for each olympiad
              (Year \ 100) + _                           ' subtract a day for each century
              (Year \ 400)                               ' add a day for each epoc
                                                         '
  FUNCTION = Day - %DateOffset                           'RETURN day count
                                                         '  unREM to use WORDs
END FUNCTION
'
'------------------------------------------------------------------------------
'
FUNCTION fTimeStamp () AS DWORD

  DIM  Days AS LOCAL WORD
  DIM  Mins AS LOCAL WORD
  DIM tS    AS LOCAL SystemTime

  GetLocalTime tS

  Mins = (tS.wHour * 1800) + (tS.wMinute * 30) + (tS.wSecond \ 2)
  Days = fYMD2Days(tS.wYear,tS.wMonth,tS.wDay)

  FUNCTION = MAK(DWORD,Mins,Days)

END FUNCTION
'
'------------------------------------------------------------------------------
'
FUNCTION PBMAIN () AS LONG

  DIM D AS LOCAL LONG
  DIM W AS LOCAL STRING
  DIM H AS LOCAL LONG
  DIM M AS LOCAL LONG
  DIM S AS LOCAL LONG
  DIM Y AS LOCAL LONG
  DIM T AS LOCAL DWORD

  fDays2YMD &h00001, Y, M, D
  ? "First Date" & STR$(Y) & STR$(M) & STR$(D)
  fDays2YMD &h0ffff, Y, M, D
  ? "Last Date" & STR$(Y) & STR$(M) & STR$(D)

  T = fTimeStamp
  ? "Time Stamp" & STR$(T)
  D = HI(WORD,T)
  W = READ$((D MOD 7) +1)
  fDays2YMD D, Y, M, D
  ? "Date " &  W & STR$(Y) & STR$(M) & STR$(D)
  T = LO(WORD,T)
  H = T \ 1800
  S = T MOD 30
  M = (T - (H*1800)) \ 30
  ? "Time" & STR$(H) & STR$(M) & STR$(S)

#IF %DEF(%PB_CC32)
  INPUT FLUSH
  WAITKEY$
#ENDIF

  DATA Sun, Mon, Tue, Wed, Thr, Fri, Sat

END FUNCTION