Days between dates: Difference between revisions

Added solution for Action!
(Days between dates en FreeBASIC)
(Added solution for Action!)
Line 22:
<pre>
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>
 
Anonymous user