Calendar Functions Script
Webb - all rights reserved - ©2004
Author - David Winslow

Summary: Days between dates, Day of the week, and more...

Instructions: I am indebted to my old HP-67 for this
program. I added a "^Shift" button
and some advanced functionality to the
version that came with the HP-67 in the
standard pack. But, the algorithms come
straight from the manual for this great
old calculator.

===>The RPN 2.56 "User Interface"<===

|   DT1    DT2    |
| #Days  #Wks.Dys |
| ^Shift DT->DOW  |


The idea is that you can enter two dates
and then calcuate the number of days
between them (or the number of weeks and
days). Or, you can enter a date and a
number of days (or a number of weeks and days)
and calculate the future or past date. Or you
can enter a date and calculate the day of the

Example 1: 7.191999 DT1 12.251999 DT2 #Days

The sequence in Example 1 calculates that
there are 159 days between July 19, 1999 and
December 25, 1999.

Example 2: #Wks.Dys

This example continues from the first example.
22.5 is displayed indicating that there are 22
weeks and 5 days between July 19, 1999 and
December 25, 1999.


   When entering a date, be sure that you
   always input TWO digits for the day. e.g.,
   7.022002 for July 2, 2002 and NOT 7.22002.
   When entering a number of weeks and days you
   enter the number of weeks, followed by the
   decimal point, followed by the number of days.

Example 3: 7.191999 DT1 159 #Days DT2

In this example, you want to know what the date
will be in 159 days if the given date is
7/19/1999. Of course, the answer is 12/25/1999.

Example 4: 7.191999 DT2 159 #Days DT1

In this example, you want to know what the date
was 159 days ago if the given date is 7/19/1999.
The answer is 2/10/1999.

NOTE: To calculate a date a given number
of days in the past, enter the date with DT2
and then enter the days with #Days and then
press DT1.

To calculate a date a given number of days in
the future, enter the date with DT1 and then
enter the days with #Days and then press DT2.

Example 5: 12.251999 DT->DOW

Christmas in 1999 falls on Saturday.


The program is always in one of three "modes":
"recall mode", "input mode", or "calculate mode".

By pressing the numbers and decimal point you
put the program into "input mode" so that when
DT1, DT2, #Days, or #Wks.Dys is pressed the input
is "stored". Also, and this is important, the
program mode switches to the "calculate mode".
Assuming there are enough "inputs" (AND THERE
BETTER BE because no checking is done!) another
press of DT1, DT2, #Days, or #Wks.Dys will
calculate that key based on the stored
information in the other keys and put the program
back into "input mode". When a calculation is
done, the calculation is also stored for later
retrieval via the ^Shift key.


   input mode => DT1, DT2, #Days, or #Wks.Dys =>
   calculate mode => DT1, DT2, #Days, or #Wks.Dys
   => input mode

Pressing the ^Shift key puts the program in
"recall mode" and then pressing DT1, DT2,
#Days, #Wks.Dys or DT->DOW will recall the last
input and put the program in "input mode".

DT-DOW is a little different - as long as there
is a valid date on the top of the stack, DT-DOW
will store and calculate the day of the week.
^Shift DT-DOW will recall the last date stored
by this key.

The program "remembers" if #Days or #Wks.Dys was
pressed last. Calculation is done with whatever
was input last.

With this information in mind, let's do some
"advanced" examples:

Example 6: 7.191999 DT1 1.0 #Wks.Dys DT2 DT1 DT2

The stack will be tos=8.091999 8.021999 7.261999
1 7.1999. You can see what the date will be 3
weeks, 2 weeks, and 1 week from 7/19/1999.

Because a calculation throws the program
into "input" mode, "chaining" is possible.

===>FINAL EXAM<===

You arrive in Tokyo, Japan on 8/02/1999.
You know that you will stay 17 days
in Tokyo. Then, you will go to Nara for 13 days.
Then, you will go to Osaka for 2 weeks and 2
days. Compute the arrival date and day for each
city. And, what date and day will you leave?


8.021999 DT->DOW    (Arrive on Monday in Tokyo)
DT1 17 #Days DT2    (Arrive on 8/19/1999 in Nara)
DT->DOW             (on Thursday)
DT1 13 #Days DT2    (Arrive on 9/01/1999 in Osaka)
DT->DOW             (on Wednesday)
DT1 2.2 #Wks.Dys DT2(Depart on 9/17/1999)
DT->DOW             (a Friday)


To compute the Julian Day number from the date:

Julian Day number =
INT(365.25y') + INT(30.6001 m') + d + 1,720,982

  y' = year-1 if m = 1 or 2 OR year if m > 2.
  m' = month+13 if m=1 or 2 month+1 if m > 2

Then, the days between dates is found by

Days = Julian Day number 2 - Julian Day number 1

To compute the date from a Julian Day number:

Day # = Julian Day number - 1,720,982

y' = INT[(Day # - 122.1)/365.25]

*The Julian Day number is an astronomical
convention representing the number of days since
January 1, 4713 B.C.

m' = INT[(Day # - INT(365.25 y'))/30.6001]

Day of the month = D =
Day # - INT [365.25 y'] - INT [30.6001 m']

The Month = M =
m' - 13 if m' = 14 or 15 OR m' - 1   if m' < 14

The Year = Y =
y' if M > 2 OR y' + 1 if M = 1 or 2
To compute the day of the week:

Day of the week = 7 x FRAC [(Day # + 5)/7]
0=Sunday, 1=Monday etc ...


According to my HP-67 manual, this algorithm is
good for dates from March 1, 1900 through
February 28, 2100.


RPN.2.z+3 \Calendar functions



[d] g1g1g1g1xo1+X@wxo3+X


[c] xk5+x@xs1=0(xl:xmw7*x

[s] Ca-Xuxu#'122.1'-Cf/wXvx

\shift mode
\not Shift mode, go on
\input mode
\calculate mode

\shift mode
\not shift mode, go on
\input mode
\calculate mode

[k] xz1=0(xp0Xz.:)

{b} Vv#'21'<(1Xx:);

"Calendar functions"