I knew that one day my \juliandate_calc:nnnn
macro would have been useful. ;-)
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\dayofyear}{o}
{
\IfNoValueTF{#1}
{
\aaki_day_of_year:nnn { \year } { \month } { \day }
}
{
\aaki_day_of_year:n { #1 }
}
}
\cs_new:Npn \aaki_day_of_year:n #1
{
\aaki_day_of_year:w #1 \q_stop
}
\cs_new:Npn \aaki_day_of_year:w #1 - #2 - #3 \q_stop
{
\aaki_day_of_year:nnn { #1 } { #2 } { #3 }
}
\cs_new:Npn \aaki_day_of_year:nnn #1 #2 #3
{
\int_eval:n { #1 }
\int_eval:n
{
\juliandate_calc:nnnn { #3 } { #2 } { #1 } { \use:n }
-
\juliandate_calc:nnnn { 1 } { 1 } { #1 } { \use:n }
+ 1
}
}
\cs_new:Npn \juliandate_calc:nnnn #1 #2 #3 #4 % #1 = day, #2 = month, #3 = year, #4 = what to do
{
#4
{
\int_eval:n
{
#1 +
\int_div_truncate:nn
{
153 * (#2 + 12 * \int_div_truncate:nn { 14 - #2 } { 12 } - 3) + 2
}
{ 5 } +
365 * (#3 + 4800 - \int_div_truncate:nn { 14 - #2 } { 12 } ) +
\int_div_truncate:nn { #3 + 4800 - \int_div_truncate:nn { 14 - #2 } { 12 } } { 4 } -
\int_div_truncate:nn { #3 + 4800 - \int_div_truncate:nn { 14 - #2 } { 12 } } { 100 } +
\int_div_truncate:nn { #3 + 4800 - \int_div_truncate:nn { 14 - #2 } { 12 } } { 400 } -
32045
}
}
}
\ExplSyntaxOff
\begin{document}
\dayofyear
\dayofyear[2013-1-1]
\dayofyear[2013-12-31]
\dayofyear[2012-12-31]
\end{document}
The algorithm for getting the Julian date from day, month and year can be found on the net.
The internal command \aaki_day_of_year:n
(for the date in ISO format YYYY-MM-DD
) is fully expandable.
\today
command and it's features.