[DM15] Date manipulation
Posted: Sat Jun 29, 2019 9:40 am
Here are a few functions for the HP15C/DM15 that allow you to manipulate dates.
Dates are represented in "dd.mmyyyy" format if flag 0 is clear, or "mm.ddyyyy" format if flag 0 is set.
Before using any of the below functions, run "[GSB] .0" to initialise a few constants used throughout.
[A] converts a date in dd.mmyyyy (or mm.ddyyyy if F? 0) format into its Julian date number
[ B ] does the opposite of [A] by taking a Julian date number and converting it to dd.mmyyyy (or mm.ddyyyy) format
[C] takes a date in dd.mmyyyy (or mm.ddyyyy) format and gives you the day of the week from 0 (Sunday) to 6 (Saturday)
[D] takes a number of days (e.g. the difference between two Julian date numbers) and expresses it in weeks and days as ww.d
[E] does the opposite of [D] by taking a number of weeks and days ww.d and expressing it in days
Note that registers R0 to R6 are used in these functions and Flag 0 determines whether dates are interpreted/returned in dd.mmyyyy (clear) or mm.ddyyyy (set) format.
The Julian date number of a date is an integer that identifies the date in time. The progression is linear, so a date that is 'n' days in the future or the past from now has a Julian date number that is greater or smaller than today's Julian date number by 'n'.
To calculate the Julian date number of the date d/m/y (or m/d/y for our American cousins):
If m is 1 or 2:
Let Y' = y  1 and let M' = m + 13
If m is 3 or greater:
Let M' = m + 1 and let Y' = y
Julian date number J = int(Y' x 365.25) + int(M' x 30.6001) + d + 1720982
To perform the reverse operation and get the "normal" date from a Julian date number:
Let J' = J  1720982
Y' = int( (J'  122.1) / 365.25 )
M' = int( (J'  int(Y' x 365.25)) / 30.6001 )
d = J'  int(M' x 30.6001)  int(Y' x 365.25)
if M' is 13 or lower:
m = M'  1 and y = Y'
if M' is 14 or 15:
m = M'  13 and y = Y' + 1
The day of the week is:
DOW = (J' + 5) MODULO 7
Examples:
I'm European so I'll be using dd/mm/yyyy format throughout. If you'd rather use mm/dd/yyyy then just make sure you set flag 0.
Run [GSB] .0 before using any of these programs:
What is today's Julian date number (store the result in R7 so we can use it again):
How many days is it until Christmas this year?
Christmas is 179 days off. What's that in weeks and days?
That's 25 weeks and 4 days away.
What day of the week was Christmas last year?
It was a Tuesday. How long ago was that?
It was 186 days ago, or 26 weeks and 4 days.
I just replaced the battery in a calculator that I hardly ever use. It has a capacity of 220mAh and the calculator sucks 6μA out of it when switched off. Assuming the battery just keeps on going until it's flat and then cuts out and assuming I never actually use the calculator again, on what date will the battery die?
Step 1  find out how many days the battery is good for:
The battery is good for 1527 days. What date does that bring us to?
So, I should replace the battery before the 3rd of September 2023.
Just to be on the safe side I'll do that, say, 12 weeks before. What date is 12 weeks before 3/9/2023?
Answer: 11th June 2023.
Dump:
Listing:
Dates are represented in "dd.mmyyyy" format if flag 0 is clear, or "mm.ddyyyy" format if flag 0 is set.
Before using any of the below functions, run "[GSB] .0" to initialise a few constants used throughout.
[A] converts a date in dd.mmyyyy (or mm.ddyyyy if F? 0) format into its Julian date number
[ B ] does the opposite of [A] by taking a Julian date number and converting it to dd.mmyyyy (or mm.ddyyyy) format
[C] takes a date in dd.mmyyyy (or mm.ddyyyy) format and gives you the day of the week from 0 (Sunday) to 6 (Saturday)
[D] takes a number of days (e.g. the difference between two Julian date numbers) and expresses it in weeks and days as ww.d
[E] does the opposite of [D] by taking a number of weeks and days ww.d and expressing it in days
Note that registers R0 to R6 are used in these functions and Flag 0 determines whether dates are interpreted/returned in dd.mmyyyy (clear) or mm.ddyyyy (set) format.
The Julian date number of a date is an integer that identifies the date in time. The progression is linear, so a date that is 'n' days in the future or the past from now has a Julian date number that is greater or smaller than today's Julian date number by 'n'.
To calculate the Julian date number of the date d/m/y (or m/d/y for our American cousins):
If m is 1 or 2:
Let Y' = y  1 and let M' = m + 13
If m is 3 or greater:
Let M' = m + 1 and let Y' = y
Julian date number J = int(Y' x 365.25) + int(M' x 30.6001) + d + 1720982
To perform the reverse operation and get the "normal" date from a Julian date number:
Let J' = J  1720982
Y' = int( (J'  122.1) / 365.25 )
M' = int( (J'  int(Y' x 365.25)) / 30.6001 )
d = J'  int(M' x 30.6001)  int(Y' x 365.25)
if M' is 13 or lower:
m = M'  1 and y = Y'
if M' is 14 or 15:
m = M'  13 and y = Y' + 1
The day of the week is:
DOW = (J' + 5) MODULO 7
Examples:
I'm European so I'll be using dd/mm/yyyy format throughout. If you'd rather use mm/dd/yyyy then just make sure you set flag 0.
Run [GSB] .0 before using any of these programs:
Code: Select all
[GSB] .0 => 1,720,982.000
Code: Select all
29.062019 [GSB] [A] => 2,458,664.000
[STO] 7
Code: Select all
25.122019 [GSB] [A] => 2,458,843.000
[RCL] [] 7 => 179.0000
Code: Select all
[GSB] [D] => 25.4000
What day of the week was Christmas last year?
Code: Select all
25.122018 [GSB] [C] => 2.0000
Code: Select all
25.122018 [GSB] [A] [RCL] 7 [x<>y] [] => 186.0000
[GSB] [D] => 26.4000
I just replaced the battery in a calculator that I hardly ever use. It has a capacity of 220mAh and the calculator sucks 6μA out of it when switched off. Assuming the battery just keeps on going until it's flat and then cuts out and assuming I never actually use the calculator again, on what date will the battery die?
Step 1  find out how many days the battery is good for:
Code: Select all
220 [EEX] [CHS] 3 [ENTER] 6 [EEX] [CHS] 6 [÷] => 36,666.6667
24 [÷] [g] [INT] => 1,527.0000
Code: Select all
[RCL] 7 [+] => 2,460,191.000
[STO] 8 (we'll want this for later)
[GSB] [B] [f] [PREFIX] => 3092023000
Just to be on the safe side I'll do that, say, 12 weeks before. What date is 12 weeks before 3/9/2023?
Code: Select all
12 [GSB] [E] [RCL] 8 [x<>y] []
[GSB] [B] [f] [PREFIX] => 1106202300
Dump:
Code: Select all
DM15_M1B
04 000000fffff000 00000000000008 0000000000000c 0000000001eeae
08 00000000000000 2faf8befbe2280 00000000000000 00000000000000
14 00000000000000 1b2d2d2d2d2d2d 000000000006e3 00000000000000
18 00000000000000 0000000000007f 00000000a00000 00000000000000
e0 00000000000000 00000000000000 00000000000000 00b283cffdf0f1
e4 fbfcf73353efeb fdf7430eb2fafc f0f1a3c5fcf7eb c10db2ebfaf5c0
e8 fcf7a3fdf7faf5 240cb283cfc483 dffdf2c6c550ff 353443fdf6c636
ec 0375ef0213a296 efa5dfc512ed35 f3f144fbc533fa ebc0cf36ebc1cf
f0 45ebe1cfc3a3cf ebc0cf46ebe0cf fbf1c0f2f2f143 05a2cf0bb283cf
f4 3483dfebc1cf35 43ebc0cf360185 dff3f176ef0011 a295ef10ed35f2
f8 46fcf4c6a3c496 c49350ff97f5eb c1fcf2c6a3c445 44ebc104b282cf
fc 240ab242f2f8f9 f0f2f7f141f1f0 f0f6c0f0f340f5 f2c0f5f6f300ff
A: 000000fffff000 B: 000000fffff000 C: 0000000001eeae
S: 00000000000000
M: 000000fffff000 N: 00000000000000 G: 04
Code: Select all
LBL .0
365.25
STO 0
30.6001
STO 1
1720982
STO 2
RTN
LBL A
GSB 4
RCL+ 2
RTN
LBL 4
ENTER
INT
STO 4
STO 5
R↓
FRAC
EEX
2
×
ENTER
INT
5
STO I
F? 0
DSE I
R↓
STO (i)
R↓
FRAC
EEX
4
×
STO 6
2
RCL 5
x≤y
GTO 0
ISG 5
CLx
GTO 1
LBL 0
DSE 6
13
STO+ 5
LBL 1
RCL 6
RCL× 0
INT
STO 3
RCL 5
RCL× 1
INT
STO+ 3
RCL 4
RCL+ 3
RTN
LBL B
RCL 2
LBL 5
STO 3
122.1

RCL÷ 0
INT
STO 6
RCL× 0
INT
RCL 3
CHS
RCL÷ 1
INT
STO 5
RCL× 1
INT
RCL 6
RCL× 0
INT
+
RCL 3
x<>y

STO 4
13
RCL 5
x≤y
GTO 2
x<>y
STO 5
ISG 6
CLx
GTO 3
LBL 2
DSE 5
LBL 3
RCL 6
EEX
6
÷
STO 3
RCL 4
RCL 5
F? 0
x<>y
EEX
2
÷
STO+ 3
R↓
RCL+ 3
RTN
LBL C
GSB 4
5
+
7
÷
FRAC
7
×
.5
+
INT
RTN
LBL E
ENTER
INT
7
×
x<>y
FRAC
10
×
+
RTN
LBL D
STO 3
7
÷
INT
x<> 3
RCL 3
7
×

10
÷
RCL+ 3
RTN