\define g(y, m, d)<$set name=m value={{{ [[$m$]add[9]remainder[12]] }}}><$set name=y value={{{ [<m>divide[10]subtract[$y$]negate[]] }}}><$set name=y4 value={{{ [<y>add[4]] }}}><$set name=y100 value={{{ [<y>divide[100]] }}}><$set name=y400 value={{{ [<y>divide[400]] }}}><$set name=m3 value={{{ [<m>multiply[306]add[5]divide[10]] }}}>{{{ [[365]multiply<y>add<y4>subtract<y100>add<y400>add<m3>add[$d$]subtract[1]] }}}</$set></$set></$set></$set></$set></$set>\end
d(g(y,m,d) + n)
which thus requires the d function and maybe also to mess a bit with the <<now>> macro to extract the desired bits. Or maybe it could be integrated into the function for a more elegant solution.
\define date_offset()
<$set name=today value=<<now YYYY0MM0DD>>>
<<date_offset_2>>
</$set>
\end
\define date_offset_2()
<<FutureDate $(today)$ 0 0 90>>
\end
<<date_offset>>
Macro to find a future date based on the number of years, months or days from today.
Required input:
<<FutureDate YYYYMMDD y m d>>,
where YYYYMMDD is the starting date and y, m, d are, respectively, year(s), month(s) and/or day(s) to be added to the starting date.
Don't add more than 12 months in one parameter -- for example, instead of adding 18 months, add 1 year and 6 months.
Note that you could combine your two TW macros by using <$macrocall $name=FutureDate ..../> in the first macro.
\define g(y,m,d,offset:"0")
<$set name=m value={{{ [<__m__>add[9]remainder[12]] }}}>
<$set name=y value={{{ [<m>divide[10]floor[]negate[]add<__y__>] }}} >
<$set name=y4 value={{{ [<y>divide[4]floor[]] }}}>
<$set name=y100 value={{{ [<y>divide[100]floor[]] }}}>
<$set name=y400 value={{{ [<y>divide[400]floor[]] }}}>
<$set name=m306 value={{{ [<m>multiply[306]add[5]divide[10]floor[]] }}}>
<$set name=result value={{{ [[365]multiply<y>add<y4>subtract<y100>add<y400>add<m306>add[$d$]add[$offset$]subtract[1]] }}} >
<<result>>
</$set></$set></$set></$set></$set></$set></$set>
\end
\define d(g)
<$set name=daysperyear value="365.2425">
<!-- y = (10000*g + 14780)/3652425 -->
<$set name=y value={{{ [[10000]multiply<__g__>add[14780]divide[3652425]floor[]] }}}>
<!-- ddd = g - (365*y + y/4 - y/100 + y/400) -->
<$set name=y4 value={{{ [<y>divide[4]floor[]] }}}>
<$set name=y100 value={{{ [<y>divide[100]floor[]] }}}>
<$set name=y400 value={{{ [<y>divide[400]floor[]] }}}>
<$set name=dddtest value={{{ [[365]multiply<y>add<y4>subtract<y100>add<y400>negate[]add<__g__>] }}} >
<$set name=prioryear value={{{ [<y>subtract[1]] }}} >
<$set name=y value={{{ [<dddtest>prefix[-]then<prioryear>] [<dddtest>!prefix[-]then<y>] }}} >
<$set name=ddd value={{{ [[365]multiply<y>add<y4>subtract<y100>add<y400>negate[]add<__g__>] }}} >
<!-- mi = (100*ddd + 52)/3060 -->
<$set name=mi value={{{ [[100]multiply<ddd>add[52]divide[3060]floor[]] }}} >
<!-- mm = (mi + 2)%12 + 1 -->
<$set name=mm value={{{ [<mi>add[2]remainder[12]add[1]] }}} >
<!-- y = y + (mi + 2)/12 -->
<$set name=y value={{{ [<mi>add[2]divide[12]floor[]add<y>] }}} >
<!-- dd= ddd - (mi*306 + 5)/10 + 1 -->
<$set name=dd value={{{ [<mi>multiply[306]add[5]divide[10]floor[]negate[]add<ddd>add[1]] }}} >
<<y>>, <<mm>>, <<dd>> <br/>
</$set></$set></$set></$set></$set></$set></$set></$set></$set></$set></$set></$set></$set>
\end
\define daysfrom(y,m,d,o)
<$wikify name=future text="<<g $y$ $m$ $d$ $o$>>">
<$macrocall $name="d" g=<<future>>/>
</$wikify>
\end
Days from: <<daysfrom 2019 10 21 11>>
daysfromnow:modified[+7]
now[]