You can download weekday.zip here with the source and an executeable or copy the program source below. Note this is only compatible with PBWin 7.0 compiler as it uses PBForms to make the dialog box and also uses one new function, CHOOSE$.

 

 
#PBFORMS Created
' Copyright 2002 Barry Erick, All Rights Reserved
' Requires PBWin 7.0 or above to compile.

' This program written by Barry Erick with help from USNavy
' on their meterological sites which have lots of documentation
' on Julian dates. We can't use system dates to get years
' earlier than 1980 or later than 2079, so julian dates
' are uses.
' Program inspired by the old Quick Pak Pro program, weekdays,
' which was DOS based, but had limited years. This does not have
' that limitation.
' A PB Win 7.0 program because of PBForms metastatements and the
' one CHOOSE$ function in Weekday function.
'--------------------------------------------------------------------------------
' The first line in this file is a PBForms metastatement.
' It should ALWAYS be the first line of the file. Other
' PBForms metastatements are placed at the beginning and
' ending of blocks of code that should be edited using
' PBForms only. Do not edit or delete these
' metastatements or PBForms will not be able to reread
' the file correctly. See the PBForms documentation for
' more information.
' Beginning blocks begin like this: #PBForms Begin ...
' Ending blocks begin like this:    #PBForms End ...
' Other PBForms metastatements such as:
'     #PBForms Declarations
' are used to tell PBForms where to insert additional
' code. Feel free to make changes anywhere else in the file.
'--------------------------------------------------------------------------------

#COMPILE EXE
#DIM ALL

'--------------------------------------------------------------------------------
'   ** Includes **
'--------------------------------------------------------------------------------
#PBFORMS Begin Includes
#IF NOT %DEF(%WINAPI)
    #INCLUDE "WIN32API.INC"
#ENDIF
#INCLUDE "PBForms.INC"
#PBFORMS End Includes
'--------------------------------------------------------------------------------
  GLOBAL ghdlg AS DWORD
'--------------------------------------------------------------------------------
'   ** Constants **
'--------------------------------------------------------------------------------
#PBFORMS Begin Constants
%IDD_DIALOG1    = 101
%IDC_TEXTBOX1   = 1001
%IDC_LABEL1     = 1002
%IDC_BUTTON1    = 1003
%IDC_TEXTBOX2   = 1004
%IDC_LABEL2     = 1006
#PBFORMS End Constants
'--------------------------------------------------------------------------------
TYPE PBDate
    Year AS DWORD
    Month AS DWORD
    Day AS DWORD
END TYPE
'--------------------------------------------------------------------------------
'   ** Declarations **
'--------------------------------------------------------------------------------
DECLARE CALLBACK FUNCTION ShowDIALOG1Proc()
DECLARE FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG
DECLARE FUNCTION Weekday(dwJulianDate AS DWORD) AS STRING
DECLARE FUNCTION Date2Jul(pdate AS pbdate) AS DWORD



#PBFORMS Declarations
'--------------------------------------------------------------------------------
FUNCTION WeekdayWrapper () AS STRING
     DIM st AS PBDate
     DIM j AS STRING
     DIM i AS LONG
     CONTROL GET TEXT ghdlg, %IDC_TEXTBOX1 TO j
     ' get format of string... may have "/"'s in. If so it is 3/4/55 or 03/04/1955
     ' if not in a / form, it has to be in 030455 or 03041955
      IF TALLY(j,ANY "/-")=2 THEN
         'parse the / stuff
         ' make sure the characters are right
         i = INSTR(j$, ANY "/-")
         IF i = 3 THEN
             INCR i ' move past for next test
             ELSE
                 j$="0"+j$    'they sent in 2/2
                 INCR i ' move past found position
                 INCR i ' move past new position
         END IF
         i  = INSTR (i,j$,ANY"/-")
         IF i = 6 THEN
           ELSE
            j$ = LEFT$(j$,3)+"0"+MID$(j$,i-1)
         END IF
         ' we are ok to remove...
          j = REMOVE$(j$, ANY "/-")
      END IF
      ' they need 4 digits at end for year, unless looking for a early year
      'work on the only possible way
      st.month = VAL(LEFT$(j,2))
      st.day   = VAL(MID$(j,3,2))
      st.year  = VAL(MID$(j,5))
     FUNCTION  = Weekday(date2jul(st))
END FUNCTION

FUNCTION Weekday(dwJulianDate AS DWORD) AS STRING
    IF dwJulianDate = 0 THEN
        FUNCTION = "Illegal date"
    ELSE
        FUNCTION = CHOOSE$(dwJulianDate MOD 7 + 1, "Monday", "Tuesday", _
              "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
    END IF
END FUNCTION

FUNCTION Date2Jul(pdate AS pbdate) AS DWORD
     LOCAL dwJulianDays AS DWORD
     IF pdate.month < 3 THEN
         pdate.month = pdate.month + 12
         DECR pdate.year
     END IF
     ' for exact julian number, we need time of day..
     ' but just to find the day of week we can skip
     ' day 1 of julian is 1/1/-4712 and there are 365.25 days per year
     dwJulianDays = INT((pdate.year + 4712) * 365.25) 'years since day 1 of julian
     dwJulianDays = dwJulianDays - (pdate.year \100) 'leapday fudge for centuries
     dwJulianDays = dwJulianDays + (pdate.year \ 400) ' each 400 years it isn't
     dwJulianDays = dwJulianDays + INT(30.6*(pdate.month-1)+.2)'do the month fudge
     FUNCTION = dwJulianDays + pdate.day
END FUNCTION



'--------------------------------------------------------------------------------
FUNCTION PBMAIN()
    ShowDIALOG1 %HWND_DESKTOP
END FUNCTION
'--------------------------------------------------------------------------------

'--------------------------------------------------------------------------------
'   ** CallBacks **
'--------------------------------------------------------------------------------
CALLBACK FUNCTION ShowDIALOG1Proc()

    SELECT CASE CBMSG
        CASE %WM_COMMAND
            SELECT CASE CBCTL
                CASE %IDC_BUTTON1
                    IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                        CONTROL SET TEXT ghdlg, %IDC_LABEL1,_
                        "That's a " & weekdaywrapper
                    END IF
            END SELECT
    END SELECT

END FUNCTION
'--------------------------------------------------------------------------------
'--------------------------------------------------------------------------------
'   ** Dialogs **
'--------------------------------------------------------------------------------
FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG
    LOCAL lRslt AS LONG
#PBFORMS Begin Dialog %IDD_DIALOG1->->
    LOCAL hDlg AS DWORD
    LOCAL hFont1 AS DWORD
    LOCAL hFont2 AS DWORD



    DIALOG NEW hParent, "Weekday", 151, 79, 195, 106, %WS_POPUP OR %WS_BORDER OR _
        %WS_DLGFRAME OR %WS_SYSMENU OR %WS_MINIMIZEBOX OR %WS_MAXIMIZEBOX OR _
        %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR _
        %DS_NOFAILCREATE OR %DS_SETFONT, %WS_EX_WINDOWEDGE OR _
        %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _
        %WS_EX_RIGHTSCROLLBAR, TO hDlg
    CONTROL ADD LABEL, hDlg, %IDC_LABEL1, "", 45, 55, 115, 15, %WS_CHILD OR _
        %WS_VISIBLE OR %SS_CENTER, %WS_EX_LEFT OR %WS_EX_LTRREADING
    CONTROL ADD BUTTON, hDlg, %IDC_BUTTON1, "Get Weekday", 70, 75, 65, 20, _
        %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %BS_TEXT OR %BS_PUSHBUTTON _
        OR %BS_DEFPUSHBUTTON OR %BS_CENTER OR %BS_VCENTER, %WS_EX_LEFT OR _
        %WS_EX_LTRREADING
    CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX1, "TEXTBOX1", 95, 35, 60, 12
    CONTROL ADD LABEL, hDlg, %IDC_LABEL2, "Enter Date using full year", 40, 35, _
        45, 20, %WS_CHILD OR %WS_VISIBLE OR %SS_CENTER, %WS_EX_LEFT OR _
        %WS_EX_LTRREADING

    hFont1 = PBFormsMakeFont("Courier New", 10, 700, %FALSE, %FALSE, %FALSE, %ANSI_CHARSET)
    hFont2 = PBFormsMakeFont("Times New Roman", 8, 400, %FALSE, %FALSE, %FALSE, %ANSI_CHARSET)

    CONTROL SEND hDlg, %IDC_LABEL1, %WM_SETFONT, hFont1, 0
    CONTROL SEND hDlg, %IDC_LABEL2, %WM_SETFONT, hFont2, 0

#PBFORMS End Dialog
    ghdlg = hdlg
    CONTROL SET TEXT hdlg,%IDC_TEXTBOX1, DATE$
    DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt

    DeleteObject hFont1

    FUNCTION = lRslt
END FUNCTION
'--------------------------------------------------------------------------------

Last updated June 16, 2002