QB64.org Forum

Active Forums => QB64 Discussion => Topic started by: Larryrl on October 22, 2021, 12:32:06 am

Title: day of the week function
Post by: Larryrl on October 22, 2021, 12:32:06 am
I would like to find a function where I can have it tell me what day of the week it is for the first of the current month. Am wanting to do a computer calendar with slots to write in appointments kind of like a yearly planner.
Title: Re: day of the week function
Post by: bplus on October 22, 2021, 12:45:28 am
Have you tried a search for calendar, there's at least 4 to find:
Pete, SMcNeill, SierraKen, bplus
Title: Re: day of the week function
Post by: SMcNeill on October 22, 2021, 12:49:34 am
FUNCTION GetDay (m, d, y) 'use 4 digit year
    'From Zeller's congruence: https://en.wikipedia.org/wiki/Zeller%27s_congruence
    mm = m: dd = d: yyyy = y
    IF mm < 3 THEN mm = mm + 12: yyyy = yyyy - 1
    century = yyyy MOD 100
    zerocentury = yyyy \ 100
    result = (dd + INT(13 * (mm + 1) / 5) + century + INT(century / 4) + INT(zerocentury / 4) + 5 * zerocentury) MOD 7
    IF result = 0 THEN
        GetDay = 7
    ELSE
        GetDay = result
    END IF
    'Function changed to return a numeric value instead of a string for this program
    '    SELECT CASE result
    '        CASE 7: GetDay$ = "Saturday"
    '        CASE 1: GetDay$ = "Sunday"
    '        CASE 2: GetDay$ = "Monday"
    '        CASE 3: GetDay$ = "Tuesday"
    '        CASE 4: GetDay$ = "Wednesday"
    '        CASE 5: GetDay$ = "Thursday"
    '        CASE 6: GetDay$ = "Friday"
    '    END SELECT
END FUNCTION
Title: Re: day of the week function
Post by: Pete on October 22, 2021, 11:55:51 am
The one I posted a few years ago is here: https://www.qb64.org/forum/index.php?topic=855.msg100586#msg100586

It was designed as a popup. I used to toggle to it when I needed to input a date into a WP app.

I checked it. It still runs fine on V2.0. I really should update it to work with the QB64 mouse. Oh well, add that to my to-do list.

Pete
Title: Re: day of the week function
Post by: George McGinn on October 22, 2021, 06:33:17 pm
Here's one based on the doomsday rule that may refer to a hypothetical event according to which the end of human life is at the highest possibility. There are many algorithms written to calculate which day of a week in a year has the highest possibility of doomsday falling on that day.

This program expands upon and is a generalized version of the Dooms Day Code program, where the formula used in combination with the "Special Dates" can easily calculate the Day Of Week (DOW) from a date without any complicated algorithms (such as the one that uses the Julian Date from a specific point in time).

This method is also used as a math trick to calculate the day of week in your head.

See: https://en.wikipedia.org/wiki/Doomsday_rule

Code: QB64: [Select]
  1. _TITLE "Day Of Week"
  2. ' *** Dooms Day Code Used For Calculating The Day of Week ***
  3. ' *** Written by George McGinn
  4. ' *** Code shared under Creative Commons License "Universal 1.0 Public Domain (CC0 1.0)"
  5. ' *** https://creativecommons.org/publicdomain/zero/1.0/
  6. '
  7. ' *** Program will run on Linux, Windows and MAC Systems.
  8. '
  9. '____________________________________________________________________________________________________________________
  10. '
  11. ' Doomsday may refer to a hypothetical event according to which the end of human life is at the highest possibility.
  12. ' There are many algorithms written to calculate which day of a week in a year has the highest possibility of
  13. ' doomsday falling on that day.
  14. '
  15. ' This program expands upon and is a generalized version of the Dooms Day Code program, where the formula used in
  16. ' combination with the "Special Dates" can easily calculate the Day Of Week (DOW) from a date without any complicated
  17. ' algorithms (such as the one that uses the Julian Date from a specific point in time).
  18. '
  19. ' See: https://en.wikipedia.org/wiki/Doomsday_rule
  20. '
  21. ' SPECIAL DATES
  22. ' These are dates that when the Dooms Day Code for the year in question is calculated, these dates all have the
  23. ' same DOW.
  24. '
  25. ' The "Speical Dates" or "Refernce Dates" where the Doomsday DOW code is the same through the currenly selected
  26. ' year are:
  27. '   4/4, 6/6, 8/8, 10/10 and 12/12 --> These set of dates are referred to as "Doubles"
  28. '   5/9, 7/11, 9/5 and 11/7        --> Reverse dates
  29. '   3/14                           --> PI Day
  30. '   2/28 or 2/29                   --> Non Leap-year (2/28) or Leap-year (2/29)
  31. '   1/3 or 1/4                     --> Non Leap-year (1/3) or Leap-year (1/4)
  32. '
  33. ' All these days have the same DOW. For example, if it is 9/7/2015, the Doomsday code for 2015 is 06 or "Saturday."
  34. ' This means that all the above dates fall on Saturday in 2015 (use the non Leap-year dates).
  35. '
  36. ' To use this to find out what day-of-week 9/7/2015 falls on, find the closest day from the reference dates, and
  37. ' do a simple addition or subtraction. The date 9/7 is the closest date, and we know that 9/7 is a "Saturday" based
  38. ' on the calculated Doomsday code. We only need to subtract 5 from 7, giving us 2, then subracting 2 from 6, giving
  39. ' us 4. DOW(4) = Thurdsday. So 9/7/2015 falls on a Thursday.
  40. '
  41. ' If we want to calculate the DOW that Christmas falls on in 2015 (12/25/2015) the same proceedure is used.
  42. ' The closest reference date is 12/12. Subtracting 12 from 25 gives us 13. 13 MOD 7 = 6. Since 6 is one day short
  43. ' of a whole week, we only need to subtract one day from the Doomsday Code ((7-6)-1)=5. Christmas 2015 is on Friday.
  44. '
  45. ' This program uses this logic to calculate any DOW from any date from 1583 to well into the future. Any date before
  46. ' the Gregorian Calendar was adopted in your country will give you inaccurate results.  Check the following link:
  47. '     https://en.wikipedia.org/wiki/List_of_adoption_dates_of_the_Gregorian_calendar_per_country
  48. '
  49. '
  50. ' PROGRAM NOTES
  51. '
  52. ' This program uses both the Dooms Day algorithm and incorporates the mental math trick to calculate the Day-of-Week
  53. ' in your head. By using this method makes the code (and process of) more understandable and slightly faster than
  54. ' using the complex algorithms using the Julian Date and doing all the divisions by 4, 100 and 400 for Leap Years.
  55. '
  56. ' Below is a description of what each FUNCTION/SUBROUTINE does in this program:
  57. '
  58. ' floor          - A C++ Library that does not round up numbers when converting FLOAT to INTEGER. (Thanks to
  59. '                  both Fleppie and Spriggs for this)
  60. '
  61. ' dooms_day_code - Calculates the Doomsday Code for the century of the supplied date. This is needed as input into
  62. '                  the calculation of the actual year's Dooms Date code.
  63. '
  64. ' dooms_date     - Takes the century "anchor" code from dooms_day_code and calculates the Dooms Day code for the
  65. '                  actual year of the date.  This will be used to calculate the Day-of-Week for the date supplied.
  66. '____________________________________________________________________________________________________________________
  67.  
  68.     FUNCTION floor## (BYVAL num AS _FLOAT)
  69.  
  70. DIM SHARED dict_day$(7)
  71. DIM SHARED year, dow_anchor AS INTEGER
  72.  
  73. '*** map to store days value of anchor day can be known
  74. dict_day$(0) = "Sunday"
  75. dict_day$(1) = "Monday"
  76. dict_day$(2) = "Tuesday"
  77. dict_day$(3) = "Wednesday"
  78. dict_day$(4) = "Thursday"
  79. dict_day$(5) = "Friday"
  80. dict_day$(6) = "Saturday"
  81.  
  82.  
  83. main:
  84. '*** Enter Year for Dooms Day Code and Display results
  85.     INPUT "Enter YEAR (CCYY): "; year
  86.     IF year < 1582 OR year > 2199 THEN
  87.         PRINT "*** ERROR: Date Invalid/Out Of Range"
  88.         GOTO main
  89.     END IF
  90.  
  91. '*** Get the Doomsday Code for the anchor
  92.     dow_anchor = dooms_day_code(year)
  93.  
  94. '*** Get the Doomsday Code using the century anchor for the year's actual Doomsday code and display
  95.     PRINT "Doomsday in the year "; year; " = "; dict_day$(dooms_day(year, dow_anchor))
  96.     END
  97.  
  98. '
  99. ' *** End of Main
  100. '____________________________________________________________________________________________________________________
  101.  
  102.  
  103. '*** FUNCTIONS AND SUBROUTINES
  104. '
  105.  
  106. FUNCTION dooms_day (year, anchor AS INTEGER)
  107.  
  108. DIM yr$, cc_str$, yy_str$
  109. DIM yy, cc AS INTEGER
  110.  
  111. '*** Split out the century from the year and create two variables
  112.     yr$ = STR$(year)
  113.     yr$ = _TRIM$(yr$)
  114.     cc_str$ = LEFT$(yr$, 2)
  115.     yy_str$ = RIGHT$(yr$, 2)
  116.     yy = VAL(yy_str$)
  117.     cc = VAL(cc_str$)
  118.  
  119. '*** Dooms day formula by1 John Conway
  120.     dooms_day = (yy + floor(yy / 4) + anchor) MOD 7
  121.    
  122.  
  123.  
  124. FUNCTION dooms_day_code (year)
  125.  
  126.     DIM y, anchor, yy, cc AS INTEGER
  127.     DIM yr$, cc_str$, yy_str$
  128.  
  129. '*** Split out the century from the year and create two variables
  130.     yr$ = STR$(year)
  131.     yr$ = _TRIM$(yr$)
  132.     cc_str$ = LEFT$(yr$, 2)
  133.     yy_str$ = RIGHT$(yr$, 2)
  134.     yy = VAL(yy_str$)
  135.     cc = VAL(cc_str$)
  136.  
  137. '*** Decide the anchor day
  138.     SELECT CASE cc_str$
  139.            CASE "17"
  140.                 anchor = 0
  141.            CASE "18"
  142.                 anchor = 5
  143.            CASE "19"
  144.                 anchor = 3
  145.            CASE "20"
  146.                 anchor = 2
  147.            CASE "21"
  148.                 anchor = 0
  149.            CASE "22"
  150.                 anchor = 5
  151.     END SELECT
  152.  
  153. '*** Dooms day formula by John Conway
  154.     dooms_day_code = ((floor(y / 12) + y MOD 12 + floor(y MOD 12) / 4) MOD 7 + anchor) MOD 7
  155.  
  156. '
  157. ' *** End of Program Source
  158. '____________________________________________________________________________________________________________________
Title: Re: day of the week function
Post by: Pete on October 22, 2021, 06:49:28 pm
I made a Mayan Calendar app, but it got erased in 2012. :(

Hey where's Larryrl or his brother Darrelry or his other brother Darrelry, anyway?

Hey George, since "Dooms Day" falls on a Sunday in 2021, do you have another version that gives the time. I'm barbecuing this Sunday, and if necessary, I'll start the coals early.

Pete
Title: Re: day of the week function
Post by: George McGinn on October 22, 2021, 09:00:44 pm
Donkey Dust!

I was looking for something clever for you @Pete, but I reran my code when all you posted was that doomsday in 2021 was on a Sunday.

The code that does what is described below is missing. I lost code (how novel!) A while back I consolidated all my BASIC code is a master directory in my SourceCode folder, and it appears I overlaid this program.

It should have allowed you to input a full date, and the doomsday code is for use in quickly calculating the DOW based on "Special" dates, like this "Special" programmer who preformed a doomsday event on his source code (DOH!)

Quote
' To use this to find out what day-of-week 9/7/2015 falls on, find the closest day from the reference dates, and
' do a simple addition or subtraction. The date 9/7 is the closest date, and we know that 9/7 is a "Saturday" based
' on the calculated Doomsday code. We only need to subtract 5 from 7, giving us 2, then subracting 2 from 6, giving
' us 4. DOW(4) = Thurdsday. So 9/7/2015 falls on a Thursday.
'
' If we want to calculate the DOW that Christmas falls on in 2015 (12/25/2015) the same proceedure is used.
' The closest reference date is 12/12. Subtracting 12 from 25 gives us 13. 13 MOD 7 = 6. Since 6 is one day short
' of a whole week, we only need to subtract one day from the Doomsday Code ((7-6)-1)=5. Christmas 2015 is on Friday.

Title: Re: day of the week function
Post by: Pete on October 22, 2021, 09:21:20 pm
No worries. I'm currently working on a program to calculate when Hell will freeze over. People ask me all the time, "Pete, when is it going to be finished?" I'll tell you the same thing I tell all of the rest of them. It will be finished when Hell freezes over.

What's that dear? Time for my meds again! Already? Argh.

Pete