days-between-dates Solver equation for 17b
|
10-05-2018, 04:19 PM
(This post was last modified: 10-07-2018 06:37 PM by Don Shepherd.)
Post: #1
|
|||
|
|||
days-between-dates Solver equation for 17b
Although a Solver equation for days-between-dates on the 17b series is unnecessary because that function is included in the Time menu, I thought it would be interesting to write a Solver equation for it anyhow. This equation is based upon the DBD algorithm found here:
https://alcor.concordia.ca/~gpkatch/gdat...rithm.html Katie Wasserman made me aware of this algorithm many years ago. To determine the number of days between two dates, you calculate the day number for each date and then subtract. In a programming language that supports subroutines, it would be easy to calculate the number of days difference. The 17b solver, however, does not support subroutines. I figured out a way to use the sigma function to make up for this deficiency; it loops two times, the first loop calculating the day number of the earlier date (DT1) and then calculating the day number of the later date (DT2) during the second loop. Subtraction of the two is achieved by using variable B to multiply the result of the first loop by -1 and the result of the second loop by 1. The resulting sum yields the days between the two dates. The solver equation works fine on the 17b and 17bii. It "might" work on the 17bii+ because it does not modify menu variables, but I wouldn't guarantee it will work on the +. This is an interesting exercise in using a loop as a substitute for a subroutine. Format of DT1 and DT2 is mm.ddyyyy Code:
|
|||
10-05-2018, 05:45 PM
(This post was last modified: 10-05-2018 11:06 PM by Albert Chan.)
Post: #2
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
(10-05-2018 04:19 PM)Don Shepherd Wrote: To determine the number of days between two dates, you calculate the day number for each date and then subtract. Why not just eval day number for the two dates, then subtract ? (Not as subroutine, but run the program twice) Edit: another benefit of exposing day number is you get days-of-the-week for free. Example, picking day number 1 for a Monday (say, Jan 1, 1, year 1) we get this: Today 10/05/2018 => days = 736972, days % 7 = 5 => Friday |
|||
10-05-2018, 07:20 PM
Post: #3
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
I guess it would work on the 27S too, but it already has a DDAYS function to do this.
— Ian Abbott |
|||
10-05-2018, 11:25 PM
Post: #4
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
(10-05-2018 05:45 PM)Albert Chan Wrote: Why not just eval day number for the two dates, then subtract ? Thanks Albert. The equation does evaluate day number for each date, then effectively subtracts by using multiplier B=1 for the later date and B=-1 for the earlier date. There is no need to run the program (equation) twice. I would never ask a user to have to run a program twice when one time should suffice. thanks for commenting, Don |
|||
10-06-2018, 02:06 PM
(This post was last modified: 10-07-2018 02:52 PM by Albert Chan.)
Post: #5
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
Hi, Don Shepherd
Thanks for the DBD algorithm link: https://alcor.concordia.ca/~gpkatch/gdat...rithm.html Gary Katch also explain why it work: https://alcor.concordia.ca/~gpkatch/gdate-method.html Based on the explanation, the day number calculation (and its inverse) are only limited by machine precision. My old day function, using system time, only work for 1970 to 2038. I coded above in Lua (using IEEE double). Now it can reach 24 trillion years ! |
|||
10-06-2018, 03:27 PM
(This post was last modified: 10-06-2018 08:37 PM by Albert Chan.)
Post: #6
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
Trivia: New Year's Day for year 400k are all Saturday
Prove: Let y = 400k, setup so that day(1/1/1) = 1, a Monday day(12/31/y) = 365*y + y/4 - y/100 + y/400 = 146097 y / 400 = 146097 k Since 146097 % 7 = 0, day(12/31/y) % 7 = 0, a Sunday Travel back time 365 days (y is leap year), 1/1/y is -365 % 7 = 6, a Saturday --- With above trivia, we can extend day range furthur: day(m/d/y) = day(m/d/(y%400)) + 146097*floor(y/400) Or, if no overflow issue, even simpler (without divide or modulo 400): day(m/d/y) = day(m/d/(y%10000)) + 3652425*floor(y/10000) For days-of-week calculation, last term can be dropped (it is divisible by 7). |
|||
10-06-2018, 04:01 PM
Post: #7
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
(10-06-2018 02:06 PM)Albert Chan Wrote: Thanks for the DBD algorithm link: https://alcor.concordia.ca/~gpkatch/gdat...rithm.html Thanks Albert. That is a very good algorithm that Katie first introduced me to. It is particularly easy to implement on the HP-17b since the solver includes MOD and IDIV functions. Don |
|||
10-06-2018, 11:57 PM
(This post was last modified: 10-07-2018 02:11 AM by brickviking.)
Post: #8
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
Speaking of going back in time, do these algorithms take any notice of the 11 days lost in 1753-ish? (varies between countries from 1753 to as late as 1923).
EDIT: whoops, I meant the change from Julian to Gregorian...I should have made that clear from the get-go. (Post 302) Regards, BrickViking HP-50g |Casio fx-9750G+ |Casio fx-9750GII (SH4a) |
|||
10-07-2018, 12:17 AM
Post: #9
|
|||
|
|||
RE: days-between-dates Solver equation for 17b | |||
10-07-2018, 07:14 AM
(This post was last modified: 10-07-2018 08:36 AM by Dieter.)
Post: #10
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
(10-06-2018 11:57 PM)brickviking Wrote: Speaking of going back in time, do these algorithms take any notice of the 11 days lost in 1753-ish? (varies between countries from 1753 to as late as 1923). The formula calculates the day number based on the rules of the Gregorian calendar. So it works for dates since 15 October 1582 (which followed directly after 4 October). For earlier dates (i.e. until 4 October 1582) a different formula (for the Julian calendar) has to be applied. If you want a different date for the switch between Julian and Gregorian calendar, for instance the one in 1752 when the British colonies (including the US) adopted the new system, the current formula will only work for dates since then. For earlier dates the Julian formula has to be used, just as mentioned above for dates until 4 October 1582. In simple words: there are two formulas, one for the rules according to the Julian calendar and another one for those of the Gregorian calendar. It's you choice when to switch from one to the other. The earliest possible date is 4...15 Oct 1582 because before that the new Gregorian system was not yet defined. Further reading (with both Julian and Gregorian formulas): Wikibooks (in German). Note: the Julian Day Number (JDN) and the value g() calculated by the formula in this thread differ by a constant offset of 1721120 (which is not required for date differences). Also the JDNs in the Wikibook formula may have a fractional part that represents the time, here 0,5 means midnight. Edit: for simple date differences only the g() formula is required. This turns a Gregorian date into a day number. For the Julian calendar the equivalent function j() is: Code: function j(y,m,d) As usual, all "/" are integer divisions. Check: g(1582,10,15) = 578041 j (1582,10, 4 ) = 578040 After y has been adjusted, the difference between both calendar systems is 2 – y/100 + y/400 days. Or y/100 – y/400 – 2 days, if you prefer positive numbers. That's the 11 days for a calendar switch in 1752, or 13 days today. Dieter |
|||
10-07-2018, 01:35 PM
Post: #11
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
Some interesting facts about the calendar ...
Why Julius calendar had leap year every third year ? Why August "stole" a day from February ? After New Year's day, the year might not change ... https://stevemorse.org/juliancalendar/julian.htm |
|||
10-08-2018, 06:40 AM
(This post was last modified: 10-08-2018 06:47 AM by brickviking.)
Post: #12
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
(10-07-2018 01:35 PM)Albert Chan Wrote: Some interesting facts about the calendar ...
(Post 303) Regards, BrickViking HP-50g |Casio fx-9750G+ |Casio fx-9750GII (SH4a) |
|||
10-08-2018, 07:29 AM
(This post was last modified: 10-08-2018 07:32 AM by Dieter.)
Post: #13
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
(10-08-2018 06:40 AM)brickviking Wrote: To the best of my knowledge, the Julian calendar system ended up with leap years every four years (thank Augustus for that), regardless of if the century could be divided by four or not. Regardless of the century being divisible by 100 (or 400) or not. Yes, this was the rule, but in the early years it was applied incorrectly: instead of a leap year after three common years it was a leap year every three years. It took several decades until the correct rule was in use. (10-08-2018 06:40 AM)brickviking Wrote: Given that the year actually started in March (not January like currently), this was not really considered an issue. They simply incremented the year in March (I believe). You can still see that in the names of the months: September, October, November and December are derived from the Latin septem = seven, octo = eight, novem = nine and decem = ten. Dieter |
|||
10-08-2018, 09:44 AM
(This post was last modified: 10-08-2018 09:45 AM by StephenG1CMZ.)
Post: #14
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
I had been told that the reason December was called Dec although it was the 12th month now was because Julius added a month, and then Augustus copied him and added another month - not that it was because years used to start in March.
If both are true, December should be called October. Stephen Lewkowicz (G1CMZ) https://my.numworks.com/python/steveg1cmz |
|||
10-08-2018, 11:01 AM
Post: #15
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
(10-08-2018 09:44 AM)StephenG1CMZ Wrote: I had been told that the reason December was called Dec although it was the 12th month now was because Julius added a month, and then Augustus copied him and added another month - not that it was because years used to start in March. Nobody added a month: quintilis became iulius (July) and sextilis became augustus (August). And maybe a day was added to augustus (taking it from february) to make it equal to iulius (uncertain). Hereabout the year started in march, since then comes spring, and a new beginning. Greetings, Massimo -+×÷ ↔ left is right and right is wrong |
|||
10-08-2018, 01:23 PM
(This post was last modified: 10-08-2018 01:26 PM by Albert Chan.)
Post: #16
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
(10-08-2018 09:44 AM)StephenG1CMZ Wrote: I had been told that the reason December was called Dec although it was the 12th month now was because Julius added a month, and then Augustus copied him and added another month - not that it was because years used to start in March. Based on https://stevemorse.org/juliancalendar/julian.htm There were indeed a time with ten months per year. (Romulus calendar, 753 BC) Later, Ianuarius, Februarius, Intercalarius (leap year month) were added (Numa calendar, 713 BC) Originally, the months added were after December, until around 450 BC. Numa calendar were shifted, with December as last month, just like today. |
|||
10-08-2018, 02:22 PM
(This post was last modified: 10-08-2018 02:23 PM by Thomas Okken.)
Post: #17
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
(10-08-2018 11:01 AM)Massimo Gnerucci Wrote: And maybe a day was added to augustus (taking it from february) to make it equal to iulius (uncertain). Uncertain? I always thought that this was known for certain, but I'll admit I'm no expert and not familiar with any primary sources. At least it's plausible because it explains the break in the pattern of alternating 31- and 30-day months, if you assume that August / Sextilis used to be 30 days, September 31, October 30, November 31, and December 30. Making August 31 days, and changing September through December in order to restore the alternation as much as possible, meant that one day had to be stolen from somewhere, since three months were changed from 30 days to 31, while only two months were changed from 31 days to 30. So February, which was already the odd one out at 29 days, ended up with only 28. If this isn't rigorously documented, I guess that's because the calendar that was being modified, the Julian calendar, hadn't been in force for all that long, so it wasn't like they were messing with ancient tradition -- Caesar had taken care of that already. |
|||
10-08-2018, 03:16 PM
(This post was last modified: 10-08-2018 03:17 PM by Massimo Gnerucci.)
Post: #18
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
(10-08-2018 02:22 PM)Thomas Okken Wrote:(10-08-2018 11:01 AM)Massimo Gnerucci Wrote: And maybe a day was added to augustus (taking it from february) to make it equal to iulius (uncertain). Plausible it came from February, I concur. But it seems the only source is Johannes de Sacrobosco's Computus. Greetings, Massimo -+×÷ ↔ left is right and right is wrong |
|||
10-08-2018, 08:46 PM
(This post was last modified: 10-08-2018 08:56 PM by Albert Chan.)
Post: #19
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
(10-07-2018 07:14 AM)Dieter Wrote: Check: Since Julian calendar "leap" faster, above two calendar systems must match in the past. Above 10 days gap implied 15th century, two systems are 9 days apart. Every 400 years to the past, two calendars are 3 days closer ... Thus, two calendar match in the 15 - 9/3 * 4 = 3rd century A.D. --> Trivia: From 3/1/0200 to 2/28/0300, g(date) == j(date) --> Year 201 to 299 (99 years), Julian calendar match Gregorian. Of course, this is just arithmetic. Back then, Gregorian calendar did not exist --- We can use above trivia to quickly find out days apart for X century: X = 3,4,5,6, 7,8,9,10, ... => days apart = 0,1,1,2, 3,4,4,5, ... Y = X - 3 (note: treat March 1, 100*(X-1) as start of century X) Days apart = 3 * floor(Y/4) + floor((Y % 4) * 2/3 + 0.5) For year 2018, Y = X - 3 = 21 - 3 = 18 Days apart = 3 * floor(18/4) + floor(11/6) = 3*4 + 1 = 13 (match above quote) For Julian Day Number 0 (Julian date: Jan 1, 4713 B.C.) year = 1 - 4713 = -4712 Y = X - 3 = -47 - 3 = -50 Days apart = 3 * floor(-50/4) + floor(11/6) = -39 + 1 = -38 So, JDN of 0 correspond to Gregorian date of Nov 24, 4714 B.C (shorted 7+31 days) |
|||
10-08-2018, 09:13 PM
Post: #20
|
|||
|
|||
RE: days-between-dates Solver equation for 17b
(10-08-2018 08:46 PM)Albert Chan Wrote: We can use above trivia to quickly find out days apart for X century: Excuse me if I don't get the point here, but... what's wrong with the shorter and less complicated standard formula for the Julian-Gregorian difference? Quote:...y/100 – y/400 – 2 days So for year –4712 that's simply –48 – (–12) – 2 = –38. Just asking. ;-) Dieter |
|||
« Next Oldest | Next Newest »
|
User(s) browsing this thread: 5 Guest(s)