Date Functions
05-08-2014, 12:49 PM (This post was last modified: 05-08-2014 12:50 PM by Thomas_Sch.)
Post: #1
 Thomas_Sch Senior Member Posts: 391 Joined: Dec 2013
Date Functions
for missing date functions have a look at
http://forum.hp-prime.de/discussion/100/...ime#Item_7
"Datumsfunktionen für HP Prime" by Wolfgang, (in german)
09-19-2014, 05:55 PM (This post was last modified: 09-19-2014 07:53 PM by Wolfgang.)
Post: #2
 Wolfgang Member Posts: 53 Joined: Jun 2014
RE: Date Functions
Here the Date functions.

Wolfgang

I'm very sorry: you'll need this too: DF.TXT
1st please compile DF, 2nd compile DTFX
Wolfgang

Attached File(s)
DTFX.txt (Size: 14.49 KB / Downloads: 79)
DF.txt (Size: 1.21 KB / Downloads: 55)

HP 33C 34C 11C 41CX 12C 15C HP71B 35s 50g Prime Rev. A, C, D. DM 41X, 42. TI 58C, 59, 74, 92-II, Voyage 200, nspire CX II-T, Sanyo ICC 82D and more
01-14-2015, 10:17 PM
Post: #3
 Wolfgang Member Posts: 53 Joined: Jun 2014
RE: Date Functions
Here is a newer 'all in one' programm hull

Code:
 #pragma mode( separator(.,;) integer(h32) ) // //________________________________________________________________________________​__________  // AUTHOR: Wolfgang Kühn, Berlin, June 2014 // Version 1.2 // DFX is a multi functions program for HP PRIME simulating // the HP50g's date functions DDAYS and Date+ (HP Prime = DPLUS). // In addition there are further functions like JDN, N2J, DOW, CALD, DOE. // DFX functions are designed to CALL THEM FROM CAS and HOME ENVIRONMENT, // and via choosing prog functions with Softmenu-keys DTM! // Caution: DESIGN of INPUT-SCREENS is bad. // Algorithms and formulas are astronomical basics found in sources like // - General Astronomy, H.Spencer Jones, London 1924 // - Berechnungsgrundlagen für Amateurastronomen, Otto Praxl or // - Astronomical Algorithms, Jean Meeus or // - Practical Astronomy with your Calculator, Duffet-Smith and Zwart, // ...and others..... //   New:   extended range for date now from January,1,-4712 to December,31,99999  //      6 output date display formats triggered by user selectable global variable //      2 input date display formats, //      input check // any errors, questions, hints, // mailto: Wolfgang Kuehn <wolfgang.kuehn@vodafone.de> //________________________________________________________________________________​_________ // // //________________________________________________________________________________​_________  // AUTHOR: Wolfgang Kühn, Berlin, April 2014 // Version 1.1 // DF is a program for HP PRIME setting the system variable for  // triggering the Date I/O Format //                        DFT // D.MY                 I/O,   Standard,   e.g.    21.062014    // D.MY  day number      O                        "21.062014  6"   // D.MY  day text        O                        "21.062014 SAT"  // // M.DY  day number      O                         6.212014       // M.DY  day number      O                        "6.212014  6"    // M.DY  day text        O                        "6.212014  SAT"    // // Y.MD  day number      O                         2014.0621    // Y.MD  day number      O                        "2014.0621  6"    // Y.MD  day text        O                        "2014.0621  SAT"   //________________________________________________________________________________​________ // // EXPORT DFT; EXPORT DF() BEGIN CHOOSE( DFT, "date format", "D.MY", "D.MY  day number", "D.MY  day text", "M.DY", "M.DY  day number", "M.DY  day text", "Y.MD", "Y.MD  day number", "Y.MD  day text" ); RETURN DFT; END; //________________________________________________________________________________​_________ // // // //________________________________________________________________________________​_________ // JDN (Julian Date Number) Function for HP Prime // Version 0.95, April 2014 // Wolfgang Kuehn <wolfgang.kuehn@vodafone.de> //  // Julian Date Number: Returns the Julian Date Number of an calendaric date  // Range of allowable dates is from October, 15, 1582 to December 31, 9999 // CAS & Home @ algebraic and textbook mode: JDN(D,M,Y) // example1 JDN(1,1,2000) returns 2451545 // example2 JDN(17,3,2014) returns 2456734 // example3 JDN(17,3,2014) - JDN(1,1,2000) returns 5189 // CAUTION: @this version there is no recycling of input errors EXPORT JDN(D, M, Y) BEGIN    IF M <3 THEN          RETURN FLOOR(365.25*(Y-1))+FLOOR(30.6001*(M+13))+FLOOR(((Y-1)/400))-FLOOR(((Y-1)/100))+1720997+D;    ELSE          RETURN FLOOR(365.25*Y)+FLOOR(30.6001*(M+1))+FLOOR((Y/400))-FLOOR((Y/100))+1720997+D;          END; END; //________________________________________________________________________________​________________ // // // //________________________________________________________________________________​________________ // N2J (Number Date to Julian Date Number)  // Version 0.96, April 2014 // Wolfgang Kuehn <wolfgang.kuehn@vodafone.de> //  // Number Date to JDN: Returns the Julian Date Number of an calendaric number date  // Range of allowable dates is from January 1, -4712 to December 31, 9999 // CAS & Home @ algebraic and textbook mode: N2J([-]dd.mmyyyy) // negative number date means B.C. !! // Example 1 N2J(14.052004) returns 2453140 // Example 2 N2J(1.012000) returns  2451545  // Example 3 N2J(17.032014)-N2J(1,012) returns 5189 // Example 4 N2J(4.101582) returns 2299160 // Example 5 N2J(15.101582) returns 2299161 // Example 6 N2J(-1.014712) returns 0 // Note: @this version some input errors (e.g. limits of range) are checked // EXPORT N2J(nd) BEGIN LOCAL D,M,Y; // nd in forbidden range    CASE       IF nd= 5.101582 THEN MSGBOX("Date between 5.101582 and 14.101582 not allowed, sorry!"); KILL;END;       IF nd= 6.101582 THEN MSGBOX("Date between 5.101582 and 14.101582 not allowed, sorry!"); KILL;END;       IF nd= 7.101582 THEN MSGBOX("Date between 5.101582 and 14.101582 not allowed, sorry!"); KILL;END;       IF nd= 8.101582 THEN MSGBOX("Date between 5.101582 and 14.101582 not allowed, sorry!"); KILL;END;       IF nd= 9.101582 THEN MSGBOX("Date between 5.101582 and 14.101582 not allowed, sorry!"); KILL;END;       IF nd= 10.101582 THEN MSGBOX("Date between 5.101582 and 14.101582 not allowed, sorry!");KILL;END;       IF nd= 11.101582 THEN MSGBOX("Date between 5.101582 and 14.101582 not allowed, sorry!");KILL;END;       IF nd= 12.101582 THEN MSGBOX("Date between 5.101582 and 14.101582 not allowed, sorry!");KILL;END;       IF nd= 13.101582 THEN MSGBOX("Date between 5.101582 and 14.101582 not allowed, sorry!");KILL;END;       IF nd= 14.101582 THEN MSGBOX("Date between 5.101582 and 14.101582 not allowed, sorry!");KILL;END;    END; // // nd is B.C. //    IF nd < 0 THEN    nd:=nd*-1;    D:=IP(nd);    M:=IP(((nd-D)*100));    Y:=((FP(((nd-D)*100))*10000)*-1);          IF M <3 THEN             RETURN FLOOR(365.25*(Y-1))+FLOOR(30.6001*(M+13))+(-2)+1720997+D;          ELSE             RETURN FLOOR(365.25*Y)+FLOOR(30.6001*(M+1))+(-2)+1720997+D;          END;       ELSE // CASE nd is positive    D:=IP(nd);    M:=IP(((nd-D)*100));     Y:=(FP(((nd-D)*100))*10000); // Date < 15.10.1582       IF JDN(D,M,Y) <2299161 THEN             IF M <3 THEN             RETURN FLOOR(365.25*(Y-1))+FLOOR(30.6001*(M+13))+(-2)+1720997+D;             ELSE             RETURN FLOOR(365.25*Y)+FLOOR(30.6001*(M+1))+(-2)+1720997+D;             END; // Date >15.10.1582 positive          ELSE             IF M <3 THEN             RETURN FLOOR(365.25*(Y-1))+FLOOR(30.6001*(M+13))+FLOOR(((Y-1)/400))-FLOOR(((Y-1)/100))+1720997+D;          ELSE             RETURN FLOOR(365.25*Y)+FLOOR(30.6001*(M+1))+FLOOR((Y/400))-FLOOR((Y/100))+1720997+D;                   END;          END;       END; END; //________________________________________________________________________________​______________________________ // // // //________________________________________________________________________________​______________________________ // DOW Function (Day of Week) for HP Prime // Version 0.96, April 2014 // Wolfgang Kuehn <wolfgang.kuehn@vodafone.de> //  // DOW Function: Returns the day of a week from 1(=Monday) to 7(=Sunday) // CAS & Home @ algebraic and textbook mode: DOW(dd.mmyyyy) // example1 DOW(5.042014) returns [6 (=Saturday)] "SAT" // example2 DOW(8.051945) returns [2 (=Tuesday)] "TUE" //  //________________________________________________________________________________​______________________________ //  EXPORT DOW(edn) BEGIN LOCAL tag; tag:=FLOOR(N2J(edn)MOD7)+1; IF DFT = 2 THEN RETURN tag;END; IF DFT = 5 THEN RETURN tag;END; CASE     IF tag = 1 THEN RETURN "MON"; END;     IF tag = 2 THEN RETURN "TUE"; END;     IF tag = 3 THEN RETURN "WED"; END;     IF tag = 4 THEN RETURN "THU"; END;     IF tag = 5 THEN RETURN "FRI"; END;     IF tag = 6 THEN RETURN "SAT"; END;     IF tag = 7 THEN RETURN "SUN"; END; END; END; //________________________________________________________________________________​___________________________ // // // //________________________________________________________________________________​____________________________ // CALD (Calendaric Date) Function for HP Prime // Version 0.95, April 2014 // Wolfgang Kuehn <wolfgang.kuehn@vodafone.de> //  // CALD Function: Returns the calendaric date of a Julian Date Number // Range of allowable JDN'S is from January,1,-4712 (JDN=0) to December 31, 9999 (JDN=5373484) // // CAS & Home @ algebraic and textbook mode: CALD(jdn) // RPN mode: jdn >ENTER< CALD >ENTER< // // example1 CALD(2456737) returns 20.032014      HP50g european format DD.MMYYYY // example2 CALD(2456737) returns 3.202014       HP50g american format MM.DDYYYY // example3 CALD(2456737) returns 20,3,2014 THU  advanced HP12C Format i.o. weekdaynumber-->weekday // // negative:   example 4a HP50g:               CALD(2451545) returns   1.012  // better:      example 4b advanced HP12C form:      CALD(2451545) returns   "1,1,2000 SAT"   // + + + + + + + + + Standard Return Date Format is DD.MMYYYY + + + + + + + + +  //------------------------------------------------------------------------------------------------------- EXPORT CALD(jdn) BEGIN LOCAL a,b,c,d,e,f; LOCAL D,M,Y; LOCAL edn; IF jdn>5373484             THEN MSGBOX("jdn > 5373484, sorry!");             KILL;END; IF jdn<0             THEN MSGBOX("jdn < 0, sorry!");             KILL;END;    IF jdn<2299161     THEN       a:= FLOOR(jdn+0.5);       c:= a+1524.0;       d:= FLOOR(((c-122.1)/365.25));       e:= FLOOR(365.25*d);       f:= FLOOR(((c-e)/30.6001));       D:=c-e-(FLOOR(30.6001*f));       M:=f-1-(12*FLOOR(f/14));       Y:=d-4715-FLOOR((7+M)/10);          IF jdn<1721058                  THEN                   edn:=-1*(D+M/100+((Y*-1)/1000000));          CASE       IF DFT = 0 THEN RETURN edn; END;       IF DFT > 6 THEN RETURN edn; END;                     IF DFT = 1 THEN RETURN edn; END;                     IF DFT = 2 THEN RETURN edn+" "+DOW(edn);END;                     IF DFT = 3 THEN RETURN edn+" "+DOW(edn);END;                     IF DFT = 4 THEN RETURN -1*(M+D/100+((Y*-1)/1000000)); END;                     IF DFT = 5 THEN RETURN -1*(M+D/100+((Y*-1)/1000000))+"  "+DOW(edn);END;                     IF DFT = 6 THEN RETURN -1*(M+D/100+((Y*-1)/1000000))+" "+DOW(edn);END;             END;END;          edn:=D+M/100+Y/1000000;          CASE                IF DFT = 0 THEN RETURN edn; END;       IF DFT > 6 THEN RETURN edn; END;                     IF DFT = 1 THEN RETURN edn; END;                     IF DFT = 2 THEN RETURN edn+" "+DOW(edn);END;                     IF DFT = 3 THEN RETURN edn+" "+DOW(edn);END;                     IF DFT = 4 THEN RETURN M+D/100+Y/1000000; END;                     IF DFT = 5 THEN RETURN M+D/100+Y/1000000+"  "+DOW(edn);END;                     IF DFT = 6 THEN RETURN M+D/100+Y/1000000+" "+DOW(edn);END;            END;END;              a:= FLOOR(jdn+0.5);          b:= FLOOR((a-1867216.25)/36524.25);          c:= a+b-(FLOOR(b/4))+1525;          d:= FLOOR(((c-122.1)/365.25));          e:= FLOOR(365.25*d);          f:= FLOOR(((c-e)/30.6001));          D:=c-e-(FLOOR(30.6001*f));          M:=f-1-(12*FLOOR(f/14));          Y:=d-4715-FLOOR((7+M)/10);          edn:=D+M/100+Y/1000000;             CASE       IF DFT = 0 THEN RETURN edn; END;       IF DFT >6 THEN RETURN edn; END;       IF DFT = 1 THEN RETURN edn; END;       IF DFT = 2 THEN RETURN edn+" "+DOW(edn);END;       IF DFT = 3 THEN RETURN edn+" "+DOW(edn);END;       IF DFT = 4 THEN RETURN M+D/100+Y/1000000;END;       IF DFT = 5 THEN RETURN M+D/100+Y/1000000+"  "+DOW(edn);END;       IF DFT = 6 THEN RETURN M+D/100+Y/1000000+" "+DOW(edn);END;             END;          END; //________________________________________________________________________________​_________________________________ // // // //________________________________________________________________________________​_________________________________ // // DDAYS Function for HP Prime // Version 0.96, April 2014 // Wolfgang Kuehn <wolfgang.kuehn@vodafone.de> //  // Delta Days Function: Returns the number of days between two dates // Caution: Change according to HP 50g, WP 34s: // If the 1st date (edn1) is chronologically later the result is negative //  // Range of allowable dates is from January 1, -4712 to December 31,9999 // CAS & Home @ algebraic and textbook mode: DDAYS(edn1,edn2) // example1 DDAYS(1.012,17.032014)      returns 5189 // example2 DDAYS(14.101962,1.061926)   returns -13284 // example3 DDAYS(15.101582,4.101582)   returns -1 // example4 DDAYS(1.012014,1.010)       returns -735601 // example5 DDAYS(1.010,-31.120001)       returns -1 // example6 DDAYS(-1.014712,-31.124711) returns 730     // example7 DDAYS(-1.014712,31.129999)  returns 5373484 //________________________________________________________________________________​_________________________________ // EXPORT DDAYS(edn1, edn2) BEGIN LOCAL xdays; xdays:=N2J(edn2)-N2J(edn1); RETURN xdays; END; //________________________________________________________________________________​_________________________________ // // // //________________________________________________________________________________​_________________________________ // DPLUS(HP 50g: DATE+) Function (Date Addition Command) for HP Prime // Version 0.96, April 2014 // Wolfgang Kuehn <wolfgang.kuehn@vodafone.de> //  // DPLUS Function: Returns a future or past date, given a date and a number of days // Range of allowable dates is from October, 15, 1582 to December 31, 9999 // CAS & Home @ algebraic and textbook mode: DPLUS(dd.mmyyyy,xdays) // // example1 DPLUS(1.012,5189)    returns 17.032014 // example2 DPLUS(14.101962,-13284)    returns 1.061926 // example3 DPLUS(-1,014712,1)    returns -2.014712 // example4 DPLUS(1.012014,7)    returns 8.014712 //++++++++++ Output: standard date form is dd.mmyyyy +++++++++++++++++++++ // //________________________________________________________________________________​__________________________________ // // EXPORT DPLUS(edn,xdays) BEGIN RETURN CALD((N2J(edn)+xdays)); END; //________________________________________________________________________________​___________________________________ // // // //________________________________________________________________________________​____________________________________ // DOE (Date of Easter)  // Version 0.99, June 2014 // modified gaussian function for calculus of date of easter // TEXOUT_P instead of PRINT   // Example 1 DOE(2004) returns // Jahr: 2004 // Rosenmontag: 23.022004 MON // Ostersonntag: 11.042004 SUN // CHr.Himmelfahrt: 20.052004 THU // Pfingsten: 30.052004 SON // Fronleichnam: 10.062004 THU EXPORT DOE(yoe) BEGIN // ROSMON -48 // CHRIHIM +39 // PFING +49 // FRONLEI +60 LOCAL ODAT,ROSMON,CHRIHIM,PFING,FRONLEI; LOCAL a,b,c,d,e,f,g; LOCAL h,i,k,l,m,n,p;    a:=irem(yoe,19);    b:=iquo(yoe,100);    c:=irem(yoe,100);    d:=iquo(b,4);    e:=irem(b,4);    f:=iquo(b+8,25);    g:=iquo(b-f+1,3);    h:=irem(19*a+b-d-g+15,30);    i:=iquo(c,4);    k:=irem(c,4);    l:=irem(32+2*e+2*i-h-k,7);    m:=iquo(a+11*h+22*l,451);    n:=iquo(h+l-7*m+114,31);    p:=irem(h+l-7*m+114,31)+1; //    ODAT:=CALD(JDN(p,n,yoe));    ROSMON:=CALD(JDN(p,n,yoe)-48);    CHRIHIM:=CALD(JDN(p,n,yoe)+39);    PFING:=CALD(JDN(p,n,yoe)+49);    FRONLEI:=CALD(JDN(p,n,yoe)+60); // // RECT(); TEXTOUT_P("Jahr:",0,2,0); TEXTOUT_P("Rosenmontag:",0,22,0); TEXTOUT_P("Ostersonntag:",0,42,0); TEXTOUT_P("Chr. Himmelf.:",0,62,0); TEXTOUT_P("Pfingsten:",0,82,0); TEXTOUT_P("Fronleichnam:",0,102,0); TEXTOUT_P(yoe,120,2,0,#000000,130,#FFFFFF); TEXTOUT_P(ROSMON,120,22,0,#000000,130,#FFFFFF); TEXTOUT_P(ODAT,120,42,0,#000000,130,#FFFFFF); TEXTOUT_P(CHRIHIM,120,62,0,#000000,130,#FFFFFF); TEXTOUT_P(PFING,120,82,0,#000000,130,#FFFFFF); TEXTOUT_P(FRONLEI,120,102,0,#000000,130,#FFFFFF); WAIT(-1); // RETURN ODAT; END; // // // //________________________________________________________________________________​_____________________________ // // DT2DN Date to Day Number // nd numberdate (dd.mmyyyy), Leafyear y/n? (0 or 1) // example DT2DN(29.112014,0) returns 333 // WMWK 2014-11-12 // EXPORT DT2DN(nd,L) BEGIN LOCAL D,M;        D:=IP(nd);    M:=IP(((nd-D)*100)); //   Y:=((FP(((nd-D)*100))*10000)); CASE       IF M <3 THEN RETURN IP((M-1)*(63-L)/2)+D;END;       IF M >2 THEN RETURN  D+(IP((M+1)*30.6)-(63-L)); END; END; END; //________________________________________________________________________________​_______________________________ // // DMS(ddd.mmss) // sexagesimal 2 decimal EXPORT DMS(dms) BEGIN LOCAL D,M,S,t;  D:=IP(dms);  M:=IP(((dms-D)*100));  S:=FP((dms-D)*100)*100; IF D==0 THEN t:=1;  ELSE t:=SIGN(D); END; RETURN (ABS(D)+ABS(M/60)+ABS(S/3600))*t; END;  //________________________________________________________________________________​________________________________ // // HMS(ddd.dddd) // decimal 2 sexagesimal  EXPORT HMS(ddeg) BEGIN LOCAL H,M,S; H:=IP(ddeg);    M:=IP(((ddeg-H)*60));     S:=(((ddeg-H)*60)-M)*60; RETURN H+M/100+S/10000; END;  //________________________________________________________________________________​________________________________ //AN2J Astronomical Number date including time (UTC!) to Julian date //look at N2J //usage: AN2J(DD.MMYYYY,hh.mmss)  // IMPORTANT: Enter time in degrees! // Enter UTC! //Example: AN2J(13.112014,18.2045) returns 2456975.26441 - decimal output // EXPORT AN2J(nd,tim) BEGIN RETURN N2J(nd)+(DMS(tim)/24)-0.5; END; // //________________________________________________________________________________​________________________________ // // AJ2N Astronomical Julian Date including time (UTC!) to Number date //usage: AJ2N(Ajdn.xxxxxx)  // IMPORTANT: Enter AJDN in UTC! // Example: AJ2N(2456975.66594) returns {14.112014,6.5857} - time is sexagesimal output EXPORT AJ2N(ajdn) BEGIN LOCAL jdn,tme; tme:=FP(ajdn)+0.5; jdn:=IP(ajdn+0.5); RETURN {CALD(jdn), ROUND(HMS(tme*24) MOD 24,4)}; END; // // //________________________________________________________________________________​_______________________________ // DFX Main Menu // WMWK 2014-09-19 EXPORT DTM BEGIN LOCAL m,m1,mx,my,n2ja,dd1,dd2,dp1; LOCAL dp2, doey; While Z ≠ 9999 DO WHILE MOUSE(1)≥0 DO END; RECT(); TEXTOUT_P("Date & time functions for Hp Prime V 0.97",1,1,3); DRAWMENU("n2j","ddays","date+","doe","time","exit"); REPEAT m:=MOUSE; m1:=m(1); UNTIL SIZE(m1)>0; mx:=m1(1); my:=m1(2); IF my≥220 AND my≤239 THEN IF mx≥0 AND mx≤51 THEN INPUT (n2ja,"Number date to Julian Date number","dd.mmyyyy =", "Enter number date"); TEXTOUT_P("JDN = ",32,51,3); TEXTOUT_P(N2J(n2ja),89,51,3); WAIT(-1); END; IF mx≥53 AND mx≤104 THEN INPUT ({dd1,dd2}, "Difference between two dates in days",{"1st Date","2nd Date"}, {"dd.mmyyyy =", "dd.mmyyyy ="}); TEXTOUT_P("DDAYS: ",5,81,3); TEXTOUT_P(N2J(dd2)-N2J(dd1),65,81,3); WAIT(-1); END; IF mx≥106 AND mx≤157 THEN INPUT ({dp1,dp2},"Date+",{"date","xdays"},{"dd.mmyyyy =", "number"}); TEXTOUT_P("New Date:",1,81,3); TEXTOUT_P(CALD((N2J(dp1)+dp2)),80,81,3); WAIT(-1); END; IF mx≥159 AND mx≤210 THEN INPUT (doey,"Year of Easter= ", "Enter year"); TEXTOUT_P(DOE(doey),1,161,3); RECT(); WAIT(-1); END; IF mx≥212 AND mx≤263 THEN RECT();  TEXTOUT_P("HONULULU: ",0,2,0); TEXTOUT_P("LOS ANGELES: ",0,20,0); TEXTOUT_P("CHICAGO: ",0,40,0); TEXTOUT_P("NEW YORK: ",0,60,0); TEXTOUT_P("UTC: ",0,80,0,#FF0000); TEXTOUT_P("LONDON: ",0,100,0); TEXTOUT_P("BERLIN: ",0,120,0); TEXTOUT_P("MOSKAU: ",0,140,0); TEXTOUT_P("PEKING: ",0,160,0); TEXTOUT_P("TOKIO: ",0,180,0); TEXTOUT_P("SYDNEY: ",0,200,0); TEXTOUT_P("WELLINGTON: ",0,220,0); TEXTOUT_P("ENTER to quit",225,220,0); REPEAT TEXTOUT_P(((Time-12) MOD 24),110,2,0,#000000,90,#FFFFFF); TEXTOUT_P(((Time-9) MOD 24),110,20,0,#000000,90,#FFFFFF); TEXTOUT_P(((Time-7) MOD 24),110,40,0,#000000,90,#FFFFFF); TEXTOUT_P(((Time-6) MOD 24),110,60,0,#000000,90,#FFFFFF); TEXTOUT_P(((Time-2) MOD 24),110,80,0,#FF0000,90,#FFFFFF); TEXTOUT_P(((Time-1) MOD 24),110,100,0,#000000,90,#FFFFFF); TEXTOUT_P(((Time+0) MOD 24),110,120,0,#000000,90,#FFFFFF); TEXTOUT_P(((Time+2) MOD 24),110,140,0,#000000,90,#FFFFFF); TEXTOUT_P(((Time+6) MOD 24),110,160,0,#000000,90,#FFFFFF); TEXTOUT_P(((Time+7) MOD 24),110,180,0,#000000,90,#FFFFFF); TEXTOUT_P(((Time+8) MOD 24),110,200,0,#000000,90,#FFFFFF); TEXTOUT_P(((Time+10) MOD 24),110,220,0,#000000,90,#FFFFFF); WAIT(1); UNTIL GETKEY=30; END; END; IF mx≥265 AND mx≤319 THEN KILL; END; END; END; [code][code]

HP 33C 34C 11C 41CX 12C 15C HP71B 35s 50g Prime Rev. A, C, D. DM 41X, 42. TI 58C, 59, 74, 92-II, Voyage 200, nspire CX II-T, Sanyo ICC 82D and more
01-15-2015, 08:16 AM
Post: #4
 ww63 Junior Member Posts: 43 Joined: Sep 2014
RE: Date Functions
why is there a forbidden range in the dates?
01-15-2015, 08:35 AM
Post: #5
 Thomas_Sch Senior Member Posts: 391 Joined: Dec 2013
RE: Date Functions
presumably because of the calendar refinement in 1582 by Pope Gregory XIII.
(http://en.wikipedia.org/wiki/Gregorian_calendar ;
01-15-2015, 08:38 AM
Post: #6
 ww63 Junior Member Posts: 43 Joined: Sep 2014
RE: Date Functions
Thank you for this info.
01-15-2015, 01:21 PM (This post was last modified: 01-15-2015 01:22 PM by Dieter.)
Post: #7
 Dieter Senior Member Posts: 2,397 Joined: Dec 2013
RE: Date Functions
(01-15-2015 08:16 AM)ww63 Wrote:  why is there a forbidden range in the dates?

Simple – because these dates did not exist. The switch from the former Julian to the current Gregorian calendar occured after Thursday, 4 Oct 1582 (last Julian date) which was immediately followed by Friday, 15 Oct 1582 (first Gregorian date). So the 10 days in between do not exist by definition.

On the other hand, some countries all over the world adopted the new calendar earlier, some later, some not before the 20th century. For instance, Great Britain and its colonies did not change before 1752, so in these parts of the world the old Julian calendar still existed and there actually was a, say, 5 Oct 1582.

Dieter
01-15-2015, 03:35 PM
Post: #8
 Wolfgang Member Posts: 53 Joined: Jun 2014
RE: Date Functions
@Thomas and Dieter:

Thank you two for explaining, I didn't enter this section of our forums yesterday!

There is a lot of a Calendar Systems:

http://en.wikipedia.org/wiki/Calendar
or
http://de.wikipedia.org/wiki/Liste_der_Kalendersysteme

HP 33C 34C 11C 41CX 12C 15C HP71B 35s 50g Prime Rev. A, C, D. DM 41X, 42. TI 58C, 59, 74, 92-II, Voyage 200, nspire CX II-T, Sanyo ICC 82D and more
01-15-2015, 07:49 PM (This post was last modified: 01-16-2015 06:45 AM by Dieter.)
Post: #9
 Dieter Senior Member Posts: 2,397 Joined: Dec 2013
RE: Date Functions
(01-15-2015 03:35 PM)Wolfgang Wrote:  @Thomas and Dieter:

Thank you two for explaining, (...)

You're welcome. May I suggest a bit of streamlining of your program collection that would vastly reduce its size?

You could write a unified Julian day number routine that would handle all possible cases so that the same formula (the one with 365.25 and 30.6001) would not have to appear numerous times in slighty different versions. In the end all possible calculations boil down to conversions between day/month/year and Julian day numbers. Additional routines could split input (nd values) into day, month and year. What do you think?

Checking for invalid dates during the switchover period in October 1582 can be handled in various ways. The most straightforward way could be coded in PASCAL like this:
Code:
if (frac(nd)=0.101582) and (int(nd) >= 5) and (int(nd) <= 14) then     (* your error handler here *)     end;

The DT2DN (Date to Day Number) routine uses a special way of determining the day of year for a given date. Why don't you simply evaluate the difference between this date and 1 January (plus 1) ?-)

Finally, since the program uses English dialogues, English names for the Easter-related holidays would make sense. Maybe users from various parts of the world can say which Easter-related holidays are important to them, e.g. Pentecost, Ascension Thursday etc.

Dieter
01-15-2015, 10:37 PM
Post: #10
 Wolfgang Member Posts: 53 Joined: Jun 2014
RE: Date Functions
Hi Dieter,

thank you very much for having a look to my code and your good suggestions! You are right, its quick and dirty.....

O.T.:
30 Years ago i coded COBOL and ASSEMBLER and C on Mainframes.
And i saw, that smart coding after compiling often ran with lower speed....
and NO, i wasn't paid for each column......

The DT2DN routine is independent from the other routines.
The purposes of 'my' routines are:
Orbit, position, distance, sunrise, sunset, twilight, and so on... of the sun.
(Thats the reason for AN2J and AJ2N)..

For the equation of time (coming soon) there are many ways leading to rome, too.
....

I'm sorry about my bad english, in german i could it explain much better.

There is no problem to make an american version of Date of Easter including the appropriate names.

Next time i'll take a critical look to the code (next weeks).

Everybody is invited to help me in a constructively way like this!

Thank you!

HP 33C 34C 11C 41CX 12C 15C HP71B 35s 50g Prime Rev. A, C, D. DM 41X, 42. TI 58C, 59, 74, 92-II, Voyage 200, nspire CX II-T, Sanyo ICC 82D and more
01-16-2015, 08:40 AM (This post was last modified: 01-16-2015 04:57 PM by Dieter.)
Post: #11
 Dieter Senior Member Posts: 2,397 Joined: Dec 2013
RE: Date Functions
(01-15-2015 10:37 PM)Wolfgang Wrote:  30 Years ago i coded COBOL and ASSEMBLER and C on Mainframes.

At that time I tried my first programs in PL/I. ;-) But I soon switched to Pascal – never looked back.

Quote:And i saw, that smart coding after compiling often ran with lower speed....

I think we can have both elegant, readable and fast code.

Quote:Next time i'll take a critical look to the code (next weeks).
Everybody is invited to help me in a constructively way like this!

Here is a first suggestion for the N2J routine. It handles dates between 1 Jan 4713 BC and 31 Dec 9999. Input between 5 and 14 Oct 1582 (undefined) is rejected.

Caution! I never wrote a single line of code for the Prime calculator, so the following code most probably will cause syntax errors and will not run without more or less significant modifications. I assume the Prime uses something similar to Pascal, so I tried it this way. ;-)

Code:
EXPORT N2J(nd) BEGIN LOCAL B,D,M,Y,YMD; D:=IP(ABS(nd)); M:=IP(100*FP(ABS(nd))); Y:=SIGN(nd)*IP(10000*FP(100*ABS(nd))); YMD:=10000*Y+100*M+D; // build YYYYMMDD IF YMD < 15821015 THEN     // Julian date?    BEGIN    IF YMD > 15821004 THEN MSGBOX("Invalid date (undefined)"); KILL; END;     // invalid date during Jul-Greg transition    IF Y < -4712 THEN MSGBOX("Invalid date (< 1 Jan 4713 B.C.)"); KILL; END;  // invalid date < 1 Jan 4713 B.C.    B:=0;                   // no offset for Julian date    END ELSE    B:=2-IP(Y/100)+IP(Y/400);  // offset for Gregorian date END; IF M<3 THEN Y:=Y-1; M:=M+12; RETURN IP(365.25*(Y+4716)) + IP(30.6*(M+1)) + D + B - 1524; END;

This is not much more than half the original size, and I think it's far more readable. Maybe you can give it a try.

Dieter
01-18-2015, 06:25 PM (This post was last modified: 01-18-2015 08:40 PM by Dieter.)
Post: #12
 Dieter Senior Member Posts: 2,397 Joined: Dec 2013
RE: Date Functions
(01-16-2015 08:40 AM)Dieter Wrote:  Here is a first suggestion for the N2J routine. It handles dates between 1 Jan 4713 BC and 31 Dec 9999. Input between 5 and 14 Oct 1582 (undefined) is rejected.

Finally for the record:
Here is the VBA function I use in Excel (where the built-in functions have a very limited working range and may even return wrong results):

Code:
 Const LastJulian = 2299160   ' last Julian date = 04 Oct 1582 Const FirstGregorian = LastJulian + 11  ' first Gregorian date = 15 Oct 1582 Function Date2JD(d, m, y) If m < 3 Then m = m + 12: y = y - 1 JD = (1461 * (y + 4716)) \ 4 + (153 * (m + 1)) \ 5 + d - 1524 If JD > LastJulian Then    If JD < FirstGregorian Then       JD = -1   ' error marker - undefined date within transition period    Else       JD = JD + 2 - y \ 100 + y \ 400    End If End If Date2JD = JD End Function

In VBA, the backslash "\" stands for integer division, like IDIV or INT÷ on some HP calculators or DIV in some programming languages. Undefined dates (during the Julian/Gregorian transition) or dates before 4713 B.C. return negative results. An additional line of code could call an error handler.

Please note that the Julian/Gregorian transition point can be individually adjusted by the constants in the initial two lines. LastJulian is the Julian day number of the last date of the Julian calendar (here: 4 Oct 1582 = JD 2299160), while FirstGregorian represents the first date according to the Gregorian calendar (here: +11 days = 15 Oct 1582). So if you want to reflect the situation in Great Britain and its colonies where they switched from Wed, 2 Sep to Thu, 14 Sep 1752, simply set LastJulian=2361221 and FirstGregorian=LastJulian+12.

Dieter
01-19-2015, 04:47 PM
Post: #13
 Wolfgang Member Posts: 53 Joined: Jun 2014
RE: Date Functions
Quote:At that time I tried my first programs in PL/I. ;-) But I soon switched to Pascal – never looked back.

You don't have to look back if you are using COBOL; it is imperative, procedural and, since 2002, object-oriented. COBOL is primarily used in business, finance, and administrative systems for companies and governments....
You can i.e. use both COBOL and ORACLE, to handle a lot of data records in business environments. PASCAL is for teaching students and solving technical or scientific utilization. I think, today you can choose the most suitable programming language from a great pool.

Quote:YMD:=10000*Y+100*M+D; // build YYYYMMDD
Very good idea!!
Such as handling transition points, i will try code it.

Thank u very much, dieter. Becaue of your prename, do you speak german? (PM).

HP 33C 34C 11C 41CX 12C 15C HP71B 35s 50g Prime Rev. A, C, D. DM 41X, 42. TI 58C, 59, 74, 92-II, Voyage 200, nspire CX II-T, Sanyo ICC 82D and more
01-19-2015, 08:25 PM (This post was last modified: 01-19-2015 09:20 PM by Dieter.)
Post: #14
 Dieter Senior Member Posts: 2,397 Joined: Dec 2013
RE: Date Functions
(01-19-2015 04:47 PM)Wolfgang Wrote:  You don't have to look back if you are using COBOL; it is imperative, procedural and, since 2002, object-oriented.

My last and only COBOL experience dates back to 1985. ;-)

(01-19-2015 04:47 PM)Wolfgang Wrote:  COBOL is primarily used in business, finance, and administrative systems for companies and governments....
You can i.e. use both COBOL and ORACLE, to handle a lot of data records in business environments. PASCAL is for teaching students and solving technical or scientific utilization.

I love PASCAL for its sheer elegance. I'm not a profossional programmer, I just love writing compact and elegant algorithms for mathematical applications. On the other hand I also like the challenges of more assembler-like languagues as they are used in classic HP RPN calculators. ;-)

(01-19-2015 04:47 PM)Wolfgang Wrote:
Quote:YMD:=10000*Y+100*M+D; // build YYYYMMDD
Very good idea!!
Such as handling transition points, i will try code it.

There is a more elegant way that shines up in the last VBA example I posted. If the Julian day number is calculated anyway, you can also use it for comparing dates. The suggested version with a configurable transition point (via LastJulian and FirstGregorian) can be handled even simpler – like this:

Code:
Const LastJulian = 2299160           ' last Julian date = 04 Oct 1582 Function Date2JD(d, m, y) If m < 3 Then m = m + 12: y = y - 1 JD = (1461 * (y + 4716)) \ 4 + (153 * (m + 1)) \ 5 + d - 1524 If JD > LastJulian Then              ' Gregorian date?    JD = JD + 2 - y \ 100 + y \ 400   ' then adjust JD     If JD <= LastJulian Then JD = -1  ' error marker - undefined date within transition period End If Date2JD = JD End Function

This version needs just one constant (LastJulian = Julian day number of the last date of the Julian calendar, here 2299160 = 4 Oct 1582). If the calculated JDN (according to the Julian calendar) is greater than this limit (i.e. the date belongs to the Gregorian period), it gets the Gregorian adjustment. If the new Gregorian JDN now is ≤ LastJulian, the entered date was within the transition period (here 5...14 Oct 1582) and thus is undefined.

(01-19-2015 04:47 PM)Wolfgang Wrote:  Thank u very much, dieter. Becaue of your prename, do you speak german? (PM).

You bet / aber klar doch. :-)
There is a substantial number of German speaking contributors here. But of course this is an international forum, so they all resort to today's lingua franca. ;-)

Dieter
04-09-2015, 03:03 PM
Post: #15
 salvomic Senior Member Posts: 1,394 Joined: Jan 2015
RE: Date Functions
(01-15-2015 10:37 PM)Wolfgang Wrote:  The DT2DN routine is independent from the other routines.
The purposes of 'my' routines are:
Orbit, position, distance, sunrise, sunset, twilight, and so on... of the sun.
...

hi Wolfgang,
I'm using the "all in one" program in post #3 and it's very impressive!
Thank you for sharing.
I'm searching also just for sunrise, sunset, twilight, effemeridi of sun and moon (other planets also?)...

Then, you should think to give an option to calc DDAYS with an option: to calculate with and without the "holidays days" included (like the banks sometimes require)...

Danke, ciao
Salvo

∫aL√0mic (IT9CLU) :: HP Prime 50g 41CX 71b 42s 39s 35s 12C 15C - DM42, DM41X - WP34s Prime Soft. Lib
04-10-2015, 06:38 PM
Post: #16
 Wolfgang Member Posts: 53 Joined: Jun 2014
RE: Date Functions
Hi Salvo,

i'm very sorry about my late responding!

Thank you very much for using my date functions 'lib'!

I'm searching also just for sunrise, sunset, twilight, effemeridi of sun and moon (other planets also?)... ------> For Sun the algorithms are completed and i have only to code it.

DDAYS ---> holidays: Do you mean a single block like ferragosto in the middle of august?

Wolfgang

HP 33C 34C 11C 41CX 12C 15C HP71B 35s 50g Prime Rev. A, C, D. DM 41X, 42. TI 58C, 59, 74, 92-II, Voyage 200, nspire CX II-T, Sanyo ICC 82D and more
04-10-2015, 07:27 PM
Post: #17
 salvomic Senior Member Posts: 1,394 Joined: Jan 2015
RE: Date Functions
(04-10-2015 06:38 PM)Wolfgang Wrote:  For Sun the algorithms are completed and i have only to code it.

DDAYS ---> holidays: Do you mean a single block like ferragosto in the middle of august?

hi,
I mean this and also to calculate the time without sundays and saturdays: time between minus Sun, Sat, Holidays (the most important, but I know that they are Country-related, like "Ferragosto" in Italy or Independence Day and so on...).

For Sun ok!
Also Moon Phases could make the Prime a companion of "little astronomer"

ciao
Salvo

∫aL√0mic (IT9CLU) :: HP Prime 50g 41CX 71b 42s 39s 35s 12C 15C - DM42, DM41X - WP34s Prime Soft. Lib
04-13-2015, 10:03 PM
Post: #18
 Wolfgang Member Posts: 53 Joined: Jun 2014
RE: Date Functions
Hi Salvo,

please give me hyperlinks to real examples of excluding weekends or holidays for calculating credits. I did not find those kinds of charging interests in the WWW.

Moon (and planets and all others like DFX3):

My programs are programmed during rare free time sections [for HP Prime] and are for free and so there is for me - look @ Surefire - no hastle guarantee! - for further upgrades. BUT: You are all invited to improve my codes!

But if you can wait til this year: My personal roadmap will proceed this & more this year.

I like responds via PM.

Greetings Wolfgang

HP 33C 34C 11C 41CX 12C 15C HP71B 35s 50g Prime Rev. A, C, D. DM 41X, 42. TI 58C, 59, 74, 92-II, Voyage 200, nspire CX II-T, Sanyo ICC 82D and more
04-13-2015, 10:17 PM
Post: #19
 salvomic Senior Member Posts: 1,394 Joined: Jan 2015
RE: Date Functions
(04-13-2015 10:03 PM)Wolfgang Wrote:  Hi Salvo,

please give me hyperlinks to real examples of excluding weekends or holidays for calculating credits. I did not find those kinds of charging interests in the WWW.
hi Wolfgang,
for now I found some ideas here or here...
(I "googled" "days interval holidays")...

Quote:Moon (and planets and all others like DFX3):

My programs are programmed during rare free time sections [for HP Prime] and are for free and so there is for me - look @ Surefire - no hastle guarantee! - for further upgrades. BUT: You are all invited to improve my codes!
But if you can wait til this year: My personal roadmap will proceed this & more this year.
I can wait, sure
I can also try to test your code, hoping to improve it, if needed, but sure it's already good enough

Have a nice day!

Salvo

∫aL√0mic (IT9CLU) :: HP Prime 50g 41CX 71b 42s 39s 35s 12C 15C - DM42, DM41X - WP34s Prime Soft. Lib
04-13-2015, 10:50 PM
Post: #20
 Wolfgang Member Posts: 53 Joined: Jun 2014
RE: Date Functions
Hi Salvo,

thank you very much for hyperlinking!

But (i have no anticipation):
This is real for charging interests?

Very interesting!

:-)

Tanti saluti da Berlino

Wolfgang

HP 33C 34C 11C 41CX 12C 15C HP71B 35s 50g Prime Rev. A, C, D. DM 41X, 42. TI 58C, 59, 74, 92-II, Voyage 200, nspire CX II-T, Sanyo ICC 82D and more
 « Next Oldest | Next Newest »

User(s) browsing this thread: 1 Guest(s)