当使用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}