Announcement

Collapse

Forum Guidelines

This forum is for finished source code that is working properly. If you have questions about this or any other source code, please post it in one of the Discussion Forums, not here.
See more
See less

DateAdd and DateDiff

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • DateAdd and DateDiff

    Thought this might be useful to some people to partially emulate some of VBs date functions

    #COMPILE EXE
    #DIM ALL

    #INCLUDE "win32api.inc"

    'The following are interval specifications for the DateDiff and DateAdd functions
    'Only periods of fixed time are included (so no months or years)
    'Although these could be easily calculated by other means
    %INT_SECONDS = 10000000
    %INT_MINUTES = 600000000
    %INT_HOURS = 36000000000
    %INT_DAYS = 864000000000

    TYPE DateSplit
    LowPart AS DWORD
    HighPart AS DWORD
    END TYPE

    UNION DateQuad
    U AS DateSplit
    QuadPart AS QUAD
    END UNION

    FUNCTION DateDiff(BYVAL Interval AS QUAD,BYVAL udtSource AS SYSTEMTIME,BYVAL udtDest AS SYSTEMTIME) AS QUAD
    LOCAL udtFileSource AS FILETIME,udtFileDest AS FILETIME
    LOCAL udtQuadSource AS DateQuad,udtQuadDest AS DateQuad

    'convert to filetime
    systemtimetofiletime udtSource,udtFileSource
    systemtimetofiletime udtDest,udtFileDest

    'convert to quad time
    udtQuadSource.u.LowPart=udtFileSource.dwLowDateTime
    udtQuadSource.u.HighPart=udtFileSource.dwHighDateTime
    udtQuadDest.u.LowPart=udtFileDest.dwLowDateTime
    udtQuadDest.u.HighPart=udtFileDest.dwHighDateTime

    FUNCTION=(udtQuadDest.QuadPart - udtQuadSource.QuadPart)\interval
    END FUNCTION

    SUB DateAdd(BYVAL Interval AS QUAD,BYVAL udtSource AS SYSTEMTIME,BYVAL Amount AS QUAD,BYREF udtDest AS SYSTEMTIME)
    Amount=Amount * Interval
    LOCAL udtFileSource AS FILETIME,udtFileDest AS FILETIME
    LOCAL udtQuadSource AS DateQuad,udtQuadDest AS DateQuad

    'convert source to FileTime
    systemtimetofiletime udtSource,udtFileSource

    'convert to quad time
    udtQuadSource.u.LowPart=udtFileSource.dwLowDateTime
    udtQuadSource.u.HighPart=udtFileSource.dwHighDateTime

    'add the interval
    udtQuadSource.QuadPart = udtQuadSource.QuadPart + Amount
    'copy back to dest filetime structure
    udtFileDest.dwLowDateTime=udtQuadSource.u.LowPart
    udtFileDest.dwHighDateTime=udtQuadSource.u.HighPart

    'convert filetime to systemtime
    filetimetosystemtime udtFileDest,udtDest
    END SUB

    FUNCTION PBMAIN () AS LONG

    LOCAL udtNow AS SYSTEMTIME,udtCompare AS SYSTEMTIME,qdDifference AS QUAD

    'Get the current (users) time
    GetLocalTime udtNow

    'Now we will add on 3 days to the system time and store the result in udtCompare
    DateAdd %INT_DAYS,udtNow,3,udtCompare

    'Now get the number of hours difference between the 2 dates
    qdDifference=DateDiff(%INT_HOURS,udtNow,udtCompare)

    MSGBOX STR$(qdDifference) + " hours between the dates"

    END FUNCTION

    ------------------
Working...
X