使用 svn-multi 和 \svnfiledate 自定义显示的时区

使用 svn-multi 和 \svnfiledate 自定义显示的时区

当使用svn-multi包一起\svnfiledate返回时

2011-10-05 22:18:31 +0200(2011年10月5日,星期三);

是否有某种定制方式可以仅获取以下内容:

2011-10-05 22:18:31时区

答案1

我是 的作者svn-multi。目前软件包中没有此功能。我计划添加类似的东西一段时间,并提出了这个问题处理不同的时区在这里获取一些对话帮助。我在自我回答中发布的代码可以进行调整以与一起使用\svnfiledate,但我还没有时间这样做。

我不确定,但在本地机器上检出 Subversion 下的所有文件应该会生成本地时区的所有日期。所以,您可能从另一台机器复制了文件。


下面是我上面答案中的代码,适用于\svnfiledate。它打印以下两条测试行:

Wednesday 5th October, 2011 21:30 UTC
Wednesday 5th October, 2011 23:30 CEST
Wednesday 5th October, 2011 08:45 -1245

这是三个不同时区的当前日期。请注意,如果跨越了日期界限,则编译调整后的日期和时间可能需要一段时间。datetime我猜这是在包内部发生的。

我可能会将此功能直接放入其中svn-multi,或者作为自己的时区包放入其中。

\documentclass{article}

\usepackage{svn-multi}
\svnidlong
{$HeadURL: file:///tmp/svn/rep/sv.tex $}
{$LastChangedDate: 2011-10-05 23:30:45 +0200 (Wed, 05 Oct 2011) $}
{$LastChangedRevision: 2 $}
{$LastChangedBy: martin $}
\usepackage{datenumber}

\makeatletter
\newcommand*\getnumtz[2]{%
    \expandafter\@getnumtz\the\numexpr 0#2\relax
        \empty\relax\relax\@nnil{#1}{#2}%
}

\def\@getnumtz#1\relax#2\relax#3\@nnil#4#5{%
    \ifx\relax#2\relax
        \edef#4{#1}%
    \else
        \begingroup\expandafter\endgroup
        \expandafter\let\expandafter#4\csname getnumtz@#5\endcsname%
    \fi
}

\newcommand*\definetz[2]{%
    \@namedef{getnumtz@#1}{#2}%
}%

\definetz{Z}{+0000}
\definetz{GMT}{+0000}
\definetz{UTC}{+0000}
\definetz{CET}{+0100}
\definetz{CEST}{+0200}

\newcommand*\converttimezone[9]{%
    % #1 = macro which receives result
    % #2 = year
    % #3 = month
    % #4 = day
    % #5 = hour
    % #6 = minute
    % #7 = second
    % #8 = original timezone
    % #9 = target timezone
    \begingroup
    % Store date:
    \c@myyear=\numexpr#2\relax
    \c@mymonth=\numexpr#3\relax
    \c@myday=\numexpr#4\relax
    \c@myhour=\numexpr#5\relax
    \c@myminute=\numexpr#6\relax
    \c@mysecond=\numexpr#7\relax
    % Get numeric timezones
    \getnumtz\origtz{#8}%
    \getnumtz\targettz{#9}%
    % Calculate resulting hour-minute combination (could be improved)
    \c@myhourminute=\numexpr (#5)*100+(#6) - \origtz + \targettz \relax
    \c@myhour=\numexpr \c@myhourminute / 100\relax% integer devision
    \c@myminute=\numexpr \c@myhourminute - \c@myhour*100\relax
    \loop\ifnum\c@myminute<\z@
        \advance\c@myhour by \m@ne
        \advance\c@myminute by 60\relax
    \repeat
    \loop\ifnum\c@myminute>59\relax
        \advance\c@myhour by \@ne
        \advance\c@myminute by -60\relax
    \repeat
    % Check if the day boundary has been crossed and adjust day:
    \ifnum\c@myhour<0\relax
        \setmydatenumber{mydatenumber}{\value{myyear}}{\value{mymonth}}{\value{myday}}%
        \advance\c@mydatenumber by \m@ne
        \setmydatebynumber{\value{mydatenumber}}{myyear}{mymonth}{myday}%
        \advance\c@myhour by 24\relax
    \else\ifnum\c@myhour>23\relax
        \setmydatenumber{mydatenumber}{\value{myyear}}{\value{mymonth}}{\value{myday}}%
        \advance\c@mydatenumber by \@ne
        \setmydatebynumber{\value{mydatenumber}}{myyear}{mymonth}{myday}%
        \advance\c@myhour by -24\relax
    \fi\fi
    \edef\@tempa{\unexpanded{#1}{\themyyear}{\themymonth}{\themyday}{\themyhour}{\themyminute}{\themysecond}{#9}}%
    \expandafter
    \endgroup\@tempa
}
\newcounter{myhourminute}
\newcounter{myyear}
\newcounter{mymonth}
\newcounter{myday}
\newcounter{myhour}
\newcounter{myminute}
\newcounter{mysecond}
\newcounter{mydatenumber}
\makeatother


\usepackage{datetime}
\newcommand\myshowdate[7]{\formatdate{#3}{#2}{#1} \formattime{#4}{#5}{#6} #7}


\newcommand{\svnfiledateintz}[1]{%
    \converttimezone\myshowdate{\svnfileyear}{\svnfilemonth}{\svnfileday}{\svnfilehour}{\svnfileminute}{\svnfilesecond}{\svnfiletimezonehour \svnfiletimezoneminute}{#1}%
}


\begin{document}

\svnfiledateintz{UTC}

\svnfiledateintz{CEST}

\svnfiledateintz{-1245}

\end{document}

相关内容