Days between dates: Difference between revisions
Content added Content deleted
(Days between dates en FreeBASIC) |
(Added solution for Action!) |
||
Line 22: | Line 22: | ||
<pre> |
<pre> |
||
272 |
272 |
||
</pre> |
|||
=={{header|Action!}}== |
|||
{{libheader|Action! Tool Kit}} |
|||
<lang Action!>INCLUDE "D2:REAL.ACT" ;from the Action! Tool Kit |
|||
TYPE Date=[CARD year BYTE month,day] |
|||
BYTE FUNC IsLeapYear(CARD y) |
|||
IF y MOD 100=0 THEN |
|||
IF y MOD 400=0 THEN RETURN (1) |
|||
ELSE RETURN (0) FI |
|||
FI |
|||
IF y MOD 4=0 THEN RETURN (1) FI |
|||
RETURN (0) |
|||
PROC DecodeDate(CHAR ARRAY s Date POINTER d) |
|||
BYTE ARRAY maxD=[0 31 28 31 30 31 30 31 31 30 31 30 31] |
|||
CHAR ARRAY tmp(5) |
|||
BYTE m |
|||
IF s(0)#10 THEN |
|||
Break() |
|||
FI |
|||
SCopyS(tmp,s,1,4) d.year=ValC(tmp) |
|||
SCopyS(tmp,s,6,7) d.month=ValB(tmp) |
|||
SCopyS(tmp,s,9,10) d.day=ValB(tmp) |
|||
IF d.year=0 OR d.month=0 OR d.month>12 OR d.day=0 THEN |
|||
Break() |
|||
FI |
|||
IF IsLeapYear(d.year) THEN |
|||
maxD(2)=29 |
|||
ELSE |
|||
maxD(2)=28 |
|||
FI |
|||
m=d.month |
|||
IF d.day>maxD(m) THEN |
|||
Break() |
|||
FI |
|||
RETURN |
|||
PROC DateToDays(Date POINTER d REAL POINTER res) |
|||
BYTE m |
|||
INT y,tmp1 |
|||
REAL tmp2 |
|||
m=(d.month+9) MOD 12 |
|||
y=d.year-m/10 |
|||
tmp1=y/4-y/100+y/400+(m*306+5)/10+(d.day-1) |
|||
IntToReal(365,res) |
|||
IntToReal(y,tmp2) |
|||
RealMult(res,tmp2,res) |
|||
IntToReal(tmp1,tmp2) |
|||
RealAdd(res,tmp2,res) |
|||
RETURN |
|||
PROC DiffDays(Date POINTER d1,d2 REAL POINTER diff) |
|||
REAL days1,days2 |
|||
DateToDays(d1,days1) |
|||
DateToDays(d2,days2) |
|||
RealSub(days2,days1,diff) |
|||
RETURN |
|||
PROC Test(CHAR ARRAY s1,s2) |
|||
Date d1,d2 |
|||
REAL diff |
|||
DecodeDate(s1,d1) |
|||
DecodeDate(s2,d2) |
|||
DiffDays(d1,d2,diff) |
|||
PrintF("%S .. %S -> ",s1,s2) |
|||
PrintRE(diff) |
|||
RETURN |
|||
PROC Main() |
|||
Put(125) PutE() ;clear the screen |
|||
Test("1995-11-21","1995-11-21") |
|||
Test("2019-01-01","2019-01-02") |
|||
Test("2019-01-02","2019-01-01") |
|||
Test("2019-01-01","2019-03-01") |
|||
Test("2020-01-01","2020-03-01") |
|||
Test("1902-01-01","1968-12-25") |
|||
Test("2090-01-01","2098-12-25") |
|||
Test("1902-01-01","2098-12-25") |
|||
RETURN</lang> |
|||
{{out}} |
|||
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Days_between_dates.png Screenshot from Atari 8-bit computer] |
|||
<pre> |
|||
1995-11-21 .. 1995-11-21 -> 0 |
|||
2019-01-01 .. 2019-01-02 -> 1 |
|||
2019-01-02 .. 2019-01-01 -> -1 |
|||
2019-01-01 .. 2019-03-01 -> 59 |
|||
2020-01-01 .. 2020-03-01 -> 60 |
|||
1902-01-01 .. 1968-12-25 -> 24465 |
|||
2090-01-01 .. 2098-12-25 -> 3280 |
|||
1902-01-01 .. 2098-12-25 -> 71947 |
|||
</pre> |
</pre> |
||