%\iffalse
% datetime2.dtx generated using makedtx version 1.1 (c) Nicola Talbot
% Command line args:
%   -doc "datetime2-manual.tex"
%   -src "datetime2.sty\Z=>datetime2.sty"
%   -src "datetime2-calc.sty\Z=>datetime2-calc.sty"
%   -section "chapter"
%   -author "Nicola Talbot"
%   datetime2
% Created on 2015/3/24 13:32
%\fi
%\iffalse
%<*package>
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%</package>
%\fi
% \iffalse
% Doc-Source file to use with LaTeX2e
% Copyright (C) 2015 Nicola Talbot, all rights reserved.
% \fi
% \iffalse
%<*driver>
\documentclass[widecs,report]{nlctdoc}

\usepackage{metalogo}
\usepackage{graphicx}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[calc,english,en-GB,useregional=false]{datetime2}
\usepackage[colorlinks,
            bookmarks,
            hyperindex=false,
            pdfauthor={Nicola L.C. Talbot},
            pdftitle={datetime2: date and time formats}]{hyperref}


\CheckSum{1943}

\renewcommand*{\usage}[1]{\hyperpage{#1}}
\renewcommand*{\main}[1]{\hyperpage{#1}}
\IndexPrologue{\chapter*{\indexname}\markboth{\indexname}{\indexname}}
\setcounter{IndexColumns}{2}

\newcommand{\style}[1]{\texttt{#1}\index{#1=\texttt{#1} style|main}}

\doxitem{Option}{option}{options (definitions)}

\DTMsavetimestamp{gmt}{2015-03-01T15:35:09+00:00}
\DTMsavetimestamp{bst}{2015-04-01T08:55:39+01:00}

\begin{document}
\DocInput{datetime2.dtx}
\end{document}
%</driver>
%\fi
%
%\MakeShortVerb{"}
%
%\title{datetime2 v1.0:
%date and time formats}
%\author{Nicola L. C. Talbot\\\url{http://www.dickimaw-books.com/}}
%
%\date{2015-03-24}
%\maketitle
%
%\begin{abstract}
%The \styfmt{datetime2} package replaces the \styfmt{datetime}
%package. Languages and regional variations are dealt with by the
%\styfmt{datetime2} language modules which are independently
%maintained and installed. Make sure that when you install
%\styfmt{datetime2} you also install the required \styfmt{datetime2}
%language modules.
%\end{abstract}
%
%\tableofcontents
%
%\chapter{Introduction}
%\label{sec:intro}
%
%I~wrote the original \styfmt{datetime} package back in the 1990s as
%an alternative to the \sty{ukdate} package, which had dropped out of
%some of the TeX distributions, so it was designed specifically for
%UK date formats.\footnote{Of course, \texttt{ukdatetime} would've
%been a better name, but the 8 dot 3 filename restriction was a concern back
%then.} However some users found the time formats useful
%and the ability to save dates for later use, so when \sty{babel}
%came along I~had a number of requests to make \sty{datetime}
%compatible with \sty{babel} so that the regional date formats were
%preserved but the other \sty{datetime} functions could be used. 
%Then PDF\TeX\ came into existence and its \cs{pdfcreationdate} now
%provided a~way of obtaining the seconds and time zone, which can't
%be obtained from \TeX's \cs{time} primitive.  Over time, the
%continual updates to the package has started to put a~strain on the
%original na\"ive \LaTeX\ code of my first package, as it's been
%stretched well past its intended design.
%
%The other problem with \sty{datetime} is that some of the commands
%aren't expandable but some users want to be able to use them in
%expandable contexts (such as, for example, PDF bookmarks or writing
%a date stamp to an external file) or they
%want to be able to upper case the first letter if the date comes at
%the start of a~sentence. This isn't an issue in English, as the
%weekday and month names are proper nouns and so automatically start
%with an upper case letter, regardless of where they appear in
%a~sentence. Users who don't know the history and original purpose of
%the \sty{datetime} package are puzzled as to why the defaults are
%all UK English or some styles were hard-coded, and some users are
%confused as to the ordering of the day, month and year parameters.
%In addition, some command names were incompatible with other
%date-related packages, but renaming those commands would break
%compatibility with older documents.
%
%In order to address all these issues, a~replacement package is
%necessary. Your old documents that use \sty{datetime} should
%still be able to compile, but for your new documents, you may prefer
%the improved \styfmt{datetime2} package instead.
%
%\chapter{Example Usage}
%\label{sec:examples}
%
%\begin{verbatim}
%\documentclass{article}
%\usepackage{datetime2}
%\begin{document}
%This PDF was created on \today.
%\end{document}
%\end{verbatim}
%In the above example, the date is displayed in the form:
%\begin{display}
%\DTMsetstyle{default}\DTMusedate{gmt}
%\end{display}
%This is the \style{default} style.
%
%\begin{verbatim}
%\documentclass{article}
%\usepackage{datetime2}
%\begin{document}
%This PDF was created on \DTMnow.
%\end{document}
%\end{verbatim}
%In the above example, the full date, time and time zone is displayed
%in the form
%\begin{display}
%\DTMsetstyle{default}\DTMuse{gmt}
%\end{display}
%or
%\begin{display}
%\DTMsetstyle{default}\DTMuse{bst}
%\end{display}
%\emph{unless} you are using \XeLaTeX\ in which case the seconds and
%time zone are omitted. (\XeLaTeX\ doesn't provide this information.)
%If you're not using \XeLaTeX\ you can hide the seconds and zone
%using the package options \pkgopt[false]{showseconds} and
%\pkgopt[false]{showzone}. If you want UTC+0 to be displayed
%numerically instead of using a Z you can use the
%\pkgopt[false]{showisoZ} package option.
%
%\begin{verbatim}
%\documentclass[british]{article}
%\usepackage[babel]
%\usepackage{datetime2}
%\begin{document}
%This PDF was created on \DTMnow.
%\end{document}
%\end{verbatim}
%This has the same output as the previous example.
%
%\begin{verbatim}
%\documentclass[british]{article}
%\usepackage[babel]
%\usepackage[useregional]{datetime2}
%\begin{document}
%This PDF was created on \DTMnow.
%\end{document}
%\end{verbatim}
%The full date, time and zone are displayed in the form
%\begin{display}
%\DTMsetstyle{en-GB}\DTMuse{gmt}
%\end{display}
%or
%\begin{display}
%\DTMsetstyle{en-GB}\DTMuse{bst}
%\end{display}
%
%\begin{verbatim}
%\documentclass[british]{article}
%\usepackage[babel]
%\usepackage[useregional=numeric]{datetime2}
%\begin{document}
%This PDF was created on \DTMnow.
%\end{document}
%\end{verbatim}
%The full date, time and zone are displayed in the form
%\begin{display}
%\DTMsetstyle{en-GB-numeric}\DTMuse{gmt}
%\end{display}
%or
%\begin{display}
%\DTMsetstyle{en-GB-numeric}\DTMuse{bst}
%\end{display}
%
%\begin{verbatim}
%\documentclass[english]{article}
%\usepackage[babel]
%\usepackage[useregional=numeric]{datetime2}
%\begin{document}
%This PDF was created on \DTMnow.
%\end{document}
%\end{verbatim}
%The full date, time and zone are displayed in the form
%\begin{display}
%\DTMsetstyle{default}\DTMuse{gmt}
%\end{display}
%This is because no region has been specified. The language name is
%ambiguous, so the \style{default} style is used.
%
%\begin{verbatim}
%\documentclass[english]{article}
%\usepackage[babel]
%\usepackage[useregional]{datetime2}
%\begin{document}
%This PDF was created on \today.
%\end{document}
%\end{verbatim}
%The date is now displayed as
%\begin{display}
%\DTMsetstyle{english}\DTMusedate{gmt}
%\end{display}
%since that's \LaTeX's default behaviour for \cs{today}. For other
%languages, you should check the language module documentation to
%find out what happens when the region can't be determined from the
%language name.
%
%\begin{verbatim}
%\documentclass[british]{article}
%\usepackage[babel]
%\usepackage[useregional,showdow]{datetime2}
%
%\DTMlangsetup[en-GB]{abbr}
%
%\begin{document}
%This PDF was created on \today.
%\end{document}
%\end{verbatim}
%The date is now displayed as
%\begin{display}
%\DTMsetstyle{en-GB}\DTMlangsetup[en-GB]{abbr}\DTMsetup{showdow}%
%\DTMusedate{gmt}
%\end{display}
%The options used in \cs{DTMlangsetup} (such as \texttt{abbr}) are
%provided by the language modules and should be described in the
%module's documentation. Different languages may have different
%options so \texttt{abbr} may not be available for some of them. The
%\pkgopt{showdow} (show day of week) option is a package-wide option.
%You need to check the documentation to find out which styles check
%the \pkgopt{showdow} setting as not all of them do.
%
%\chapter{Displaying the Date and Time}
%\label{sec:display}
%
%A specific date can be displayed using:
%\begin{definition}[\DescribeMacro\DTMdisplaydate]
%\cs{DTMdisplaydate}\marg{year}\marg{month}\marg{day}\marg{dow}
%\end{definition}
%The format used to display the date is governed by the 
%\termdef{display style}.
%
%The arguments are all \emph{numerical}: \meta{year} is the year,
%\meta{month} is the month number (starting from~1 for January),
%\meta{day} is the day of the month and \meta{dow} is the day of the
%week number starting from~0 for Monday. The day of week number may
%be \texttt{-1}, which indicates that the style should ignore it.
%(Some styles always ignore the day of week, regardless of its
%value.) This command is intended for use in expandable contexts
%(such as writing the date to another file or using the date in the
%bookmarks) and is used by \cs{today}. The date styles should ensure
%that any fragile content is protected. (This is why the \meta{dow}
%isn't an optional argument otherwise the command wouldn't be
%expandable.)
%
%Some styles may start the date with a word (such as the day of the
%week name or the month name). In English, proper nouns are
%capitalised regardless of where they appear in a~sentence but some
%languages use lower case month or day of week names. In this event,
%if the initial letter needs to be capitalised then you can use:
%\begin{definition}[\DescribeMacro\DTMDisplaydate]
%\cs{DTMDisplaydate}\marg{year}\marg{month}\marg{day}\marg{dow}
%\end{definition}
%which is analogous to \cs{DTMdisplaydate}. Styles that are
%unaffected by this issue (for example, numerical or English dates)
%set \cs{DTMDisplaydate} to just \cs{DTMdisplaydate}. As with
%\cs{DTMdisplaydate} the style needs to ensure that any fragile
%content is protected in the event that \cs{DTMDisplaydate} is used
%in an expandable context. (Note that for this reason, I~don't
%recommend the use of the commands provided by the \sty{mfirstuc}
%package as they're not expandable.)
%
%The current date is displayed using
%\begin{definition}[\DescribeMacro\today]
%\cs{today}
%\end{definition}
%This uses \cs{DTMdisplaydate} to format the date so it will match
%the currently selected date style. There's also a first letter
%upper case version that uses \cs{DTMDisplaydate}:
%\begin{definition}[\DescribeMacro\Today]
%\cs{Today}
%\end{definition}
%
%\begin{important}
%If you use \sty{babel} or \sty{polyglossia} you must make sure 
%you have the relevant \styfmt{datetime2} language modules installed.
%(See \sectionref{sec:lang}.) You also need to make sure that
%\styfmt{datetime2} is loaded \emph{after}
%\sty{babel}\slash\sty{polyglossia} otherwise \cs{today} will be
%redefined so that it no longer uses \cs{DTMdisplaydate}.
%\end{important}
%
%As mentioned above, some styles allow the day of the week to be
%displayed. This requires the \sty{datetime2-calc} package which will
%automatically be loaded if you set \pkgopt{showdow} in the
%\styfmt{datetime2} package option list or if you set
%\pkgopt{showdow} in \ics{DTMsetup} \emph{in the preamble}. The
%package option \pkgopt{calc} will also load \sty{datetime2-calc} or
%you can load it explicitly using \cs{usepackage} after
%\styfmt{datetime2} has been loaded. (You may use \pkgopt[true]{showdow} in
%the \env{document} environment if the \styfmt{datetime2-calc}
%package has been loaded in the preamble either explicitly or through
%the \pkgopt{calc} option.)
%
%When \sty{datetime2-calc} is loaded, it computes the current day of
%the week (using commands provided by the \sty{pgfcalendar} package)
%which can then be used by \cs{today} or \cs{Today}. If 
%\sty{datetime2-calc} isn't loaded then neither \cs{today} nor
%\cs{Today} will display the day of the week, regardless of the
%current style.
%
%If you would like a more convenient syntax and don't care about
%expansion, there is also a~robust \emph{non-expandable} command that
%can be used to display a~particular date:
%\begin{definition}[\DescribeMacro\DTMdate]
%\cs{DTMdate}\marg{date}
%\end{definition}
%As before there's also a capitalised version:
%\begin{definition}[\DescribeMacro\DTMDate]
%\cs{DTMDate}\marg{date}
%\end{definition}
%In these cases the date should be provided as
%\meta{YYYY}\texttt{-}\meta{MM}\texttt{-}\meta{DD} in the argument
%\meta{date}. For example:
%\begin{verbatim}
%\DTMdate{2015-03-23}
%\end{verbatim}
%
%Note that hyphens must always be used, regardless of
%the separator options. Take care that the category code of the
%hyphen hasn't changed when you use this syntax.
%
%\begin{important}
%The year \meta{YYYY} can't be negative\footnotemark\ in \cs{DTMdate} or
%\cs{DTMDate}. Use \cs{DTMdisplaydate} or 
%\cs{DTMDisplaydate} instead.
%\end{important}\footnotetext{Well, actually it can if you put it in braces
%and don't use \sty{datetime2-calc}.}
%
%These commands internally use \cs{DTMdisplaydate} and
%\cs{DTMDisplaydate}, respectively. If the \sty{datetime2-calc}
%package has been loaded, the day of the week will be computed,
%otherwise the day of the week will be set to \texttt{-1}. Another
%benefit of the \sty{datetime2-calc} package is that it allows
%additional formats permitted by the \sty{pgfcalendar} package:
%\begin{itemize}
%\item \meta{YYYY}\texttt{-}\meta{MM}\texttt{-last} (the last day of
%the given month).
%
%\item
%\meta{YYYY}\texttt{-}\meta{MM}\texttt{-}\meta{DD}\texttt{+-}\meta{n}
%(\meta{n} days before the given date).
%
%\item
%\meta{YYYY}\texttt{-}\meta{MM}\texttt{-}\meta{DD}\texttt{+}\meta{n}
%(\meta{n} days after the given date).
%
%\item \meta{YYYY}\texttt{-}\meta{MM}\texttt{-last+-}\meta{n}
%(\meta{n} days before the last day of
%the given month).
%
%\item \meta{YYYY}\texttt{-}\meta{MM}\texttt{-last+}\meta{n}
%(\meta{n} days after the last day of
%the given month).
%
%\end{itemize}
%See the \sty{pgfcalendar} package for further details.
%
%If you want to be able to use a date in an expandable context that
%can perform these calculations, consider first saving the date using
%one of the commands described in \sectionref{sec:store} and then use
%one of the expandable commands such as \cs{DTMuse} to display the
%date.
%
%An error or unexpected results may occur if you try using one of
%these extended formats without loading the \sty{datetime2-calc}
%package. An example that only works with \sty{datetime2-calc}:
%\begin{verbatim}
%\DTMdate{2015-03-last}
%\end{verbatim}
%An example that works with or without \sty{datetime2-calc}:
%\begin{verbatim}
%\DTMdate{2015-03-31}
%\end{verbatim}
%In this second case, you'll only notice a difference in the output
%if the style should show the day of the week.
%
%The style of the date is the same as for \cs{DTMdisplaydate} and
%\cs{DTMDisplaydate} (which \cs{DTMdate} and \cs{DTMDate} internally
%use, as mentioned above).
%
%A time can be displayed using
%\begin{definition}[\DescribeMacro\DTMdisplaytime]
%\cs{DTMdisplaytime}\marg{hour}\marg{minute}\marg{sec}
%\end{definition}
%where the arguments are all numerical (using 24 hours). The 
%\termdef{time style} currently in effect determines how the time is formatted.
%The command is designed to be used in an expandable context so the
%styles should take care to protect any fragile commands.
%
%Note that this command doesn't display the time zone. To display the
%time zone, you need to use
%\begin{definition}[\DescribeMacro\DTMdisplayzone]
%\cs{DTMdisplayzone}\marg{TZh}\marg{TZm}
%\end{definition}
%where \meta{TZh} is the hour offset and \meta{TZm} is the minute
%offset. The display is governed by the \termdef{zone style}.
%Again, the style should protect any fragile commands in case this is
%used in an expandable context.
%
%The current time (as set at the start of the document build)
%can be displayed using
%\begin{definition}[\DescribeMacro\DTMcurrenttime]
%\cs{DTMcurrenttime}
%\end{definition}
%This internally just uses \cs{DTMdisplaytime} and so is designed for
%use in an expandable context.
%
%The current zone can be displayed using
%\begin{definition}[\DescribeMacro\DTMcurrentzone]
%\cs{DTMcurrentzone}
%\end{definition}
%This internally just uses \cs{DTMdisplayzone} and so is designed for
%use in an expandable context.
%
%\begin{important}
%If the PDF\TeX\ primitive \ics{pdfcreationdate} is defined, the
%current time information is obtained from that, which includes the
%seconds and time zone. Lua\TeX\ also defines this command but
%\XeTeX\ doesn't, and in that case the only way to determine the
%current time is from \TeX's \ics{time} primitive which only contains
%the number of minutes since midnight, which means that the seconds
%and time zone are unavailable. Therefore if \XeTeX\ is used, the
%\pkgopt{showseconds} and \pkgopt{showzone} options are automatically
%switched off.
%\end{important}
%
%There is also a~non-expandable robust command to display the time:
%\begin{definition}[\DescribeMacro\DTMtime]
%\cs{DTMtime}\marg{tm}
%\end{definition}
%where \meta{tm} must be in the 24 hour format 
%\meta{hh}\texttt{:}\meta{mm}\texttt{:}\meta{ss}
%(colon-separated numerical arguments). Take care if you use \sty{babel}
%with a~language setting that makes the colon character active. You
%will have to switch off the shorthands in order to use this command
%correctly.
%
%The full date, time and zone (if available) can be displayed using
%\begin{definition}[\DescribeMacro\DTMdisplay]
%\cs{DTMdisplay}\marg{year}\marg{month}\marg{day}\marg{day of week}\marg{hh}\marg{mm}\marg{ss}\marg{TZh}\marg{TZm}
%\end{definition}
%The arguments are all numerical.  The way the information is
%displayed in the document is governed by the \termdef{full style}
%(or \termdef{date-time style}).
%Typically the full style will redefine this command to use 
%\cs{DTMdisplaydate}, \cs{DTMdisplaytime} and (optionally)
%\cs{DTMdisplayzone}. The \pkgopt{showzone} setting may govern whether
%or not to display the time zone (although a~style may ignore this
%setting). The separators between the date and time and between the time
%and zone are governed by the style.
%
%There is also an analogous version if capitalisation is required:
%\begin{definition}[\DescribeMacro\DTMDisplay]
%\cs{DTMDisplay}\marg{year}\marg{month}\marg{day}\marg{day of week}\marg{hh}\marg{mm}\marg{ss}\marg{TZh}\marg{TZm}
%\end{definition}
%Some styles may simply make this equivalent to \cs{DTMdisplay}.
%Other styles may use a~similar format to \cs{DTMdisplay} but replace
%\cs{DTMdisplaydate} with \cs{DTMDisplaydate}.
%
%The full current date, time and (optionally) zone can be displayed
%using:
%\begin{definition}[\DescribeMacro\DTMnow]
%\cs{DTMnow}
%\end{definition}
%which uses \cs{DTMdisplay} or
%\begin{definition}[\DescribeMacro\DTMNow]
%\cs{DTMNow}
%\end{definition}
%which uses \cs{DTMDisplay}.
%
%\chapter{Storing and Using Dates and Times}
%\label{sec:store}
%
%Date, time and zone information can be saved for later use. Note
%that the information is always saved numerically. The style is only
%applied when the information is later used. The commands that save
%the information are robust and not expandable. The commands that use the
%data are typically expandable although there may be some exceptions. 
%Take care that the colon (\texttt{:}) and hyphen (\texttt{-})
%characters haven't had their normal category code changed. (For
%example, through \sty{babel}'s shortcuts.) In the commands below,
%the \meta{name} (no active characters) is a name that uniquely
%identifies the information.
%
%Dates are saved using
%\begin{definition}[\DescribeMacro\DTMsavedate]
%\cs{DTMsavedate}\marg{name}\marg{date}
%\end{definition}
%where \meta{date} is in the same format as for \cs{DTMdate}.
%As with \cs{DTMdate} (and \cs{DTMDate}) the format can be extended
%with the \sty{datetime2-calc} package. If you want to access the day
%of week, you must make sure that \sty{datetime2-calc} has been
%loaded \emph{before you save the date}. (Remember that the \pkgopt{calc}
%and \pkgopt{showdow} package options will automatically load
%\sty{datetime2-calc}.) If \sty{datetime2-calc} has been loaded, the
%day of week number will be calculated and saved. Whether or not it
%is displayed in the document when the date is later used depends on
%the settings when the date is displayed not when it's saved.
%
%This command will override any previously defined date saved with
%this \meta{name}. If a time or zone hasn't been defined with this
%\meta{name}, the time and zone elements will all be set to 0
%otherwise they will remain unchanged.
%
%Note that you can't have a negative year in \meta{date}. There's an
%alternative command you can use instead that doesn't try parsing
%\meta{date}:
%\begin{definition}[\DescribeMacro\DTMsavenoparsedate]
%\cs{DTMsavenoparsedate}\marg{name}\marg{YYYY}\marg{MM}\marg{DD}\marg{dow}
%\end{definition}
%The day of week \meta{dow} may be \texttt{-1} if unknown. This
%command doesn't calculate the day of week, even if
%\sty{datetime2-calc} has been loaded.
%
%Times are saved using
%\begin{definition}[\DescribeMacro\DTMsavetime]
%\cs{DTMsavetime}\marg{name}\marg{time}
%\end{definition}
%where the \meta{time} is in the same format as for \cs{DTMtime}.
%
%This command will override any previously defined time saved with
%this \meta{name}. If a date or
%zone hasn't been defined with this \meta{name}, the date and zone
%elements will all be set to 0 (or \texttt{-1} for the day of week) otherwise they will remain unchanged.
%
%Times and zone are saved using
%\begin{definition}[\DescribeMacro\DTMsavetimezn]
%\cs{DTMsavetimezn}\marg{name}\marg{time and zone}
%\end{definition}
%where the \meta{time and zone} is in the form
%\begin{display}
%\meta{hh}:\meta{mm}:\meta{ss} \meta{TZh}:\meta{TZm}
%\end{display}
%(Note the space between the seconds and the hour offset.)
%
%This command will override any previously defined time and zone
%saved with this \meta{name}. If a date hasn't been defined with this
%\meta{name}, the year, month and day will be set to zero and the day
%of the week to \texttt{-1} otherwise they will remain unchanged.
%
%All date, time and zone information can be saved at the same time
%using:
%\begin{definition}[\DescribeMacro\DTMsavetimestamp]
%\cs{DTMsavetimestamp}\marg{data}
%\end{definition}
%where \meta{data} is in the format:
%\begin{display}
%\meta{YYYY}-\meta{MM}-\meta{DD}T\meta{hh}:\meta{mm}:\meta{ss}\meta{zone}
%\end{display}
%The \meta{zone} may either be \texttt{Z} or in the form
%\meta{TZh}\texttt{:}\meta{TZm} (for example, \texttt{-03:00}
%or \texttt{-3:0}). This will override any date, time or zone data
%previously saved with this \meta{name}.
%
%The current date and time can be saved using:
%\begin{definition}[\DescribeMacro\DTMsavenow]
%\cs{DTMsavenow}\marg{name}
%\end{definition}
%
%There is also a command that can be used to save the modification
%date of a file, but it's not available for some \TeX\ engines:
%\begin{definition}[\DescribeMacro\DTMsavefilemoddate]
%\cs{DTMsavefilemoddate}\marg{name}\marg{file name}
%\end{definition}
%where \meta{file name} is the name of the file (remember to use
%forward slashes \verb|/| for the directory divider). If you build
%your document using PDF\LaTeX, this command will use the PDF\TeX\
%primitive \cs{pdffilemoddate}. If you use Lua\TeX\ this command will
%attempt to use \texttt{os.date} but it uses \texttt{\%z} for the
%time zone, which may not work on some operating systems. If you use
%\XeLaTeX\ this command will generate a warning and will assume a
%date of 0000-00-00T00:00:00Z.
%
%The above commands are all localised to the current scope. If the
%data is required after the end of the scope, you can make the
%assignments global using:
%\begin{definition}[\DescribeMacro\DTMmakeglobal]
%\cs{DTMmakeglobal}\marg{name}
%\end{definition}
%For example:
%\begin{verbatim}
%\DTMsavenow{mydate}\DTMmakeglobal{mydate}
%\end{verbatim}
%
%A previously saved date can be displayed using the current style
%with
%\begin{definition}[\DescribeMacro\DTMusedate]
%\cs{DTMusedate}\marg{name}
%\end{definition}
%This just uses \cs{DTMdisplaydate}. An error will occur if
%\meta{name} hasn't been defined. Alternatively for the capitalised
%version:
%\begin{definition}[\DescribeMacro\DTMUsedate]
%\cs{DTMUsedate}\marg{name}
%\end{definition}
%which uses \cs{DTMDisplaydate} instead.
%
%A previously saved time can be displayed using the current style
%with
%\begin{definition}[\DescribeMacro\DTMusetime]
%\cs{DTMusetime}\marg{name}
%\end{definition}
%This just uses \cs{DTMdisplaytime}. An error will occur if
%\meta{name} hasn't been defined.
%
%A previously saved zone can be displayed using the current style
%with
%\begin{definition}[\DescribeMacro\DTMusezone]
%\cs{DTMusezone}\marg{name}
%\end{definition}
%This just uses \cs{DTMdisplayzone}. An error will occur if
%\meta{name} hasn't been defined.
%
%The entire date, time and zone can be displayed in the current style
%with
%\begin{definition}[\DescribeMacro\DTMuse]
%\cs{DTMuse}\marg{name}
%\end{definition}
%This uses \cs{DTMdisplay}. An error will occur if
%\meta{name} hasn't been defined. Alternatively,
%\begin{definition}[\DescribeMacro\DTMUse]
%\cs{DTMUse}\marg{name}
%\end{definition}
%will use \cs{DTMDisplay} instead.
%
%You can determine if a given \meta{name} has been defined
%using
%\begin{definition}[\DescribeMacro\DTMifsaveddate]
%\cs{DTMifsaveddate}\marg{name}\marg{true}\marg{false}
%\end{definition}
%
%The individual numerical elements can be fetched using one of the
%following commands. These don't check if the given data identified
%by \meta{name} has been defined and will expand to \cs{relax} if the
%name isn't recognised.
%
%\begin{definition}[\DescribeMacro\DTMfetchyear]
%\cs{DTMfetchyear}\marg{name}
%\end{definition}
%This expands to the year.
%
%\begin{definition}[\DescribeMacro\DTMfetchmonth]
%\cs{DTMfetchmonth}\marg{name}
%\end{definition}
%This expands to the month number.
%
%\begin{definition}[\DescribeMacro\DTMfetchday]
%\cs{DTMfetchday}\marg{name}
%\end{definition}
%This expands to the day of the month.
%
%\begin{definition}[\DescribeMacro\DTMfetchdow]
%\cs{DTMfetchdow}\marg{name}
%\end{definition}
%This expands to the day of the week number (\texttt{-1} if unknown).
%
%\begin{definition}[\DescribeMacro\DTMfetchhour]
%\cs{DTMfetchhour}\marg{name}
%\end{definition}
%This expands to the hour.
%
%\begin{definition}[\DescribeMacro\DTMfetchminute]
%\cs{DTMfetchminute}\marg{name}
%\end{definition}
%This expands to the minute.
%
%\begin{definition}[\DescribeMacro\DTMfetchsecond]
%\cs{DTMfetchsecond}\marg{name}
%\end{definition}
%This expands to the second.
%
%\begin{definition}[\DescribeMacro\DTMfetchTZhour]
%\cs{DTMfetchTZhour}\marg{name}
%\end{definition}
%This expands to the hour offset.
%
%\begin{definition}[\DescribeMacro\DTMfetchTZminute]
%\cs{DTMfetchTZminute}\marg{name}
%\end{definition}
%This expands to the minute offset.
%
%\chapter{Styles}
%\label{sec:styles}
%
%If you want to just change the \term{date style} use:
%\begin{definition}[\DescribeMacro\DTMsetdatestyle]
%\cs{DTMsetdatestyle}\marg{name}
%\end{definition}
%where \meta{name} identifies the style. For example:
%\begin{verbatim}
%\DTMsetdatestyle{iso}
%\end{verbatim}
%This will just change the date style (\cs{DTMdisplaydate} and
%\cs{DTMDisplaydate}), not the time or zone styles. Note that
%\cs{DTMdisplay} typically uses \cs{DTMdisplaydate} so this will also
%change the date element of \cs{DTMdisplay}.
%
%If you want to just change the \term{time style} use:
%\begin{definition}[\DescribeMacro\DTMsettimestyle]
%\cs{DTMsettimestyle}\marg{name}
%\end{definition}
%where \meta{name} identifies the style. For example:
%\begin{verbatim}
%\DTMsettimestyle{iso}
%\end{verbatim}
%This will just change the time style (\cs{DTMdisplaytime}), not the
%date or zone styles. Note that \cs{DTMdisplay} typically uses
%\cs{DTMdisplaytime} so this will also change the time element of
%\cs{DTMdisplay}.
%
%If you want to just change the \term{zone style} use:
%\begin{definition}[\DescribeMacro\DTMsetzonestyle]
%\cs{DTMsetzonestyle}\marg{name}
%\end{definition}
%where \meta{name} identifies the style. For example:
%\begin{verbatim}
%\DTMsetzonestyle{iso}
%\end{verbatim}
%This will just change the zone style (\cs{DTMdisplayzone}), not the
%date or time styles. Note that \cs{DTMdisplay} typically uses
%\cs{DTMdisplayzone} so this will also change the zone element of
%\cs{DTMdisplay}.
%
%If you want to change the \term{full style} use:
%\begin{definition}[\DescribeMacro\DTMsetstyle]
%\cs{DTMsetstyle}\marg{name}
%\end{definition}
%where \meta{name} identifies the style. For example:
%\begin{verbatim}
%\DTMsetstyle{iso}
%\end{verbatim}
%
%Note that in this case this does more than simply
%\begin{verbatim}
%\DTMsetdatestyle{iso}\DTMsettimestyle{iso}\DTMsetzonestyle{iso}
%\end{verbatim}
%as it also changes \cs{DTMdisplay} and \cs{DTMDisplay}.
%If the style \meta{name} is only a \term{partial style}, a~warning
%will be issued for any partial styles that aren't defined for the
%given name as well as a warning for the undefined full style.
%An error will occur if there are neither partial nor full styles
%with the given \meta{name}.
%
%The predefined styles listed in \sectionref{sec:predefinedfull} are all
%\emph{full styles}. This means that they change the date, time, zone
%and full format, so any of them can be used in \cs{DTMsetdatestyle},
%\cs{DTMsettimestyle}, \cs{DTMsetzonestyle} or \cs{DTMsetstyle}.
%However it's possible for a style to be only a \emph{partial style},
%such as those described in \sectionref{sec:predefinedtime}.
%
%For example, if \texttt{foo} is a \term{date style} and
%a \term{time style} but isn't a \term{zone style} or 
%a \term{full style} then you can use
%\begin{verbatim}
%\DTMsetdatestyle{foo}
%\end{verbatim}
%and
%\begin{verbatim}
%\DTMsettimestyle{foo}
%\end{verbatim}
%but you can't use \cs{DTMsetzonestyle}. You can use
%\begin{verbatim}
%\DTMsetstyle{foo}
%\end{verbatim}
%but this will now only be equivalent to
%\begin{verbatim}
%\DTMsetdatestyle{foo}\DTMsettimestyle{foo}
%\end{verbatim}
%and while \cs{DTMdisplay} and \cs{DTMDisplay} will typically use these date
%and time settings, the way that the date, time and zone are arranged
%will be governed by the full style setting that was already in
%effect before the date and time style changed.
%
%The style changes are all local and so are affected by the current
%scope.
%
%\section{Predefined Styles}
%\label{sec:predefinedstyles}
%
%The base \styfmt{datetime2} package provides a number of predefined
%numerical styles. \sectionref{sec:predefinedfull} lists the full styles,
%which can be used with \cs{DTMsetstyle}, \cs{DTMsetdatestyle},
%\cs{DTMsettimestyle} and \cs{DTMsetzonestyle}.
%\sectionref{sec:predefinedtime} lists the predefined (partial) times
%styles, which can be used with \cs{DTMsettimestyle} and
%\cs{DTMsetstyle}.
%
%\subsection{Full Styles}
%\label{sec:predefinedfull}
%
%The following are predefined full styles that are provided by the
%base \styfmt{datetime2} package.  Additional styles are available
%through the language modules (see \sectionref{sec:lang}).
%
%\begin{description}
%\item[\style{default}] The \style{default} style displays the date in the form
%\begin{display}
%\meta{YYYY}\meta{YMsep}\meta{MM}\meta{MDsep}\meta{DD}
%\end{display}
%where the month \meta{MM} and day of the month \meta{DD} numbers are
%formatted as two digits. The separators \meta{YMsep} and
%\meta{MDsep} default to a hyphen but can be changed using the
%options \pkgopt{yearmonthsep}, \pkgopt{monthdaysep} or
%\pkgopt{datesep} (either through the package options or using
%\ics{DTMsetup}).
%
%The time is displayed in the form:
%\begin{display}
%\meta{hh}\meta{HMsep}\meta{mm}\meta{MSsep}\meta{ss}
%\end{display}
%where the hour, month and seconds are formatted as two digits. The
%final \meta{MSsep}\meta{ss} is omitted if the option
%\pkgopt{showseconds} has been set to \texttt{false}. The separators
%\meta{HMsep} and \meta{MSsep} default to a~colon (\texttt{:}) but
%these may be changed using the options \pkgopt{hourminsep},
%\pkgopt{minsecsep} or \pkgopt{datetimesep}.
%
%The zone is displayed in form
%\begin{display}
%\meta{TZh}\meta{HMsep}\meta{TZm}
%\end{display}
%or just \texttt{Z} if the option \pkgopt{showisoZ} is set to
%\texttt{true} and both \meta{TZh} and \meta{TZm} are zero.
%The separator \meta{HMsep} is the same as used for the time format.
%The final \meta{HMsep}\meta{TZm} is omitted if the option
%\pkgopt{showzoneminutes} is set to \texttt{false}. The hour offset
%\meta{TZh} is formatted as two digits proceeded by either \texttt{+}
%or \texttt{-} and the minute offset is formatted as two digits.
%Note that since one of the main purposes of this package is to
%provide expandable date commands that can be used to write
%information to external files, no attempt is made to convert the
%hyphen \texttt{-} (for negative offsets) into a minus sign. If you
%want it rendered correctly in your document, consider placing the
%time zone command in math mode and adjust the separators as
%necessary.
%
%The full style is in the form
%\begin{display}
%\meta{date}\meta{DTsep}\meta{time}\meta{TZsep}\meta{zone}
%\end{display}
%The \meta{date}\meta{DTsep} part is omitted if the option
%\pkgopt{showdate} is set to \texttt{false}, and
%the \meta{TZsep}\meta{zone} part is omitted if the option
%\pkgopt{showzone} is set to \texttt{false}. The separator between
%the date and time \meta{DTsep} defaults to \cs{space} but may be
%changed using the \pkgopt{datetimesep} option. The separator between
%the time and zone \meta{TZsep} defaults to nothing but may be
%changed using the \pkgopt{timezonesep} option.
%
%\item[\style{iso}] The \style{iso} style is like the \style{default}
%style but the separators can't be changed. The separators used in
%the date format are fixed as hyphens and the separators used in the
%time and zone formats are fixed as colons. In the full format, the separator between the
%date and time is fixed as \texttt{T} and there's no separator between the
%time and zone. The only options that can change the \style{iso}
%style are \pkgopt{showseconds}, \pkgopt{showdate}, \pkgopt{showzone},
%\pkgopt{showzoneminutes} and \pkgopt{showisoZ}.
%
%\item[\style{yyyymd}] This is like the \style{default} style
%except that the month and date aren't forced into a two-digit
%format.
%
%\item[\style{ddmmyyyy}] This is like the \style{default} style
%except that the date is formatted in the reverse order
%\begin{display}
%\meta{DD}\meta{MDsep}\meta{MM}\meta{YMsep}\meta{YYYY}
%\end{display}
%The day and month are displayed as two-digits and the separators are
%as for the \style{default} style. The options that modify the
%\style{default} style similarly modify this style.
%
%\item[\style{dmyyyy}] This is like the \style{ddmmyyyy} style except
%that it doesn't force the day and month into a~two-digit format.
%The options that modify the
%\style{default} style similarly modify this style.
%
%\item[\style{dmyy}] This is like the \style{dmyy} style except
%that it only displays the final two digits of the year.
%The options that modify the
%\style{default} style similarly modify this style.
%
%\item[\style{mmddyyyy}] This is like the \style{ddmmyyyy} style
%except the day and month numbers are reversed. The separator between
%the month and day is still given by the \pkgopt{monthdaysep} or 
%\pkgopt{datesep} options. The separator between the day and year is given by
%the \pkgopt{dayyearsep} or \pkgopt{datesep} options.
%
%\item[\style{mdyyyy}] This is like the \style{mmddyyyy} style except
%that it doesn't force the day and month into a~two-digit format.
%
%\item[\style{mdyy}] This is like the \style{mdyyyy} style except
%that the year only has the final two digits displayed.
%
%\item[\style{pdf}] This formats the date, time and zone so that the
%full style is in the form required by the date settings in
%\ics{pdfinfo}. The date format is
%\begin{display}
%D:\meta{YYYY}\meta{MM}\meta{DD}
%\end{display}
%where the month and day numbers are displayed as two digits.
%
%The time format is
%\begin{display}
%\meta{hh}\meta{mm}\meta{ss}
%\end{display}
%where the numbers are displayed as two digits.
%
%The zone format is
%\begin{display}
%\meta{hh}'\meta{mm}'
%\end{display}
%or Z for zero time offset if the option \pkgopt{showisoZ} is
%used. (The \pkgopt{showisoZ} option is the only option that modifies
%the \style{pdf} style.) The hour and minutes are displayed as two
%digits where the hour has the sign present (either \texttt{+} or
%\texttt{-}).
%
%The full style is a concatenation of the date, time and zone.
%\begin{display}
%D:\meta{YYYY}\meta{MM}\meta{DD}\meta{hh}\meta{mm}\meta{ss}\meta{hh}'\meta{mm}'
%\end{display}
%
%\end{description}
%
%\subsection{Time Styles}
%\label{sec:predefinedtime}
%
%There's only one predefined time (partial) style provided
%by the base \styfmt{datetime2} package. This style can be used to
%override the time format part of full styles. For example, to use
%the \style{default} full style with the \sty{hmmss} time style:
%\begin{verbatim}
%\DTMsetstyle{default}\DTMsettimestyle{hmmss}
%\end{verbatim}
%
%\begin{description}
%\item[\style{hmmss}] The \style{hmmss} style is like the time style
%provided by the full \style{default} style except that the hour
%isn't forced into two digits.
%
%\end{description}
%
%\subsection{Zone Styles}
%\label{sec:predefinedzone}
%
%The following are predefined zone (partial) styles that are provided
%by the base \styfmt{datetime2} package. These styles can be used to
%override the zone format part of full styles. For example, to use
%the \style{default} full style with the \style{map} zone style:
%\begin{verbatim}
%\DTMsetstyle{default}\DTMsetzonestyle{map}
%\end{verbatim}
%
%\begin{description}
%\item[\style{map}] The \style{map} style uses
%\cs{DTMusezonemapordefault} to display the mapping, if one exists,
%or use the default style, if a mapping doesn't exist. For example:
%\begin{verbatim}
%\DTMNatoZoneMaps
%\DTMsetzonestyle{map}
%\end{verbatim}
%This first defines the NATO mappings and then switches to the
%\style{map} style.
%
%\item[\style{hhmm}] The \style{hhmm} style displays the time zone in
%the form
%\begin{display}
%\meta{TZh}\meta{HMsep}\meta{TZm}
%\end{display}
%where \meta{HMsep} is given by the \pkgopt{hourminsep} option.
%This style honours the \pkgopt{showzoneminutes} option
%but ignores the \pkgopt{showisoZ} option. The hour is always
%prefixed by the sign.
%
%\end{description}
%
%\section{Defining New Styles}
%\label{sec:newstyle}
%
%A new \term{date style} can be defined using:
%\begin{definition}[\DescribeMacro\DTMnewdatestyle]
%\cs{DTMnewdatestyle}\marg{name}\marg{definition}
%\end{definition}
%This defines a \term{partial style} that should only modify 
%\cs{DTMdisplaydate} and \cs{DTMDisplaydate}. The redefinition of
%these commands should be placed in \meta{definition}.
%
%A new \term{time style} can be defined using:
%\begin{definition}[\DescribeMacro\DTMnewdatestyle]
%\cs{DTMnewtimestyle}\marg{name}\marg{definition}
%\end{definition}
%This defines a \term{partial style} that should only modify 
%\cs{DTMdisplaytime}. The redefinition should be placed in 
%\meta{definition}.
%
%A new \term{zone style} can be defined using:
%\begin{definition}[\DescribeMacro\DTMnewzonestyle]
%\cs{DTMnewzonestyle}\marg{name}\marg{definition}
%\end{definition}
%This defines a \term{partial style} that should only modify 
%\cs{DTMdisplayzone}. The redefinition should be placed in 
%\meta{definition}.
%
%A new \term{full style} can be defined using:
%\begin{definition}[\DescribeMacro\DTMnewstyle]
%\cs{DTMnewstyle}\marg{name}\marg{date style definition}\marg{time
%style definition}\marg{zone style definition}\marg{full style definition}
%\end{definition}
%This does
%\begin{display}
%\cs{DTMnewdatestyle}\marg{name}\marg{date style definition}\newline
%\cs{DTMnewtimestyle}\marg{name}\marg{time style definition}\newline
%\cs{DTMnewzonestyle}\marg{name}\marg{zone style definition}\newline
%\end{display}
%and finally \meta{full style definition} should redefine
%\cs{DTMdisplay} and \cs{DTMDisplay}.
%
%\begin{important}
%Remember to use a double-hash to reference the parameters (\verb|##1|,
%\verb|##2| etc) within \meta{definition} in all the above.
%In each case \meta{name} is the label identifying the style
%and shouldn't contain active characters.
%\end{important}
%
%There are some helper commands provided that you might want to use
%in the style definitions.
%
%\begin{definition}[\DescribeMacro\DTMtwodigits]
%\cs{DTMtwodigits}\marg{number}
%\end{definition}
%This displays \meta{number} so that it has \emph{only} two digits.
%Unlike \LaTeX's \cs{two@digits} this will check for a negative
%number and will trim a number whose absolute value is greater
%than 100. This command is expandable.
%
%\begin{definition}[\DescribeMacro\DTMcentury]
%\cs{DTMcentury}\marg{year}
%\end{definition}
%This converts \meta{year} to the century. If \meta{year} is negative it does:
%\begin{display}
%\texttt{-\cs{DTMcentury}\{-\meta{year}\}}
%\end{display}
%Example:
%\begin{verbatim}
%\DTMcentury{1945}
%\end{verbatim}
%expands to \DTMcentury{1945} (not 19). Note that
%\begin{verbatim}
%\DTMcentury{1900}
%\end{verbatim}
%expands to \DTMcentury{1900}.
%
%\begin{definition}[\DescribeMacro\DTMdivhundred]
%\cs{DTMdivhundred}\marg{number}
%\end{definition}
%This expands to $\lfloor\meta{number}/100\rfloor$ (integer division
%by 100 rounded down). For example:
%\begin{verbatim}
%\DTMdivhundred{1945}
%\end{verbatim}
%expands to \DTMdivhundred{1945} and
%\begin{verbatim}
%\DTMdivhundred{1900}
%\end{verbatim}
%expands to \DTMdivhundred{1900}.
%
%\begin{definition}[\DescribeMacro\DTMtexorpdfstring]
%\cs{DTMtexorpdfstring}\marg{\TeX}\marg{PDF}
%\end{definition}
%If \sty{hyperref} is loaded, this is equivalent to
%\cs{texorpdfstring} otherwise it just does the first argument and
%ignores the second. (The check for \sty{hyperref} is deferred until
%the start of the \env{document} environment, so it doesn't matter if
%\sty{hyperref} is loaded after \styfmt{datetime2}.) This command may
%be used to provide alternative text to use if the date\slash
%time\slash zone is displayed in the PDF bookmarks.
%
%\begin{definition}[\DescribeMacro\DTMsep]
%\cs{DTMsep}\marg{tag}
%\end{definition}
%This accesses the value of the \meta{tag}\texttt{sep} base package
%option. (Not the language module options.)
%For example
%\begin{verbatim}
%\DTMsep{yearmonth}
%\end{verbatim}
%expands to the value supplied by the \pkgopt{yearmonthsep} package option.
%
%\begin{definition}[\DescribeMacro\DTMusezonemap]
%\cs{DTMusezonemap}\marg{TZh}\marg{TZm}
%\end{definition}
%This expands to the time zone abbreviation or \cs{relax} if no
%mapping has been set for the given time zone.
%
%You can define a time zone mapping using
%\begin{definition}[\DescribeMacro\DTMdefzonemap]
%\cs{DTMdefzonemap}\marg{TZh}\marg{TZm}\marg{abbr}
%\end{definition}
%For example
%\begin{verbatim}
%\DTMdefzonemap{00}{00}{GMT}
%\DTMdefzonemap{01}{00}{BST}
%\end{verbatim}
%Note that \styfmt{datetime2} doesn't know anything about daylight
%saving, so this is only really designed for dates and times 
%in a~specific location. This overwrites any previous mapping
%for this time zone.
%
%The base \styfmt{datetime2} package provides
%\begin{definition}[\DescribeMacro\DTMNatoZoneMaps]
%\cs{DTMNatoZoneMaps}
%\end{definition}
%This defines the military\slash NATO mappings from A (Alpha time) to
%Z (Zulu time). You can use this command if you want these time zones
%(but remember to set an appropriate time zone style that uses
%the zone mappings).
%
%The language modules may provide mappings that are enabled
%when you switch to that style. For example, the \texttt{en-GB}
%language module provides the \pkgopt{mapzone} option which, if set
%to \texttt{true}, will map +00:00 to GMT and +01:00 to BST. See the
%documentation for the language module for further details.
%
%\begin{definition}[\DescribeMacro\DTMclearmap]
%\cs{DTMclearmap}\marg{TZh}\marg{TZm}
%\end{definition}
%Clears the time zone mapping. The regional time zone styles should
%use
%\begin{definition}[\DescribeMacro\DTMresetzones]
%\cs{DTMresetzones}
%\end{definition}
%before applying any regional mappings. This defaults to nothing
%which means that any mappings previously defined by other styles
%won't be cleared. You can redefine this command if you want to clear
%any mappings that aren't relevant for other regions.
%
%You can test if a~mapping is defined using
%\begin{definition}[\DescribeMacro\DTMhaszonemap]
%\cs{DTMhaszonemap}\marg{TZh}\marg{TZm}\marg{true}\marg{false}
%\end{definition}
%This will do \meta{true} if there is a mapping defined for that time
%zone or \meta{false} otherwise.
%
%\begin{definition}[\DescribeMacro\DTMusezonemapordefault]
%\cs{DTMusezonemapordefault}\marg{TZh}\marg{TZm}
%\end{definition}
%This will use the mapping if its defined otherwise it 
%will expand to the format
%\meta{TZh}\meta{HMsep}\meta{TZm}
%where \meta{HMsep}\meta{TZm} is omitted if the option
%\pkgopt{showzoneminutes} is set to \texttt{false}. The separator
%\meta{HMsep} is as given by the \pkgopt{hourminsep} option. (The
%\pkgopt{showisoZ} option isn't used here so UTC+00:00 will be
%displayed as +00:00 or +00 if there's no mapping.)
%
%Here's an example of a simple date style that just displays the year
%and month as two digits but uses the \pkgopt{yearmonthsep} option:
%\begin{verbatim}
%\newdatestyle
% {mmyy}% label
% {% definitions
%   \renewcommand*{\DTMdisplaydate}[4]{%
%     \DTMtwodigits{##2}\DTMsep{yearmonth}\DTMtwodigits{##1}}%
%   \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
% }
%\end{verbatim}
%
%If you want to distribute your new styles, just put the definitions
%in a package and upload it to CTAN. For example (replace
%\texttt{mystylename} with something more appropriate, and also
%change the date in the \cs{ProvidesPackage} line):
%\begin{verbatim}
% \NeedsTeXFormat{LaTeX2e}
% \ProvidesPackage{mystylename}[2014/03/24 v1.0]
% \RequirePackage{datetime2}
%
% % style definitions here
%
% \endinput
%\end{verbatim}
%Save the file as \texttt{mystylename.sty}, add some documentation
%about the style (or styles) provided and read the instructions at
%\url{http://www.ctan.org/upload} and
%\url{http://www.ctan.org/file/help/ctan/CTAN-upload-addendum}. The upload location
%for additions to the \styfmt{datetime2} package (either for
%packages defining new styles or for language modules) should be
%\texttt{/macros\slash latex\slash datetime2-contrib\slash mystylename} (remember to
%replace \texttt{mystylename} as appropriate).
%
%\chapter{Multi-Lingual Support}
%\label{sec:lang}
%
%If you want to use \styfmt{datetime2} with \sty{babel} or
%\sty{polyglossia}, make sure you load
%\sty{babel}\slash\sty{polyglossia} \emph{before} you load
%\styfmt{datetime2} otherwise their \cs{date}\meta{language} will
%overwrite \cs{datetime}'s definition of \cs{today}.
%\emph{Additionally} you need to make sure you install the relevant
%\styfmt{datetime2} language modules. These modules are automatically
%loaded, if required, by \styfmt{datetime2} but only if they are
%already installed. Remember that if you use \XeLaTeX\ you won't have
%the seconds or time zone available for the current date and time.
%
%\begin{important}
%If the required language modules aren't installed or
%\styfmt{datetime2} is loaded before
%\sty{babel}\slash\sty{polyglossia} then \styfmt{datetime2}'s
%definition of \cs{today} will be overridden and may no longer match
%the currently selected date style.
%\end{important}
%
%Each language module defines a textual style (where the month is
%displayed as a word) for that language or region
%which can be used in the argument of \cs{DTMsetstyle},
%\cs{DTMsetdatestyle}, \cs{DTMsettimestyle} or \cs{DTMsetzonestyle}.
%The language module may also define a numeric style. In the
%ambiguous cases where the language name alone doesn't indicate the
%region (for example, \texttt{english} instead of \texttt{UKenglish} or
%\texttt{USenglish}) the module should use the \style{default} numeric
%style (see \sectionref{sec:predefinedfull}).
%
%The textual style provided by the module will automatically be
%set using \cs{DTMsetstyle} \emph{if the \pkgopt{useregional}
%option is set to \texttt{text}}. By default \pkgopt{useregional} is
%\texttt{false}, unless the language\slash region is passed via the
%\styfmt{datetime2} package option list. (The \pkgopt{useregional}
%option is unaffected if the setting is passed through the document
%class option list.) The numeric style provided by the module will
%automatically be set if the \pkgopt{useregional} option is set to
%\texttt{numeric}. See the descriptions for the \pkgopt{useregional}
%and \pkgopt{style} options in \sectionref{sec:pkgopt}.
%
%\begin{important}
%Be careful not to mix the language\slash region options between the document
%class option list and the \sty{babel}\slash\sty{polyglossia}
%interface. For example:
%\begin{verbatim}
%\documentclass[en-GB]{article}
%\usepackage[canadien,british]{babel}
%\end{verbatim} 
%This will prevent the \sty{tracklang} package from picking up the
%\sty{babel} setting and it will only detect the \texttt{en-GB}
%option. Use only the document class options or only the \sty{babel}
%package option list or duplicate \emph{all} the \sty{babel} package options with
%analogous \sty{tracklang} options in the document class. For example
%\begin{verbatim}
%\documentclass[canadien,british]{article}
%\usepackage{babel}
%\end{verbatim} 
%or
%\begin{verbatim}
%\documentclass{article}
%\usepackage[canadien,british]{babel}
%\end{verbatim} 
%or
%\begin{verbatim}
%\documentclass[fr-CA,en-GB]{article}
%\usepackage[canadien,british]{babel}
%\end{verbatim} 
%\end{important}
%Language modules may be used without \sty{babel} or \sty{polyglossia}.
%For example:
%\begin{verbatim}
%\documentclass{article}
%\usepackage[en-GB]{datetime2}
%\begin{document}
%\today
%\end{document}
%\end{verbatim} 
%If you have more than one language or region you will need to switch
%styles using \cs{DTMsetstyle} etc:
%\begin{verbatim}
%\documentclass{article}
%\usepackage[en-GB,en-CA]{datetime2}
%\begin{document}
%\DTMsetstyle{en-GB}\today.
%\DTMsetstyle{en-CA}\today
%\end{document}
%\end{verbatim} 
%
%If you want to change the number separators for the \emph{regional}
%numeric styles, you need to use \cs{DTMlangsetup}. If you want to
%change the number separators for the base \styfmt{datetime2}
%predefined numeric styles (see \sectionref{sec:predefinedstyles})
%then you need to use \cs{DTMsetup} or the package options. You
%therefore need to use \cs{DTMsetup} for the ambiguous regionless
%language numeric settings since they just use the \style{default}
%style. Check the module documentation to find out if the
%\style{default} style is used.
%
%Examples of use:
%\begin{enumerate}
%\item Language option specified through the document class and
%picked up by \sty{tracklang} (which is loaded by \styfmt{datetime2}).
%This setting is also picked up by \sty{babel} which is loaded before
%\styfmt{datetime2}.
%\begin{verbatim}
%\documentclass[british]{article}
%
%\usepackage{babel}
%\usepackage{datetime2}
%
%\begin{document}
%\today
%\end{document}
%\end{verbatim}
%The date is displayed in the default format 2015-03-01.
%
%In this case, the \texttt{en-GB} language module is loaded which
%defines the text style \style{en-GB} and the numeric style
%\style{en-GB-numeric}. Since \pkgopt{useregional} hasn't been set,
%\cs{today} uses \styfmt{datetime2}'s \style{default} numerical format.
%If \sty{babel} was loaded after \styfmt{datetime2}, the
%\sty{babel}'s hook management system would overwrite
%\styfmt{datetime2}'s definition of \cs{today} so that it no longer used
%\ics{DTMdisplaydate}. A similar result is obtained if in the above
%example \sty{babel} is replaced with \sty{polyglossia} (where the
%language is set in the document class option).
%
%You can change the \pkgopt{useregional} setting either through
%\styfmt{datetime2}'s package options or using \ics{DTMsetup} however
%it will only have an effect during the module loading (when the
%value is changed via the package option) and when
%\cs{date}\meta{language} is used.
%
%For example, in the document below, the date is displayed using the
%\style{default} numeric format because \pkgopt{useregional} has been
%changed \emph{after} \sty{babel} uses \cs{datebritish} to set the
%language at the start of the document.
%\begin{verbatim}
%\documentclass[british]{article}
%
%\usepackage{babel}
%\usepackage{datetime2}
%
%\begin{document}
%\DTMsetup{useregional}
%\today
%\end{document}
%\end{verbatim}
%So here \cs{today} again displays the date in the form 2015-03-01. 
%
%If the setting is moved to the preamble:
%\begin{verbatim}
%\documentclass[british]{article}
%
%\usepackage{babel}
%\usepackage{datetime2}
%
%\DTMsetup{useregional}
%\begin{document}
%\today
%\end{document}
%\end{verbatim}
%then the \pkgopt{useregional} setting is checked at the beginning of
%the document when \sty{babel} uses \cs{datebritish}. So in this case
%\cs{today} will display the date in the form 1st March 2015.
%
%\item Language setting specified through \sty{babel}'s package
%option list:
%\begin{verbatim}
%\documentclass{article}
%
%\usepackage[british]{babel}
%\usepackage{datetime2}
%
%\begin{document}
%\today
%\end{document}
%\end{verbatim}
%This has the same result as placing \texttt{british} in the document
%class option list, so the date is again displayed in the default
%format 2015-03-01 but, as in the previous example, the \style{en-GB}
%and \style{en-GB-numeric} styles are both defined if required.
%
%However a problem occurs if \sty{babel} is replaced by 
%\sty{polyglossia}:
%\begin{verbatim}
%\documentclass{article}
%
%\usepackage{fontspec}
%\usepackage{polyglossia}
%\setdefaultlanguage[variant=uk]{english}
%
%\usepackage{datetime2}
%
%\begin{document}
%\today
%\end{document}
%\end{verbatim}
%In this case \sty{tracklang} is unable to pick up the variant and
%can only detect the root language, so it will load the generic
%\texttt{english} module instead of the \texttt{en-GB} module. This
%means that the \style{en-GB} and \style{en-GB-numeric} styles are no longer
%available. However, since \pkgopt{useregional} is \texttt{false} the
%date is still displayed using the \texttt{default} numeric style
%in the form 2015-03-01.
%
%\item As mentioned above neither \sty{babel} nor \sty{polyglossia} are required in
%order to use the \styfmt{datetime2} language modules. You can simply
%supply the language setting in the package option list:
%\begin{verbatim}
%\documentclass{article}
%
%\usepackage[british]{datetime2}
%
%\begin{document}
%\today
%\end{document}
%\end{verbatim}
%This additionally sets \pkgopt[true]{useregional} (since the
%language is in the package option list not the document class option
%list) so the date produced by \cs{today} now uses the \texttt{en-GB}
%date style in the form 1st March 2015.
%
%\item The regional numeric format can be used instead if
%\pkgopt{useregional} is set to \texttt{numeric}:
%\begin{verbatim}
%\documentclass{article}
%
%\usepackage[british,useregional=numeric]{datetime2}
%
%\begin{document}
%\today
%\end{document}
%\end{verbatim}
%This now displays the date in the form 1/3/2015.
%\end{enumerate}
%
%Many of the language options have synonyms. In addition to the
%\sty{babel} synonyms (such as \pkgopt{british} or
%\pkgopt{UKenglish}) the \sty{tracklang} package provides options in
%ISO form, such as \pkgopt{en-GB}. Note that the style name provided
%by each language module is independent of the package option used
%to select that style. So regardless of whether you use
%\pkgopt{british}, \pkgopt{UKenglish} or \pkgopt{en-GB}, the text style
%name is \style{en-GB} and the numeric style name is
%\style{en-GB-numeric}. If just \pkgopt{english} is used, the text
%style name is \style{english} but the numeric style is
%\style{default}.
%
%Languages where the region is automatically implied, such
%as \pkgopt{scottish}, provide a text style with the root language
%name (\style{scottish} in this instance) and a numeric style in the
%form \meta{language}\texttt{-numeric} (such as \style{scottish-numeric}).
%Note that \texttt{irish} has regionless styles \texttt{irish} and
%\texttt{irish-numeric} but also has regional styles
%\texttt{ga-IE} and \texttt{ga-IE-numeric} (for the Republic of
%Ireland) and \texttt{ga-GB} and \texttt{ga-GB-numeric} (for Northern
%Ireland). In this case the regionless style has a numeric style
%instead of using the \style{default} style since both
%\texttt{ga-IE-numeric} and \texttt{ga-GB-numeric} are the same so
%there's no ambiguity.  The only difference in the three modules
%\texttt{datetime2-irish}, \texttt{datetime2-ga-IE} and
%\texttt{datetime2-ga-GB} is the time zone mappings.
%
%The language modules may provide additional settings that can be
%applied using
%\begin{definition}[\DescribeMacro\DTMlangsetup]
%\cs{DTMlangsetup}\oarg{language list}\marg{options}
%\end{definition}
%where \meta{language list} is a comma-separated list of language
%modules that have been loaded (such as \texttt{en-GB,en-US})
%and \meta{options} is a \meta{key}=\meta{value} list of options.
%If \meta{language list} is omitted, then the list of all loaded
%language modules is assumed. The modules may also provided 
%user commands to further customise the style. These settings should
%all be described in the module's documentation, which should be
%accessible via \texttt{texdoc datetime2-\meta{language}} where
%\meta{language} is the root language name in lower case 
%(such as \texttt{english}).
%
%Note that although I~maintain the \styfmt{datetime2} English
%language module, I~don't maintain the other modules. If you have an
%issue with one of the other modules, please contact the module
%maintainer. If there is no maintainer, feel free to volunteer to
%take over the maintenance (\href{http://www.dickimaw-books.com/contact.html}{send me a
%message}). If there's no module for your language
%you can create your own module and upload it to CTAN in the 
%\texttt{/macros\slash latex\slash datetime2-contrib\slash
%datetime2-\meta{language}} directory.
%
%You can use the English or Irish modules as a template for a
%language with multiple regions. Just download the English source
%files \texttt{datetime2-english.dtx} and
%\texttt{datetime2-english.ins} or the Irish source files
%\texttt{datetime2-irish.dtx} and \texttt{datetime2-irish.ins} from
%CTAN and make the appropriate modifications. Alternatively you can
%use the Scottish module as a template for a single-region language.
%Just download the Scottish source files \texttt{datetime2-scottish.dtx} and
%\texttt{datetime2-scottish.ins} from CTAN and make the appropriate
%modifications. (Don't forget to provide a README file.)
%
%Each language module should be in a file named
%\texttt{datetime2-\meta{lang}.ldf} where \meta{lang} is the language
%name or \meta{language ISO code}\texttt{-}\meta{country ISO code}. (See the
%\sty{tracklang} documentation for further details of the naming
%scheme.)
%
%\begin{important}
%If you want to provide a language module don't assume all users want
%to use the same input encoding or \sty{babel} shortcuts as you. Use \LaTeX\
%commands for non-ASCII characters (and remember to use \cs{protect}
%where necessary).
%\end{important}
%
%As an addendum to the above warning, Lua\TeX\ and \XeTeX\ support
%UTF-8 characters without the need to make them active, so
%I~recommend you provide two files: one with the \LaTeX\ commands,
%such as \cs{c}, for (PDF)\LaTeX\ users, and one with UTF-8 characters
%for Lua\LaTeX\ and \XeLaTeX\ users. For example, the \texttt{fr-FR} module
%could start with:
%\begin{verbatim}
%\ProvidesDateTimeModule{fr-FR}
%
%\RequirePackage{ifxetex,ifluatex}
%
%\ifxetex
% \RequireDateTimeModule{french-utf8}
%\else
% \ifluatex
%   \RequireDateTimeModule{french-utf8}
% \else
%   \RequireDateTimeModule{french-ascii}
% \fi
%\fi
%\end{verbatim}
%
%This helps provide fully expandable dates for Lua\LaTeX\ and
%\XeLaTeX\ users. (See the Scottish or Irish modules.)
%
%\chapter{Package Options}
%\label{sec:pkgopt}
%
%The following package options are provided. Most of these are
%\meta{key}=\meta{value} options, unless stated otherwise.
%
%Settings that govern the predefined numerical styles (not including
%the fixed styles \style{iso} and \style{pdf}):
%\begin{description}
%\item[\pkgopt{yearmonthsep}] This sets the separator between the
%year and month for the big-endian and little-endian styles.
%Default: \texttt{-} (hyphen).
%
%\item[\pkgopt{monthdaysep}] This sets the separator between the
%month and day.
%Default: \texttt{-} (hyphen).
%
%\item[\pkgopt{dayyearsep}] This sets the separator between the
%day and year for the middle-endian styles.
%Default: \texttt{-} (hyphen).
%
%\item[\pkgopt{datesep}] This sets the separators between the day and
%month, the month and year, and the day and year.  Example:
%\begin{verbatim}
%\usepackage[datesep=/]{datetime2}
%\end{verbatim}
%This is equivalent to:
%\begin{verbatim}
%\usepackage[yearmonthsep=/,monthdaysep=/,dayyearsep=/]{datetime2}
%\end{verbatim}
%
%\item[\pkgopt{hourminsep}] This sets the separator between the hour
%and minute. (Both for the time and for the zone.)
%Default: \texttt{:} (colon).
%
%\item[\pkgopt{minsecsep}] This sets the separator between the minute
%and seconds.
%Default: \texttt{:} (colon).
%
%\item[\pkgopt{timesep}] This sets the separators between the hour
%and minute and between the minute and seconds. 
%Example:
%\begin{verbatim}
%\usepackage[timesep=:]{datetime2}
%\end{verbatim}
%This is equivalent to:
%\begin{verbatim}
%\usepackage[hourminsep=:,minsecsep=:]{datetime2}
%\end{verbatim}
%\end{description}
%
%The following settings are used by the predefined numerical styles when 
%displaying the full date, time and zone (excluding the fixed styles \style{iso}
%and \style{pdf}) with commands that use \cs{DTMdisplay} or
%\cs{DTMDisplay}.
%\begin{description}
%\item[\pkgopt{datetimesep}] Sets the separator between the date and
%time.
%Default: \cs{space}.
%
%\item[\pkgopt{timezonesep}] Sets the separator between the time and
%zone.
%Default: empty.
%
%\end{description}
%
%The following settings are used by the predefined styles and may
%also be used by the language modules.
%\begin{description}
%\item[\pkgopt{showseconds}] Boolean key to determine whether or not
%to show the seconds when the time is displayed. The \style{iso}
%style honours this setting but the \style{pdf} style ignores it.
%Default: \texttt{true} unless \XeTeX\ is used.
%
%\item[\pkgopt{showdate}] Boolean key to determine whether or not to
%show the date with commands that use \cs{DTMdisplay} or
%\cs{DTMDisplay}. (Some styles may ignore this.) The \style{iso}
%style honours this setting but the \style{pdf} style ignores it.
%Default: \texttt{true} unless \XeTeX\ is used.
%
%\item[\pkgopt{showzone}] Boolean key to determine whether or not to
%show the time zone with commands that use
%\cs{DTMdisplay} or \cs{DTMDisplay}. (Some styles may ignore this.) The \style{iso} style honours this setting but the
%\style{pdf} style ignores it.
%Default: \texttt{true} unless \XeTeX\ is used.
%
%\item[\pkgopt{showzoneminutes}] Boolean key to determine whether or
%not to show the zone offset minutes. The \style{iso} style honours
%this setting but the \style{pdf} style ignores it. This setting is
%ignored if \pkgopt{showzone} is \texttt{false}.
%Default: \texttt{true}.
%
%\item[\pkgopt{showisoZ}] Boolean key to determine whether or not to
%show UTC+00:00 as \texttt{Z} instead of numerically. This option
%may be ignored by zone styles that use the zone mappings. If you
%want all the time zones in military form, you can use
%\cs{DTMNatoZoneMaps} to set up the time zone abbreviations and then
%use a zone style that uses the mappings.
%Default: \texttt{true}.
%
%\end{description}
%
%General settings:
%\begin{description}
%\item[\pkgopt{useregional}] Allowed values: \texttt{false},
%\texttt{text} or \texttt{numeric}. You may also use \texttt{num} as
%an abbreviation for \texttt{numeric}. If no value is supplied
%\texttt{text} is assumed.
%
%This key determines whether or not to \emph{use} the loaded regional 
%settings and, if the regional setting should be used, it determines
%whether the text style (months as words) or numeric style should be
%used. If you haven't loaded \sty{babel} or \sty{polyglossia}, this
%key only has an effect when used as a package option. If you have
%loaded one of those packages, the change comes into effect at module
%load time and whenever \cs{date}\meta{language} is used (which
%includes at the beginning of the \env{document} environment). If you want
%to switch the style at any other time, you need to use
%\cs{DTMsetstyle} but unless \pkgopt[false]{useregional} the next
%instance of \cs{date}\meta{language} will change the style.
%
%Note that setting this option to \texttt{false} doesn't prevent the modules 
%from being loaded. It just prevents them from automatically setting the style
%and prevents \cs{date}\meta{language} from changing the style if you
%are using \sty{babel} or \sty{polyglossia}.
%
%The default value is \texttt{false} unless the language or region is
%passed to the \styfmt{datetime2} package option list. However, using \pkgopt{style}
%will set \pkgopt{useregional} to \texttt{false}.
%
%Examples:
%\begin{verbatim}
%\documentclass[british]{article}
%\usepackage{babel}
%\usepackage{datetime2}
%\end{verbatim}
%In the above \pkgopt{useregional} is \texttt{false}.
%
%\begin{verbatim}
%\documentclass{article}
%\usepackage[british]{datetime2}
%\end{verbatim}
%In the above \pkgopt{useregional} is \texttt{text}.
%
%\begin{verbatim}
%\documentclass{article}
%\usepackage[british,style=iso]{datetime2}
%\end{verbatim}
%In the above \pkgopt{useregional} is \texttt{false}. (The
%\pkgopt{british} option implements \pkgopt[text]{usenumerical}
%but the \pkgopt{style} option then implements
%\pkgopt[false]{usenumerical}.)
%
%\begin{verbatim}
%\documentclass{article}
%\usepackage[style=iso,british]{datetime2}
%\end{verbatim}
%In the above \pkgopt{useregional} is \texttt{text}. (The
%\pkgopt{style} option implements \pkgopt[false]{usenumerical}
%but the \pkgopt{british} option then implements
%\pkgopt[text]{usenumerical}.)
%
%\item[\pkgopt{style}] Sets the current style using \cs{DTMsetstyle}
%when the \styfmt{datetime2} package has finished loading. This also sets
%\pkgopt[false]{useregional} but that setting can be overridden later
%in the option list.
%
%Default value: empty (use the default style or the regional style,
%according to the value of \pkgopt{useregional}).
%
%This key isn't available in \cs{DTMsetup}. Use \cs{DTMsetstyle} instead.
%
%\item[\pkgopt{calc}] Load the \sty{datetime2-calc} package. This
%will allow the day of week to be computed and allow you to use the
%\sty{pgfcalendar} offset style date formats in commands like
%\cs{DTMdate} as well as defining the commands described in
%\sectionref{sec:calc}. This option doesn't take a value. It can't be switched
%off. This option can't be used in \cs{DTMsetkeys}. The default is to
%not load \sty{datetime2-calc}.
%
%\item[\pkgopt{showdow}] This is a boolean key that determines
%whether or not to show the day of week in styles that support this.
%Note that \pkgopt[true]{showdow} will automatically load
%\sty{datetime2-calc} so
%\begin{verbatim}
%\usepackage[showdow]{datetime2}
%\end{verbatim}
%is equivalent to 
%\begin{verbatim}
%\usepackage[showdow,calc]{datetime2}
%\end{verbatim}
%
%This option may be used in \cs{DTMsetup}, but if you attempt to
%switch it on in the \env{document} environment you'll get an error
%if the \sty{datetime2-calc} package hasn't been loaded.
%Default: \texttt{false}.
%
%\item[\pkgopt{warn}] This is a boolean key. If true (default)
%\styfmt{datetime2} warnings will be displayed. If false, the warnings
%will be suppressed.
%Default: \texttt{true}.
%
%\end{description}
%
%Any additional option passed to the \styfmt{datetime2} package (not
%through \cs{DTMsetup}) will be considered a \sty{tracklang} option
%and will be passed to \cs{TrackPredefinedDialect}. (See the
%\sty{tracklang} documentation for further details of that command.)
%
%Apart from \pkgopt{calc}, \pkgopt{style} and the regional options, all the above
%options can also be set using:
%\begin{definition}[\DescribeMacro\DTMsetup]
%\cs{DTMsetup}\marg{option list}
%\end{definition}
%
%The language modules may additionally provide options which can be
%set using:
%\begin{definition}[\DescribeMacro\DTMlangsetup]
%\cs{DTMlangsetup}\oarg{module list}\marg{option list}
%\end{definition}
%
%This will set the \meta{option list} for each module listed in
%\meta{module list}. Unknown options will generate a~warning rather
%than an error message. The default value of \meta{module list} is
%the list of all loaded modules.
%
%Example:
%\begin{verbatim}
%\documentclass{article}
%\usepackage[british]{datetime2}
%\DTMlangsetup{mapzone}
%\end{verbatim}
%The module list here is \texttt{english-base},\texttt{en-GB} and
%since the \texttt{english-base} doesn't have a \texttt{mapzone}
%option, this will result in a warning:
%\begin{verbatim}
%Package datetime2 Warning: Region `english-base' has ignored 
%(datetime2)                the following settings:
%(datetime2)                mapzone
%\end{verbatim}
%You can either ignore the warning or use the optional argument to
%exclude the \texttt{english-base} module:
%\begin{verbatim}
%\documentclass{article}
%\usepackage[british]{datetime2}
%\DTMlangsetup[en-GB]{mapzone}
%\end{verbatim}
%
%Note that some modules may have options with the same name as the
%above listed package options, but the keys are defined in different
%families (see \sty{xkeyval} documentation) so you need to take care
%to use \cs{DTMsetup} for package-wide settings and \cs{DTMlangsetup}
%for the module-specific settings.
%
%For example, the \pkgopt{datesep} package option described above is
%used by the predefined numerical styles but regional modules that
%provide their own numerical styles may use a different date
%separator that matches their region so they may also provide a
%\texttt{datesep} option independent of the base \pkgopt{datesep}
%option.
%
%Examples:
%\begin{verbatim}
%\documentclass[british]{article}
%\usepackage[datesep=.]{datetime2}
%\begin{document}
%\today
%\end{document}
%\end{verbatim}
%The above displays the date in the form
%{\DTMsetup{datesep=.}\DTMsetdatestyle{default}\today}
%since the default style is in use and \pkgopt{datesep} is used as a
%package option.
%
%\begin{verbatim}
%\documentclass[british]{article}
%\usepackage{datetime2}
%\DTMsetup{datesep=.}
%\begin{document}
%\today
%\end{document}
%\end{verbatim}
%The above displays the date in the form
%{\DTMsetup{datesep=.}\DTMsetdatestyle{default}\today}
%since the default style is in use and \pkgopt{datesep} is used in
%\cs{DTMsetup}.
%
%\begin{verbatim}
%\documentclass[british]{article}
%\usepackage{datetime2}
%\DTMlangsetup{datesep=.}
%\begin{document}
%\today
%\end{document}
%\end{verbatim}
%The above displays the date in the form
%{\DTMlangsetup[en-GB]{datesep=.}\DTMsetdatestyle{default}\today}
%since the default style is in use but \pkgopt{datesep} is used in
%\cs{DTMlangsetup}, which only influences the \style{en-GB-numeric}
%style, which isn't the current style.
%
%\begin{verbatim}
%\documentclass[british]{article}
%\usepackage[useregional=numeric]{datetime2}
%\DTMlangsetup{datesep=.}
%\begin{document}
%\today
%\end{document}
%\end{verbatim}
%The above displays the date in the form
%{\DTMlangsetup[en-GB]{datesep=.}\DTMsetdatestyle{en-GB-numeric}\today}
%since the \style{en-GB-numeric} style is in use and \pkgopt{datesep}
%is used in \cs{DTMlangsetup}.
%
%\begin{verbatim}
%\documentclass[british]{article}
%\usepackage[useregional]{datetime2}
%\DTMlangsetup{datesep=.}
%\begin{document}
%\today
%\end{document}
%\end{verbatim}
%The above displays the date in the form
%{\DTMlangsetup[en-GB]{datesep=.}\DTMsetdatestyle{en-GB}\today}
%since the \style{en-GB} style is in use and \pkgopt{datesep} is used
%in \cs{DTMlangsetup}, which only influences the
%\style{en-GB-numeric} style.
%
%\begin{verbatim}
%\documentclass[british]{article}
%\usepackage[useregional=numeric]{datetime2}
%\DTMsetup{datesep=.}
%\begin{document}
%\today
%\end{document}
%\end{verbatim}
%The above displays the date in the form
%{\DTMsetup{datesep=.}\DTMsetdatestyle{en-GB-numeric}\today}
%since the \style{en-GB-numeric} style is in use but \pkgopt{datesep}
%is used in \cs{DTMsetup} which influences the base predefined
%numeric styles not the regional styles.
%
%\chapter{The \styfmt{datetime2-calc} Package}
%\label{sec:calc}
%
%The \sty{datetime2-calc} package can be loaded after \styfmt{datetime2} in the 
%usual way:
%\begin{verbatim}
%\usepackage{datetime2}
%\usepackage{datetime2-calc}
%\end{verbatim}
%or using the \pkgopt{calc} package option to \styfmt{datetime2}:
%\begin{verbatim}
%\usepackage[calc]{datetime2}
%\end{verbatim}
%or by using \pkgopt[true]{showdow}:
%\begin{verbatim}
%\usepackage[showdow]{datetime2}
%\end{verbatim}
%
%This package loads the \sty{pgfcalendar} package which provides a
%way of computing the day of week from a given date. Once
%\sty{datetime2-calc} has been loaded, you can enable or disable the
%weekday in dates where the style supports this, but note that not
%all styles support this, even if the \sty{datetime2-calc} package
%has been loaded.
%
%As with the commands in \sectionref{sec:store}, the commands
%described below that save date\slash time information will
%\emph{overwrite} any previously defined date\slash time data with
%the same identifying \meta{name}. However, they may only overwrite
%specific elements of the data (for example, just the year, month,
%day and day of week elements) and leave the other elements
%unchanged. Where the remaining elements are undefined they'll be set to
%zero, except for the day of week element, which will be set to
%\texttt{-1}.
%
%In addition to enabling the weekday calculations, the \sty{datetime2-calc} 
%package also provides the following commands:
%\begin{definition}[\DescribeMacro\DTMsavejulianday]
%\cs{DTMsavejulianday}\marg{name}\marg{number}
%\end{definition}
%This uses \cs{pgfcalendarjuliantodate} to obtain the year, month and
%day from the given Julian day number and uses
%\cs{pgfcalendarjuliantoweekday} to obtain the day of week and then
%saves it. The date can later be used with commands such as
%\cs{DTMuse}\marg{name} described in \sectionref{sec:store}.
%Example:
%\begin{verbatim}
%\DTMsavejulianday{mydate}{2457023}
%\end{verbatim}
%
%\begin{definition}[\DescribeMacro\DTMsaveddatetojuliandate]
%\cs{DTMsaveddatetojulianday}\marg{name}\marg{register}
%\end{definition}
%This uses \cs{pgfcalendardatetojulian} to convert a previously saved
%date (identified by \meta{name}) to a Julian day. The result is
%stored in \meta{register} which should be a count register (not a
%\LaTeX\ counter name).
%Example:
%\begin{verbatim}
%\newcount\myct
%\DTMsaveddatetojulianday{mydate}{\myct}
%\end{verbatim}
%
%\begin{definition}[\DescribeMacro\DTMsaveddateoffsettojuliandate]
%\cs{DTMsaveddateoffsettojulianday}\marg{name}\marg{offset}\marg{register}
%\end{definition}
%This is like the previous command but converts the date obtained by
%incrementing the saved date with \meta{offset}. The result is stored
%in \meta{register}. This is equivalent to
%\begin{display}\ttfamily
%\cs{pgfcalendardatetojulian}\{\meta{y}-\meta{m}-\meta{d}+\meta{offset}\}\marg{register}
%\end{display}
%where \meta{y}, \meta{m} and \meta{d} are the year, month and day
%fetched from the saved date. A negative \meta{offset} indicates an earlier
%date.
%Example:
%\begin{verbatim}
%\DTMsaveddateoffsettojulianday{mydate}{2}{\myct}
%\end{verbatim}
%or
%\begin{verbatim}
%\DTMsaveddateoffsettojulianday{mydate}{-7}{\myct}
%\end{verbatim}
%
%\begin{definition}[\DescribeMacro\DTMifdate]
%\cs{DTMifdate}\marg{name}\marg{test}\marg{true}\marg{false}
%\end{definition}
%This is just a convenient interface to \cs{pgfcalendarifdate}
%for a saved date (identified by \meta{name}). The remaining
%arguments are the same as the final three arguments of 
%\cs{pgfcalendarifdate}. Note that the
%\texttt{equals}, \texttt{at least}, \texttt{at most} and
%\texttt{between} keywords available in \meta{test} need to be in the
%format specified by the \sty{pgf} manual, but remember that you can
%use commands like \cs{DTMfetchyear}.
%Example:
%\begin{verbatim}
%Is \texttt{mydate2} (\DTMusedate{mydate2}) before
%\texttt{mydate} (\DTMusedate{mydate})?
%\DTMifdate
% {mydate2}
% {at most=
%   \DTMfetchyear{mydate}-\DTMfetchmonth{mydate}-\DTMfetchday{mydate}}
% {yes}{no}.
%\end{verbatim}
%
%\begin{definition}[\DescribeMacro\DTMsaveddatediff]
%\cs{DTMsavedatediff}\marg{name1}\marg{name2}\marg{register}
%\end{definition}
%Computes the difference (in days) between two saved dates and stores
%the result in the given count register. The first date is identified
%by \meta{name1} and the second date is identified by \meta{name2}.
%The dates are converted to their respective Julian day numbers
%\meta{J1} and \meta{J2} and the result is given by
%\meta{J1}$-$\meta{J2}.
%
%\begin{important}
%Note that the time and zone are not taken into account, even if they
%were provided when the dates were stored.
%\end{important}
%Example:
%\begin{verbatim}
%\DTMsaveddatediff{mydate}{mydate2}{\myct}
%
%\DTMusedate{mydate} is
%\ifnum\myct=0
% the same day as
%\else
%  \ifnum\myct<0
%   \number-\myct\space day\ifnum\myct<-1s\fi\space before
%  \else
%   \number\myct\space day\ifnum\myct>1s\fi\space after
%  \fi
%\fi
%\DTMusedate{mydate2}.
%\end{verbatim}
%
%The \sty{pgfcalendar} package also provides a variety of useful
%date-related commands. See the documentation (part of the \sty{pgf}
%manual) for further details. Note that the language modules don't
%use \sty{pgfcalendar} month and weekday names as the
%\sty{pgfcalendar} package isn't loaded by default.
%
%The \sty{datetime2-calc} package also provides commands that convert
%a datetime instance into Zulu\footnote{That's Zulu as in the NATO
%alphabet representation of the letter Z.}\ time (UTC+00:00).
%
%\begin{definition}[\DescribeMacro\DTMsaveaszulutime]
%\cs{DTMsaveaszulutime}\marg{name}\marg{YYYY}\marg{MM}\marg{DD}\marg{hh}\marg{mm}\newline\marg{ss}\marg{TZh}\marg{TZm}
%\end{definition}
%This converts the given datetime instance into UTC+00:00 and saves
%the result. You can then use the date with commands like \cs{DTMuse}
%described in \sectionref{sec:store}. The \meta{name} argument is the
%label identifying the saved data. The other arguments are all
%numbers.
%Example:
%\begin{verbatim}
%\DTMsaveaszulutime{mydate}{2014}{6}{3}{20}{45}{0}{6}{0}
%\end{verbatim}
%
%\begin{definition}[\DescribeMacro\DTMtozulu]
%\cs{DTMtozulu}\marg{name1}\marg{name2}
%\end{definition}
%Uses \cs{DTMsaveaszulutime} to convert the datetime stored in
%\meta{name1} and saves it to \meta{name2}.
%Example:
%\begin{verbatim}
%\DTMsavetimestamp{mydate}{2014-05-01T03:55:00 -06:00}
%Original date: \DTMuse{mydate}.
%
%\DTMtozulu{mydate}{mydate2}
%UTC+00:00: \DTMuse{mydate2}.
%\end{verbatim}
%The above produces (using the \style{default} format):
%\DTMsetstyle{default}%
%
%\DTMsavetimestamp{mydate}{2014-05-01T03:55:00 -06:00}
%Original date: \DTMuse{mydate}.
%
%\DTMtozulu{mydate}{mydate2}
%UTC+00:00: \DTMuse{mydate2}.
%
%\StopEventually{\PrintIndex}
%
%
%\chapter{The Code}
%\iffalse
%    \begin{macrocode}
%<*datetime2.sty>
%    \end{macrocode}
%\fi
%\section{datetime2.sty code}
%\changes{1.0}{2015-03-24}{Initial release}
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{datetime2}[2015/03/24 v1.0 (NLCT) date and time formats]
%    \end{macrocode}
% Use \sty{tracklang} to find out what languages have been loaded.
%    \begin{macrocode}
\RequirePackage{tracklang}
%    \end{macrocode}
% Also require \sty{etoolbox}.
%    \begin{macrocode}
\RequirePackage{etoolbox}
%    \end{macrocode}
% Need \sty{xkeyval} for \meta{key}=\meta{value} interface.
%    \begin{macrocode}
\RequirePackage{xkeyval}[2006/11/18]
%    \end{macrocode}
%
%\begin{macro}{\dtm@yearmonthsep}
% Separator between year and month for numeric dates.
%    \begin{macrocode}
\newcommand*{\dtm@yearmonthsep}{-}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dtm@monthdaysep}
% Separator between month and day for numeric dates.
%    \begin{macrocode}
\newcommand*{\dtm@monthdaysep}{-}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dtm@dayyearsep}
% Separator between day and year for numeric middle-endian dates.
%    \begin{macrocode}
\newcommand*{\dtm@dayyearsep}{-}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dtm@hourminsep}
% Separator between the hour and minute for times.
%    \begin{macrocode}
\newcommand*{\dtm@hourminsep}{:}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dtm@minsecsep}
% Separator between the minute and second for times.
%    \begin{macrocode}
\newcommand*{\dtm@minsecsep}{:}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dtm@timezonesep}
% Separator between the date and time.
%    \begin{macrocode}
\newcommand*{\dtm@datetimesep}{\space}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dtm@timezonesep}
% Separator between the time and time zone.
%    \begin{macrocode}
\newcommand*{\dtm@timezonesep}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{datesep}
% Set year/month and month/day separator.
%    \begin{macrocode}
\define@key{datetime2.sty}{datesep}{%
  \renewcommand*{\dtm@yearmonthsep}{#1}%
  \renewcommand*{\dtm@monthdaysep}{#1}%
  \renewcommand*{\dtm@dayyearsep}{#1}%
}
%    \end{macrocode}
%\end{option}
%
%\begin{option}{yearmonthsep}
% Set year/month separator.
%    \begin{macrocode}
\define@key{datetime2.sty}{yearmonthsep}{%
  \renewcommand*{\dtm@yearmonthsep}{#1}%
}
%    \end{macrocode}
%\end{option}
%
%\begin{option}{monthdaysep}
% Set month/day separator.
%    \begin{macrocode}
\define@key{datetime2.sty}{monthdaysep}{%
  \renewcommand*{\dtm@monthdaysep}{#1}%
}
%    \end{macrocode}
%\end{option}
%
%\begin{option}{dayyearsep}
% Set day/year separator for middle-endian dates.
%    \begin{macrocode}
\define@key{datetime2.sty}{dayyearsep}{%
  \renewcommand*{\dtm@dayyearsep}{#1}%
}
%    \end{macrocode}
%\end{option}
%
%\begin{option}{timesep}
% Set hour/minute and minute/second separator.
%    \begin{macrocode}
\define@key{datetime2.sty}{timesep}{%
  \renewcommand*{\dtm@hourminsep}{#1}%
  \renewcommand*{\dtm@minsecsep}{#1}%
}
%    \end{macrocode}
%\end{option}
%
%\begin{option}{hourminsep}
% Set hour/minute separator.
%    \begin{macrocode}
\define@key{datetime2.sty}{hourminsep}{%
  \renewcommand*{\dtm@hourminsep}{#1}%
}
%    \end{macrocode}
%\end{option}
%
%\begin{option}{minsecsep}
% Set minute/second separator.
%    \begin{macrocode}
\define@key{datetime2.sty}{minsecsep}{%
  \renewcommand*{\dtm@minsecsep}{#1}%
}
%    \end{macrocode}
%\end{option}
%
%\begin{option}{timezonesep}
% Set separator between the time and the time zone (used in
% \cs{DTMnow}).
%    \begin{macrocode}
\define@key{datetime2.sty}{timezonesep}{%
  \renewcommand*{\dtm@timezonesep}{#1}%
}
%    \end{macrocode}
%\end{option}
%
%\begin{option}{datetimesep}
% Set separator between the date and the time (used in
% \cs{DTMnow}).
%    \begin{macrocode}
\define@key{datetime2.sty}{datetimesep}{%
  \renewcommand*{\dtm@datetimesep}{#1}%
}
%    \end{macrocode}
%\end{option}
%
%\begin{option}{showseconds}
% Boolean key to determine whether or not to show the seconds.
%    \begin{macrocode}
\define@boolkey{datetime2.sty}[DTM]{showseconds}[true]{}
%    \end{macrocode}
%\end{option}
%
%\begin{option}{showdate}
% Boolean key to determine whether or not to show the date in
% \cs{DTMdisplay} and \cs{DTMDisplay}.
%    \begin{macrocode}
\define@boolkey{datetime2.sty}[DTM]{showdate}[true]{}
\DTMshowdatetrue
%    \end{macrocode}
%\end{option}
%
%\begin{option}{showzone}
% Boolean key to determine whether or not to show the time zone in
% \cs{DTMdisplay} and \cs{DTMDisplay}.
%    \begin{macrocode}
\define@boolkey{datetime2.sty}[DTM]{showzone}[true]{}
%    \end{macrocode}
%\end{option}
%
%\begin{option}{showisoZ}
% Boolean key to determine whether or not to use \texttt{Z} instead
% of \texttt{+00:00} for UTC in the \style{default}, \style{iso} or
% \style{pdf} styles. (Other styles may also use this.)
%    \begin{macrocode}
\define@boolkey{datetime2.sty}[DTM]{showisoZ}[true]{}
\DTMshowisoZtrue
%    \end{macrocode}
%\end{option}
%
% Switch off seconds and time zone if \cs{pdfcreationdate}
% isn't defined, otherwise switch on.
%    \begin{macrocode}
\ifdef\pdfcreationdate
{%
  \DTMshowsecondstrue
  \DTMshowzonetrue
}%
{%
  \DTMshowsecondsfalse
  \DTMshowzonefalse
}%
%    \end{macrocode}
%
%\begin{option}{showzoneminutes}
% Boolean key to determine whether or not to show the time zone
% minutes. (If \cs{DTMshowzonefalse} then this option is irrelevant.)
%    \begin{macrocode}
\define@boolkey{datetime2.sty}[DTM]{showzoneminutes}[true]{}
\DTMshowzoneminutestrue
%    \end{macrocode}
%\end{option}
%
%\begin{macro}{\DTMifcaseregional}
%\begin{definition}
%\cs{DTMifcaseregional}\marg{false}\marg{text}\marg{numeric}
%\end{definition}
% Determines if the user wants the language modules to set the
% regional format. The first argument \meta{false} indicates that
% they don't want the regional format set, the second argument
% \meta{text} indicates they want the textual format (e.g. 1st
% March, 2015 or March 1, 2005) and the third argument \meta{numeric}
% indicates they want the numeric format (e.g. 1/3/2015 or
% 3/1/2015). A change in the setting will only have an affect when
% the module is loaded and when \cs{date}\meta{language} is used to
% set the style. The default is false.
%    \begin{macrocode}
\newcommand*{\DTMifcaseregional}[3]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{useregional}
% Setting to determine whether or not to use the regional
% settings (if any are loaded).
%    \begin{macrocode}
\define@choicekey{datetime2.sty}{useregional}[\val\nr]%
 {false,text,numeric,num}[text]%
 {%
   \ifcase\nr\relax
     \renewcommand*{\DTMifcaseregional}[3]{##1}%
   \or
     \renewcommand*{\DTMifcaseregional}[3]{##2}%
   \or
     \renewcommand*{\DTMifcaseregional}[3]{##3}%
   \or
     \renewcommand*{\DTMifcaseregional}[3]{##3}%
   \fi
 }
%    \end{macrocode}
%\end{option}
%
%\begin{macro}{\@dtm@setusecalc}
%    \begin{macrocode}
\newcommand*{\@dtm@setusecalc}{%
  \renewcommand*{\@dtm@usecalc}{\RequirePackage{datetime2-calc}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@dtm@usecalc}
%    \begin{macrocode}
\newcommand*{\@dtm@usecalc}{}
%    \end{macrocode}
%\end{macro}
% Disable attempt to load \sty{datetime2-calc} in the document.
%    \begin{macrocode}
\AtBeginDocument{%
  \@ifpackageloaded{datetime2-calc}%
  {%
    \renewcommand*{\@dtm@setusecalc}{}%
  }% 
  {%
    \renewcommand*{\@dtm@setusecalc}{%
      \PackageError{datetime2}{You must load `datetime2-calc'
      package to use option `showdow'}{Try one of the following:^^J
      pass `calc' option to `datetime2' package when you load it^^J
      or move `showdow' option to `datetime2' package option list^^J
      or move \string\DTLsetup\space to the preamble.}%
    }%
  }%
}
%    \end{macrocode}
%
%\begin{option}{calc}
% This option will load the \sty{datetime2-calc} which uses the
% \sty{pgfcalendar} package to compute the day of week and offsets.
% The package is loaded at the end of this one.
%    \begin{macrocode}
\DeclareOptionX{calc}{\@dtm@setusecalc}
%    \end{macrocode}
%\end{option}
%
%\begin{option}{showdow}
% Boolean key to determine whether or not to show the day of week
% for the styles that can show the day of week. If this is switched
% on, then \sty{datetime2-calc} is required. If this key is set later
% in the document with \cs{DTMsetup}, then the \sty{datetime2-calc}
% package must previously be loaded for it to have an effect.
%    \begin{macrocode}
\define@boolkey{datetime2.sty}[DTM]{showdow}[true]{%
  \ifDTMshowdow \@dtm@setusecalc \fi
}
\DTMshowdowfalse
%    \end{macrocode}
%\end{option}
%
%\begin{macro}{\@dtm@warning}
% Warning messages.
%    \begin{macrocode}
\newcommand*{\@dtm@warning}[1]{%
  \if@dtm@warn
    \PackageWarning{datetime2}{#1}%
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{warn}
% Allow user to suppress package warnings.
%    \begin{macrocode}
\define@boolkey{datetime2.sty}[@dtm@]{warn}[true]{}
\@dtm@warntrue
%    \end{macrocode}
%\end{option}
%
%\begin{macro}{\@dtm@initialstyle}
%    \begin{macrocode}
\newcommand*{\@dtm@initialstyle}{}
%    \end{macrocode}
%\end{macro}
%\begin{option}{style}
% Set the style. This automatically sets
% \pkgopt[false]{useregional}.
%    \begin{macrocode}
\define@key{datetime2.sty}{style}{%
  \renewcommand*{\@dtm@initialstyle}{#1}%
  \ifstrempty{#1}%
  {}%
  {%
    \renewcommand*{\DTMifcaseregional}[3]{##1}%
  }%
}
%    \end{macrocode}
%\end{option}
%
% Pass any unknown options to \sty{tracklang}.
% This will automatically switch the "useregional" setting to
% \texttt{text}.
%    \begin{macrocode}
\DeclareOptionX*{%
  \TrackPredefinedDialect{\CurrentOption}%
  \renewcommand*{\DTMifcaseregional}[3]{#2}%
}
%    \end{macrocode}
%
%Process options passed to this package:
%    \begin{macrocode}
\ProcessOptionsX
%    \end{macrocode}
%
% Disable \texttt{calc} option. If it's required, just load
% \sty{datetime2-calc} with \cs{usepackage}.
%    \begin{macrocode}
\disable@keys{datetime2.sty}{calc}
%    \end{macrocode}
% Disable \texttt{style} option. If it's required, just 
% use \cs{DTMsetup}.
%    \begin{macrocode}
\disable@keys{datetime2.sty}{style}
%    \end{macrocode}
%
% Provide a way to set options after package has been loaded.
%\begin{macro}{\DTMsetup}
%    \begin{macrocode}
\newcommand*{\DTMsetup}[1]{%
 \def\@dtm@usecalc{}%
 \setkeys{datetime2.sty}{#1}%
 \@dtm@usecalc
}
%    \end{macrocode}
%\end{macro}
%
%\subsection{Defaults}
% This section sets up the defaults.
%
%\begin{macro}{\@dtm@parsedate}
% Parse date in the format \meta{year}-\meta{month}-\meta{day}.
% The arguments are expanded. (This is redefined by
% \sty{datetime2-calc}.)
%    \begin{macrocode}
\def\@dtm@parsedate#1-#2-#3\@dtm@endparsedate{%
  \edef\@dtm@year{\number#1}%
  \edef\@dtm@month{\number#2}%
  \edef\@dtm@day{\number#3}%
  \def\@dtm@dow{-1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dtm@parsetime}
% Define command to parse time in the format
% \meta{h}:\meta{m}:\meta{s}. The results are stored in
% \cs{@dtm@hour}, \cs{@dtm@minute} and \cs{@dtm@second}.
% The arguments are expanded.
%    \begin{macrocode}
\def\@dtm@parsetime#1:#2:#3\@dtm@endparsetime{%
  \edef\@dtm@hour{\number#1}%
  \edef\@dtm@minute{\number#2}%
  \edef\@dtm@second{\number#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dtm@parsetimezn}
% Define command to parse time in the format
% \meta{h}:\meta{m}:\meta{s} \meta{znh}:\meta{znm}. The results are stored in
% \cs{@dtm@hour}, \cs{@dtm@minute}, \cs{@dtm@second},
% \cs{@dtm@timezonehour} and \cs{@dtm@timezoneminute}.
% The arguments are expanded.
%    \begin{macrocode}
\def\@dtm@parsetimezn#1:#2:#3 #4\@dtm@endparsetimezn{%
  \@dtm@parsetime#1:#2:#3\@dtm@endparsetime
  \@dtm@parsezone{#4}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dtm@parsezone}
% Define command to parse time zone in the format
% \texttt{Z} or \meta{znh}:\meta{znm}. The results are stored in
% \cs{@dtm@timezonehour} and \cs{@dtm@timezoneminute}.
% The arguments are expanded in the event that registers are used.
%    \begin{macrocode}
\newcommand*{\@dtm@parsezone}[1]{%
  \ifstrequal{#1}{Z}%
  {%
    \def\@dtm@timezonehour{+00}%
    \def\@dtm@timezoneminute{00}%
  }%
  {%
    \@dtm@parse@zone#1\@dtm@endparse@zone
  }%
}
\def\@dtm@parse@zone#1:#2\@dtm@endparse@zone{%
  \edef\@dtm@timezonehour{\number#1}%
  \edef\@dtm@timezoneminute{\number#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dtm@parsetimestamp}
% Parse date and time in ISO format
%\meta{YYYY}-\meta{MM}-\meta{DD}T\meta{hh}:\meta{mm}:\meta{sec}\meta{time
%zone}
% where \meta{time zone} may be \texttt{Z} or in the form
% \meta{hh}:\meta{mm} (where \meta{hh} includes the sign).
%    \begin{macrocode}
\def\@dtm@parsetimestamp#1-#2-#3T#4:#5:#6#7#8\@dtm@endparsetimestamp{%
  \@dtm@parsedate#1-#2-#3\@dtm@endparsedate
  \@dtm@parsetime#4:#5:#6#7\@dtm@endparsetime
  \@dtm@parsezone{#8}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMsavefilemoddate}
% Not available for some engines.
%    \begin{macrocode}
\newcommand*{\DTMsavefilemoddate}[2]{%
  \@dtm@warning{Your TeX engine doesn't support accessing
  file modification dates}%
  \cslet{@dtm@#1@year}{0}%
  \cslet{@dtm@#1@month}{0}%
  \cslet{@dtm@#1@day}{0}%
  \cslet{@dtm@#1@dow}{-1}%
  \cslet{@dtm@#1@hour}{0}%
  \cslet{@dtm@#1@minute}{0}%
  \cslet{@dtm@#1@second}{0}%
  \cslet{@dtm@#1@TZhour}{0}%
  \cslet{@dtm@#1@TZminute}{0}%
}
%    \end{macrocode}
%\end{macro}
%
% Find out the current time. If PDF\LaTeX\ is being used, then it
% can be fetched from \cs{pdfcreationdate}
%    \begin{macrocode}
\ifdef\pdfcreationdate
{%
%    \end{macrocode}
% Define commands to parse \cs{pdfcreationdate}
%    \begin{macrocode}
  \def\@dtm@parsepdfdatetime#1:#2#3#4#5#6#7#8#9{%
    \def\@dtm@year{#2#3#4#5}%
    \def\@dtm@month{#6#7}%
    \def\@dtm@day{#8#9}%
    \@dtm@parsepdftime
  }
  \def\@dtm@parsepdftime#1#2#3#4#5#6#7\@dtm@endparsepdfdatetime{%
    \def\@dtm@hour{#1#2}%
    \def\@dtm@minute{#3#4}%
    \def\@dtm@second{#5#6}%
    \ifstrequal{#7}{Z}%
    {%
      \def\@dtm@timezonehour{00}%
      \def\@dtm@timezoneminute{00}%
    }%
    {%
      \@dtm@parsepdftimezone#7%
    }%
  }
  \def\@dtm@parsepdftimezone#1'#2'{%
    \def\@dtm@timezonehour{#1}%
    \def\@dtm@timezoneminute{#2}%
  }%
%    \end{macrocode}
% Now parse \cs{pdfcreationdate}
%    \begin{macrocode}
  \expandafter\@dtm@parsepdfdatetime\pdfcreationdate\@dtm@endparsepdfdatetime
%    \end{macrocode}
% Save the values.
%    \begin{macrocode}
  \let\@dtm@currentyear\@dtm@year
  \let\@dtm@currentmonth\@dtm@month
  \let\@dtm@currentday\@dtm@day
  \let\@dtm@currenthour\@dtm@hour
  \let\@dtm@currentminute\@dtm@minute
  \let\@dtm@currentsecond\@dtm@second
  \let\@dtm@currenttimezonehour\@dtm@timezonehour
  \let\@dtm@currenttimezoneminute\@dtm@timezoneminute
%
%    \end{macrocode}
% Lua\TeX\ doesn't provide \cs{pdffilemoddate} (but it does provide
% \cs{pdfcreationdate}).
%    \begin{macrocode}
  \ifdef\pdffilemoddate
  {%
    \renewcommand*{\DTMsavefilemoddate}[2]{%
      \expandafter\@dtm@parsepdfdatetime\pdffilemoddate{#2}\@dtm@endparsepdfdatetime
      \cslet{@dtm@#1@year}{\@dtm@year}%
      \cslet{@dtm@#1@month}{\@dtm@month}%
      \cslet{@dtm@#1@day}{\@dtm@day}%
      \cslet{@dtm@#1@dow}{\@dtm@dow}%
      \cslet{@dtm@#1@hour}{\@dtm@hour}%
      \cslet{@dtm@#1@minute}{\@dtm@minute}%
      \cslet{@dtm@#1@second}{\@dtm@second}%
      \cslet{@dtm@#1@TZhour}{\@dtm@timezonehour}%
      \cslet{@dtm@#1@TZminute}{\@dtm@timezoneminute}%
    }
  }%
  {%
%    \end{macrocode}
% Lua time zone information provided by \verb|%z| is OS dependent,
% so this might not work.
%    \begin{macrocode}
    \ifdef\directlua
    {
      \renewcommand*{\DTMsavefilemoddate}[2]{%
        \expandafter\@dtm@parseluadatetime
          \directlua{tex.print(os.date(
             "\expandafter\@gobble\string\%Y-%
              \expandafter\@gobble\string\%m-%
              \expandafter\@gobble\string\%d-%
              \expandafter\@gobble\string\%w
              \expandafter\@gobble\string\%H:%
              \expandafter\@gobble\string\%M:%
              \expandafter\@gobble\string\%S
              \expandafter\@gobble\string\%z",
            lfs.attributes("#2").modification))}%
         \@dtm@endparseluadatetime
         \cslet{@dtm@#1@year}{\@dtm@year}%
         \cslet{@dtm@#1@month}{\@dtm@month}%
         \cslet{@dtm@#1@day}{\@dtm@day}%
         \cslet{@dtm@#1@dow}{\@dtm@dow}%
         \cslet{@dtm@#1@hour}{\@dtm@hour}%
         \cslet{@dtm@#1@minute}{\@dtm@minute}%
         \cslet{@dtm@#1@second}{\@dtm@second}%
         \cslet{@dtm@#1@TZhour}{\@dtm@TZhour}%
         \cslet{@dtm@#1@TZminute}{\@dtm@TZminute}%
      }
      \def\@dtm@parseluadatetime#1-#2-#3-#4 #5:#6:#7 #8\@dtm@endparseluadatetime{%
         \edef\@dtm@year{\number#1}%
         \edef\@dtm@month{\number#2}%
         \edef\@dtm@day{\number#3}%
         \edef\@dtm@dow{\number#4}%
         \edef\@dtm@hour{\number#5}%
         \edef\@dtm@minute{\number#6}%
         \edef\@dtm@second{\number#7}%
         \@dtm@parseluatimezone#8000000\@dtm@endparseluatimezone
      }
      \def\@dtm@parseluatimezone#1#2#3#4#5#6{%
         \ifstrequal{#1}{+}%
         {%
           \def\@dtm@TZhour{#1#2#3}%
           \ifstrequal{#4}{:}%
           {%
              \def\@dtm@TZminute{#5#6}%
           }%
           {%
              \def\@dtm@TZminute{#4#5}%
           }%
         }%
         {%
           \ifstrequal{#1}{-}%
           {%
              \def\@dtm@TZhour{#1#2#3}%
              \ifstrequal{#4}{:}%
              {%
                 \def\@dtm@TZminute{#5#6}%
              }%
              {%
                 \def\@dtm@TZminute{#4#5}%
              }%
           }%
           {%
             \ifstrequal{#1}{Z}%
             {%
               \def\@dtm@TZhour{0}%
               \def\@dtm@TZminute{0}%
             }%
             {%
               \def\@dtm@TZhour{#1#2}%
               \ifstrequal{#3}{:}%
               {%
                  \def\@dtm@TZminute{#4#5}%
               }%
               {%
                  \def\@dtm@TZminute{#3#4}%
               }%
             }%
           }%
         }%
         \@@dtm@parseluatimezone
      }
      \def\@@dtm@parseluatimezone#1\@dtm@endparseluatimezone{%
      }
    }
    {}
  }%
}%
{%
%    \end{macrocode}
% \cs{pdfcreationdate} not defined. By a process of elimination, the
% \TeX\ engine is either \XeTeX\ or it's very old. (Lua\TeX\
% recognises \cs{pdfcreationdate}.) In this case, the
% seconds and time zone can't be obtained. The hour and minute need
% to be calculated from \TeX's \cs{time} primitive.
%    \begin{macrocode}
   \count@=\time\relax
   \divide\count@ by 60\relax
   \edef\@dtm@currenthour{\number\count@}%
   \multiply\count@ by -60\relax
   \advance\count@ by \time\relax
   \edef\@dtm@currentminute{\number\count@}%
   \newcommand*{\@dtm@currentsecond}{00}%
   \newcommand\@dtm@currenttimezonehour{00}%
   \newcommand\@dtm@currenttimezoneminute{00}%
%    \end{macrocode}
% Get the day, month and year from \TeX's primitives.
%    \begin{macrocode}
   \edef\@dtm@currentyear{\number\year}%
   \edef\@dtm@currentmonth{\number\month}%
   \edef\@dtm@currentday{\number\day}%
}
%    \end{macrocode}
% Make \cs{DTMsavefilemoddate} robust.
%    \begin{macrocode}
\robustify\DTMsavefilemoddate
%    \end{macrocode}
%
% Current day of week defaults to \texttt{-1} (that is, ignore it).
%\begin{macro}{\@dtm@currentdow}
%    \begin{macrocode}
\newcommand*{\@dtm@currentdow}{-1}
%    \end{macrocode}
%\end{macro}
%
% Allow \XeLaTeX\ users a way of manually setting the current time zone.
%\begin{macro}{\DTMsetcurrentzone}
%    \begin{macrocode}
\newcommand*{\DTMsetcurrentzone}[2]{%
  \renewcommand\@dtm@currenttimezonehour{#1}%
  \renewcommand\@dtm@currenttimezoneminute{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\today}
%    \begin{macrocode}
\renewcommand*{\today}{%
 \DTMdisplaydate 
  {\@dtm@currentyear}%
  {\@dtm@currentmonth}%
  {\@dtm@currentday}%
  {\@dtm@currentdow}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Today}
% First letter upper case version.
%    \begin{macrocode}
\newcommand*{\Today}{%
 \DTMDisplaydate 
  {\@dtm@currentyear}%
  {\@dtm@currentmonth}%
  {\@dtm@currentday}%
  {\@dtm@currentdow}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMdisplaydate}
%\begin{definition}
%\cs{DTMdisplaydate}\marg{year}\marg{month}\marg{day}\marg{day of
%week}
%\end{definition}
% Display the given date. If the day of week is negative, ignore it.
% The default style ignores it regardless.
%    \begin{macrocode}
\newcommand*\DTMdisplaydate[4]{%
  \number#1\dtm@yearmonthsep\DTMtwodigits{#2}\dtm@monthdaysep\DTMtwodigits{#3}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMDisplaydate}
% First letter upper case version. Defaults to \cs{DTMdisplaydate}.
%    \begin{macrocode}
\newcommand*{\DTMDisplaydate}{\DTMdisplaydate}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMdate}
% Display date where date is specified in the format
%\meta{yyyy}-\meta{mm}-\meta{dd}. Use \cs{expandafter} in case
%argument is a control sequence containing the date.
% This command isn't expandable
%    \begin{macrocode}
\newrobustcmd*{\DTMdate}[1]{%
  \expandafter\@dtm@parsedate#1\@dtm@endparsedate
  \DTMdisplaydate{\@dtm@year}{\@dtm@month}{\@dtm@day}{\@dtm@dow}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMDate}
% Upper case version.
%    \begin{macrocode}
\newrobustcmd*{\DTMDate}[1]{%
  \expandafter\@dtm@parsedate#1\@dtm@endparsedate
  \DTMDisplaydate{\@dtm@year}{\@dtm@month}{\@dtm@day}{\@dtm@dow}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMcurrenttime}
% Display the current time.
%    \begin{macrocode}
\newcommand*{\DTMcurrenttime}{%
 \DTMdisplaytime
  {\@dtm@currenthour}%
  {\@dtm@currentminute}%
  {\@dtm@currentsecond}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMdisplaytime}
%\begin{definition}
%\cs{DTMdisplaytime}\marg{hour}\marg{minute}\marg{sec}
%\end{definition}
% Display the given time.
%    \begin{macrocode}
\newcommand*\DTMdisplaytime[3]{%
  \DTMtwodigits{#1}\dtm@hourminsep\DTMtwodigits{#2}%
  \ifDTMshowseconds\dtm@minsecsep\DTMtwodigits{#3}\fi
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMtime}
% Display date where time is specified in the format
%\meta{hour}:\meta{minute}:\meta{seconds}. This uses \cs{expandafter} in case
%argument is a control sequence containing the time. Not expandable.
%    \begin{macrocode}
\newrobustcmd*{\DTMtime}[1]{%
  \@dtm@parsetime#1\@dtm@endparsetime
  \DTMdisplaytime{\@dtm@hour}{\@dtm@minute}{\@dtm@second}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMcurrentzone}
% Display the current time zone.
%    \begin{macrocode}
\newcommand*{\DTMcurrentzone}{%
 \DTMdisplayzone
  {\@dtm@currenttimezonehour}%
  {\@dtm@currenttimezoneminute}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMdisplayzone}
% Display time zone.
%    \begin{macrocode}
\newcommand*{\DTMdisplayzone}[2]{%
 \ifboolexpe
 { bool{DTMshowisoZ}
   and test{\ifnumequal{#1}{0}}
   and test{\ifnumequal{#2}{0}}
 }%
 {%
   Z%
 }%
 {%
  \ifnum#1<0\else+\fi\DTMtwodigits{#1}%
  \ifDTMshowzoneminutes\dtm@hourminsep\DTMtwodigits{#2}\fi
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMnow}
% Current date, time and time zone.
%    \begin{macrocode}
\newcommand*{\DTMnow}{%
 \DTMdisplay
 {\@dtm@currentyear}
 {\@dtm@currentmonth}
 {\@dtm@currentday}
 {\@dtm@currentdow}
 {\@dtm@currenthour}%
 {\@dtm@currentminute}%
 {\@dtm@currentsecond}%
 {\@dtm@currenttimezonehour}%
 {\@dtm@currenttimezoneminute}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMNow}
% Current date, time and time zone.
%    \begin{macrocode}
\newcommand*{\DTMNow}{%
 \DTMDisplay
 {\@dtm@currentyear}
 {\@dtm@currentmonth}
 {\@dtm@currentday}
 {\@dtm@currentdow}
 {\@dtm@currenthour}%
 {\@dtm@currentminute}%
 {\@dtm@currentsecond}%
 {\@dtm@currenttimezonehour}%
 {\@dtm@currenttimezoneminute}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMdisplay}
%\begin{definition}
%\cs{DTMdisplay}\marg{YYYY}\marg{MM}\marg{DD}\marg{DOW}\marg{hh}\marg{mm}\marg{ss}\newline\marg{TZh}\marg{TZm}
%\end{definition}
% Display the date and time.
%    \begin{macrocode}
\newcommand*{\DTMdisplay}[9]{%
 \ifDTMshowdate
   \DTMdisplaydate{#1}{#2}{#3}{#4}%
   \dtm@datetimesep
 \fi
 \DTMdisplaytime
  {#5}%
  {#6}%
  {#7}%
 \ifDTMshowzone
  \dtm@timezonesep
  \DTMdisplayzone
   {#8}%
   {#9}%
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMDisplay}
%\begin{definition}
%\cs{DTMDisplay}\marg{YYYY}\marg{MM}\marg{DD}\marg{DOW}\marg{hh}\marg{mm}\marg{ss}\newline\marg{TZh}\marg{TZm}
%\end{definition}
% First letter upper case version. Defaults to \cs{DTMdisplay}.
%    \begin{macrocode}
\newcommand*{\DTMDisplay}{\DTMdisplay}
%    \end{macrocode}
%\end{macro}
%
%\subsection{Styles}
%
% Provide user level commands for displaying number as two digits.
% (Truncate if over 99, to allow for converting year to two digits).
%\begin{macro}{\DTMtwodigits}
%    \begin{macrocode}
\newcommand*{\DTMtwodigits}[1]{%
 \ifnum#1<0
  -\DTMtwodigits{-#1}%
 \else
   \ifnum#1<100
     \ifnum#1<10
       0\number#1
     \else
       \number#1
     \fi
   \else
%    \end{macrocode}
% \cs{numexpr} rounds rather than truncates integer division, which
% is a little awkward to get around in an expandable context.
%    \begin{macrocode}
     \ifnum\numexpr#1-(#1/100)*100<0
       \number\numexpr#1-((#1/100)-1)*100\relax
     \else
       \number\numexpr#1-(#1/100)*100\relax
     \fi
   \fi
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMcentury}
% Expands to the given number divided by 100 rounded upwards (in
% absolute terms).
% Provided in case the user just wants the century.
%    \begin{macrocode}
\newcommand*{\DTMcentury}[1]{%
  \ifnum#1<0
    -\DTMcentury{-#1}%
  \else
    \ifnum\numexpr#1-(#1/100)*100<1
       \number\numexpr#1/100\relax
    \else
       \number\numexpr(#1/100)+1\relax
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMdivhundred}
% Expands to the given number modulo 100.
%    \begin{macrocode}
\newcommand*{\DTMdivhundred}[1]{%
  \ifnum#1<0
    -\DTMdivhundred{-#1}%
  \else
    \ifnum\numexpr#1-(#1/100)*100<0
       \number\numexpr(#1)/100-1\relax
    \else
       \number\numexpr((#1)/100)\relax
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMtexorpdfstring}
%Provide user with a command that will use \sty{hyperref}'s
%\cs{texorpdfstring} if \sty{hyperref} has been loaded. If
%\sty{hyperref} isn't loaded it just does the first argument.
%    \begin{macrocode}
\newcommand*{\DTMtexorpdfstring}[2]{#1}
\AtBeginDocument{%
  \@ifpackageloaded{hyperref}%
  {%
    \renewcommand*{\DTMtexorpdfstring}{\texorpdfstring}%
  }%
  {}%
}
%    \end{macrocode}
%\end{macro}
%
% Access separator:
%\begin{macro}{\DTMsep}
%    \begin{macrocode}
\newcommand*{\DTMsep}[1]{\csname dtm@#1sep\endcsname}
%    \end{macrocode}
%\end{macro}
%
% Date-only styles are stored internally as
% \cs{@dtm@datestyle@}\meta{label}, time-only styles are stored
% internally as \cs{@dtm@timestyle@}\meta{label}, zone-only styles
% are stored internally as \cs{@dtm@zonestyle@}\meta{label}.
%
%\begin{macro}{\DTMnewdatestyle}
% Define a new date-only style. This should only redefine
% \cs{DTMdisplaydate} and \cs{DTMDisplaydate}, which may or may not
% use the separators \cs{dtm@yearmonthsep} and \cs{dtm@monthdaysep}.
%    \begin{macrocode}
\newcommand*{\DTMnewdatestyle}[2]{%
  \ifcsdef{@dtm@datestyle@#1}%
  {%
    \PackageError{datetime2}{Date style `#1' already exists}{}%
  }%
  {%
     \csdef{@dtm@datestyle@#1}{#2}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMnewtimestyle}
% Define a new time-only style. This should only redefine
% \cs{DTMdisplaytime}, which may or may not use the separators
% \cs{dtm@hourminsep} and \cs{dtm@minsecsep}.
%    \begin{macrocode}
\newcommand*{\DTMnewtimestyle}[2]{%
  \ifcsdef{@dtm@timestyle@#1}%
  {%
    \PackageError{datetime2}{Time style `#1' already exists}{}%
  }%
  {%
     \csdef{@dtm@timestyle@#1}{#2}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMnewtimezone}
% Define a new zone-only style. This should only redefine
% \cs{DTMdisplayzone}, which may or may not use the separator
% \cs{dtm@hourminsep}.
%    \begin{macrocode}
\newcommand*{\DTMnewzonestyle}[2]{%
  \ifcsdef{@dtm@zonestyle@#1}%
  {%
    \PackageError{datetime2}{Zone style `#1' already exists}{}%
  }%
  {%
     \csdef{@dtm@zonestyle@#1}{#2}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
% Zone styles may use mappings to use a~regional time zone (such as
% GMT or BST). It's up to the language modules to define these
% mappings. A~mapping for time zone \meta{TZh}:\meta{TZm} is stored in 
% \cs{@dtm@zonemap@}\meta{TZh}\texttt{:}\meta{TZm}.
%\begin{macro}{\DTMdefzonemap}
%\begin{definition}
%\cs{DTMdefzonemap}\marg{TZh}\marg{TZm}\marg{map}
%\end{definition}
% This will override any previous mapping for the given time zone.
%    \begin{macrocode}
\newcommand*{\DTMdefzonemap}[3]{%
  \csdef{@dtm@zonemap@\DTMtwodigits{#1}:\DTMtwodigits{#2}}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMusezonemapordefault}
% Expands to the mapping or the default if not defined.
%    \begin{macrocode}
\newcommand*{\DTMusezonemapordefault}[2]{%
  \ifcsundef{@dtm@zonemap@\DTMtwodigits{#1}:\DTMtwodigits{#2}}%
  {%
    \ifnum#1<0\else+\fi
    \DTMtwodigits{#1}%
    \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{#2}\fi
  }%
  {\csname @dtm@zonemap@\DTMtwodigits{#1}:\DTMtwodigits{#2}\endcsname}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMusezonemap}
% Expands to the mapping. (No check if defined.)
%    \begin{macrocode}
\newcommand*{\DTMusezonemap}[2]{%
  \csname @dtm@zonemap@\DTMtwodigits{#1}:\DTMtwodigits{#2}\endcsname
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMhaszonemap}
%    \begin{macrocode}
\newcommand*{\DTMhaszonemap}[4]{%
  \ifcsundef{@dtm@zonemap@\DTMtwodigits{#1}:\DTMtwodigits{#2}}{#4}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMclearmap}
% Undefines the given zone mapping. No check is made to determine if
% the map exists.
%    \begin{macrocode}
\newcommand*{\DTMclearmap}[2]{%
 \csundef{@dtm@zonemap@\DTMtwodigits{#1}:\DTMtwodigits{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMshowmap}
%Debugging command.
%    \begin{macrocode}
\newcommand*{\DTMshowmap}[2]{%
 \csshow{@dtm@zonemap@\DTMtwodigits{#1}:\DTMtwodigits{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMresetzones}
% Regional modules should use this before setting their local zones,
% so that users can unset previously defined zones that are outside
% the region if they require. By default this does nothing, so no
% modifications are made.
%    \begin{macrocode}
\newcommand*{\DTMresetzones}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMNatoZoneMaps}
% Provide a command to set the time zone abbreviations to the
% military\slash NATO style.
%    \begin{macrocode}
\newcommand*{\DTMNatoZoneMaps}{%
  \defzonemap{01}{00}{A}% Alpha time zone
  \defzonemap{02}{00}{B}% Bravo time zone
  \defzonemap{03}{00}{C}% Charlie time zone
  \defzonemap{04}{00}{D}% Delta time zone
  \defzonemap{05}{00}{E}% Echo time zone
  \defzonemap{06}{00}{F}% Foxtrot time zone
  \defzonemap{07}{00}{G}% Golf time zone
  \defzonemap{08}{00}{H}% Hotel time zone
  \defzonemap{09}{00}{I}% India time zone
  \defzonemap{10}{00}{K}% Kilo time zone
  \defzonemap{11}{00}{L}% Lima time zone
  \defzonemap{12}{00}{M}% Mike time zone
  \defzonemap{-01}{00}{N}% November time zone
  \defzonemap{-02}{00}{O}% Oscar time zone
  \defzonemap{-03}{00}{P}% Papa time zone
  \defzonemap{-04}{00}{Q}% Quebec time zone
  \defzonemap{-05}{00}{R}% Romeo time zone
  \defzonemap{-06}{00}{S}% Sierra time zone
  \defzonemap{-07}{00}{T}% Tango time zone
  \defzonemap{-08}{00}{U}% Uniform time zone
  \defzonemap{-09}{00}{V}% Victor time zone
  \defzonemap{-10}{00}{W}% Whiskey time zone
  \defzonemap{-11}{00}{X}% X-ray time zone
  \defzonemap{-12}{00}{Y}% Yankee time zone
  \defzonemap{00}{00}{Z}% Zulu time zone
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMnewstyle}
%\begin{definition}
%\cs{DTMnewstyle}\marg{label}\marg{date style definition}\marg{time
%style definition}\marg{zone style definition}\marg{full format
%definition}
%\end{definition}
% Define a new style. The full format redefines \cs{DTMdisplay}
% and \cs{DTMDisplay}.
%    \begin{macrocode}
\newcommand*{\DTMnewstyle}[5]{%
  \ifcsdef{@dtm@style@#1}%
  {%
    \PackageError{datetime2}{Style `#1' already exists}{}%
  }%
  {%
    \DTMnewdatestyle{#1}{#2}%
    \DTMnewtimestyle{#1}{#3}%
    \DTMnewzonestyle{#1}{#4}%
     \csdef{@dtm@style@#1}{%
        \csuse{@dtm@datestyle@#1}%
        \csuse{@dtm@timestyle@#1}%
        \csuse{@dtm@zonestyle@#1}%
        #5%
     }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMsetdatestyle}
%    \begin{macrocode}
\newrobustcmd*{\DTMsetdatestyle}[1]{%
  \ifcsdef{@dtm@datestyle@#1}%
  {\csuse{@dtm@datestyle@#1}}%
  {%
    \PackageError{datetime2}{Date style `#1' not defined}{}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMsettimestyle}
%    \begin{macrocode}
\newrobustcmd*{\DTMsettimestyle}[1]{%
  \ifcsdef{@dtm@timestyle@#1}%
  {\csuse{@dtm@timestyle@#1}}%
  {%
    \PackageError{datetime2}{Time style `#1' not defined}{}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMsetzonestyle}
%    \begin{macrocode}
\newrobustcmd*{\DTMsetzonestyle}[1]{%
  \ifcsdef{@dtm@zonestyle@#1}%
  {\csuse{@dtm@zonestyle@#1}}%
  {%
    \PackageError{datetime2}{Zone style `#1' not defined}{}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMsetstyle}
%    \begin{macrocode}
\newrobustcmd*{\DTMsetstyle}[1]{%
  \ifcsdef{@dtm@style@#1}%
  {\csuse{@dtm@style@#1}}%
  {%
     \let\dtm@unknownstyle\@dtm@unknownstyle
     \ifcsdef{@dtm@datestyle#1}%
       {\csuse{@dtm@datestyle@#1}\let\dtm@unknownstyle\@dtm@unknown@style}%
       {\@dtm@warning{No date style `#1' defined}}%
     \ifcsdef{@dtm@timestyle#1}%
       {\csuse{@dtm@timestyle@#1}\let\dtm@unknownstyle\@dtm@unknown@style}%
       {\@dtm@warning{No time style `#1' defined}}%
     \ifcsdef{@dtm@zonestyle#1}%
       {\csuse{@dtm@zonestyle@#1}\let\dtm@unknownstyle\@dtm@unknown@style}%
       {\@dtm@warning{No zone style `#1' defined}}%
     \dtm@unknownstyle{#1}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dtm@unknownstyle}
%    \begin{macrocode}
\newcommand*{\@dtm@unknownstyle}[1]{%
  \PackageError{datetime2}{Unknown style `#1'}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dtm@unknown@style}
%    \begin{macrocode}
\newcommand*{\@dtm@unknown@style}[1]{%
  \@dtm@warning{No full style `#1' defined}{}%
}
%    \end{macrocode}
%\end{macro}
%
% Define \style{default} style:
%    \begin{macrocode}
\DTMnewstyle
 {default}%label
 {% date style
    \renewcommand*\DTMdisplaydate[4]{%
      \number##1\DTMsep{yearmonth}\DTMtwodigits{##2}%
      \DTMsep{monthday}\DTMtwodigits{##3}%
    }%
    \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
 }%
 {% time style
    \renewcommand*\DTMdisplaytime[3]{%
      \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}%
      \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi
    }%
 }%
 {% zone style
   \renewcommand*{\DTMdisplayzone}[2]{%
     \ifboolexpe
     { bool{DTMshowisoZ}
       and test{\ifnumequal{##1}{0}}
       and test{\ifnumequal{##2}{0}}
     }%
     {%
       Z%
     }%
     {%
      \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
      \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi
     }%
   }%
 }%
 {% full style
   \renewcommand*{\DTMdisplay}[9]{%
    \ifDTMshowdate
     \DTMdisplaydate{##1}{##2}{##3}{##4}%
     \DTMsep{datetime}%
    \fi
    \DTMdisplaytime
     {##5}%
     {##6}%
     {##7}%
    \ifDTMshowzone
     \DTMsep{timezone}%
     \DTMdisplayzone
      {##8}%
      {##9}%
    \fi
   }%
   \renewcommand*{\DTMDisplay}{\DTMdisplay}%
 }
%    \end{macrocode}
%
% Define \style{iso} style which ignores the separator settings:
%    \begin{macrocode}
\DTMnewstyle
 {iso}%label
 {% date style
    \renewcommand*\DTMdisplaydate[4]{%
      \number##1-\DTMtwodigits{##2}-\DTMtwodigits{##3}%
    }%
    \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
 }%
 {% time style
    \renewcommand*\DTMdisplaytime[3]{%
      \DTMtwodigits{##1}:\DTMtwodigits{##2}%
      \ifDTMshowseconds:\DTMtwodigits{##3}\fi
    }%
 }%
 {% zone style
   \renewcommand*{\DTMdisplayzone}[2]{%
     \ifboolexpe
     { bool{DTMshowisoZ}
       and test{\ifnumequal{##1}{0}}
       and test{\ifnumequal{##2}{0}}
     }%
     {%
       Z%
     }%
     {%
      \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
      \ifDTMshowzoneminutes:\DTMtwodigits{##2}\fi
     }%
   }%
 }%
 {% full style
   \renewcommand*{\DTMdisplay}[9]{%
    \ifDTMshowdate
     \DTMdisplaydate{##1}{##2}{##3}{##4}%
     T%
    \fi
    \DTMdisplaytime
     {##5}%
     {##6}%
     {##7}%
    \ifDTMshowzone
     \DTMdisplayzone
      {##8}%
      {##9}%
    \fi
   }%
   \renewcommand*{\DTMDisplay}{\DTMdisplay}%
 }
%    \end{macrocode}
%
% Define \style{pdf} style which converts into a format that can be
% used in \cs{pdfinfo}:
%    \begin{macrocode}
\DTMnewstyle
 {pdf}%label
 {% date style
    \renewcommand*\DTMdisplaydate[4]{%
      D:\number##1 % space intended
      \DTMtwodigits{##2}\DTMtwodigits{##3}%
    }%
    \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
 }%
 {% time style
    \renewcommand*\DTMdisplaytime[3]{%
      \DTMtwodigits{##1}\DTMtwodigits{##2}\DTMtwodigits{##3}%
    }%
 }%
 {% zone style
   \renewcommand*{\DTMdisplayzone}[2]{%
     \ifboolexpe
     { bool{DTMshowisoZ}
       and test{\ifnumequal{##1}{0}}
       and test{\ifnumequal{##2}{0}}
     }%
     {%
       Z%
     }%
     {%
      \ifnum##1<0\else+\fi\DTMtwodigits{##1}'\DTMtwodigits{##2}'%
     }%
   }%
 }%
 {% full style
   \renewcommand*{\DTMdisplay}[9]{%
    \DTMdisplaydate{##1}{##2}{##3}{##4}%
    \DTMdisplaytime{##5}{##6}{##7}%
    \DTMdisplayzone{##8}{##9}%
   }%
   \renewcommand*{\DTMDisplay}{\DTMdisplay}%
 }
%    \end{macrocode}
%
% Define \style{yyyymd} style:
%    \begin{macrocode}
\DTMnewstyle
 {yyyymd}%label
 {% date style
    \renewcommand*\DTMdisplaydate[4]{%
      \number##1
      \DTMsep{yearmonth}%
      \number##2
      \DTMsep{monthday}%
      \number##3
    }%
    \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
 }%
 {% time style
    \renewcommand*\DTMdisplaytime[3]{%
      \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}%
      \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi
    }%
 }%
 {% zone style
   \renewcommand*{\DTMdisplayzone}[2]{%
     \ifboolexpe
     { bool{DTMshowisoZ}
       and test{\ifnumequal{##1}{0}}
       and test{\ifnumequal{##2}{0}}
     }%
     {%
       Z%
     }%
     {%
      \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
      \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi
     }%
   }%
 }%
 {% full style
   \renewcommand*{\DTMdisplay}[9]{%
    \ifDTMshowdate
     \DTMdisplaydate{##1}{##2}{##3}{##4}%
     \DTMsep{datetime}%
    \fi
    \DTMdisplaytime
     {##5}%
     {##6}%
     {##7}%
    \ifDTMshowzone
     \DTMsep{timezone}%
     \DTMdisplayzone
      {##8}%
      {##9}%
    \fi
   }%
   \renewcommand*{\DTMDisplay}{\DTMdisplay}%
 }
%    \end{macrocode}
%
% Define \style{ddmmyyyy} style:
%    \begin{macrocode}
\DTMnewstyle
 {ddmmyyyy}%label
 {% date style
    \renewcommand*\DTMdisplaydate[4]{%
      \DTMtwodigits{##3}\DTMsep{monthday}%
      \DTMtwodigits{##2}\DTMsep{yearmonth}%
      \number##1
    }%
    \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
 }%
 {% time style
    \renewcommand*\DTMdisplaytime[3]{%
      \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}%
      \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi
    }%
 }%
 {% zone style
   \renewcommand*{\DTMdisplayzone}[2]{%
     \ifboolexpe
     { bool{DTMshowisoZ}
       and test{\ifnumequal{##1}{0}}
       and test{\ifnumequal{##2}{0}}
     }%
     {%
       Z%
     }%
     {%
      \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
      \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi
     }%
   }%
 }%
 {% full style
   \renewcommand*{\DTMdisplay}[9]{%
    \ifDTMshowdate
     \DTMdisplaydate{##1}{##2}{##3}{##4}%
     \DTMsep{datetime}%
    \fi
    \DTMdisplaytime
     {##5}%
     {##6}%
     {##7}%
    \ifDTMshowzone
     \DTMsep{timezone}%
     \DTMdisplayzone
      {##8}%
      {##9}%
    \fi
   }%
   \renewcommand*{\DTMDisplay}{\DTMdisplay}%
 }
%    \end{macrocode}
%
% Define \style{dmyyyy} style:
%    \begin{macrocode}
\DTMnewstyle
 {dmyyyy}%label
 {% date style
    \renewcommand*\DTMdisplaydate[4]{%
      \number##3
      \DTMsep{monthday}%
      \number##2
      \DTMsep{yearmonth}%
      \number##1
    }%
    \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
 }%
 {% time style
    \renewcommand*\DTMdisplaytime[3]{%
      \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}%
      \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi
    }%
 }%
 {% zone style
   \renewcommand*{\DTMdisplayzone}[2]{%
     \ifboolexpe
     { bool{DTMshowisoZ}
       and test{\ifnumequal{##1}{0}}
       and test{\ifnumequal{##2}{0}}
     }%
     {%
       Z%
     }%
     {%
      \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
      \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi
     }%
   }%
 }%
 {% full style
   \renewcommand*{\DTMdisplay}[9]{%
    \ifDTMshowdate
     \DTMdisplaydate{##1}{##2}{##3}{##4}%
     \DTMsep{datetime}%
    \fi
    \DTMdisplaytime
     {##5}%
     {##6}%
     {##7}%
    \ifDTMshowzone
     \DTMsep{timezone}%
     \DTMdisplayzone
      {##8}%
      {##9}%
    \fi
   }%
   \renewcommand*{\DTMDisplay}{\DTMdisplay}%
 }
%    \end{macrocode}
%
% Define \style{dmyy} style:
%    \begin{macrocode}
\DTMnewstyle
 {dmyy}%label
 {% date style
    \renewcommand*\DTMdisplaydate[4]{%
      \number##3 % space intended
      \DTMsep{monthday}%
      \number##2 % space intended
      \DTMsep{yearmonth}%
      \DTMtwodigits{##1}%
    }%
    \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
 }%
 {% time style
    \renewcommand*\DTMdisplaytime[3]{%
      \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}%
      \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi
    }%
 }%
 {% zone style
   \renewcommand*{\DTMdisplayzone}[2]{%
     \ifboolexpe
     { bool{DTMshowisoZ}
       and test{\ifnumequal{##1}{0}}
       and test{\ifnumequal{##2}{0}}
     }%
     {%
       Z%
     }%
     {%
      \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
      \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi
     }%
   }%
 }%
 {% full style
   \renewcommand*{\DTMdisplay}[9]{%
    \ifDTMshowdate
     \DTMdisplaydate{##1}{##2}{##3}{##4}%
     \DTMsep{datetime}%
    \fi
    \DTMdisplaytime
     {##5}%
     {##6}%
     {##7}%
    \ifDTMshowzone
     \DTMsep{timezone}%
     \DTMdisplayzone
      {##8}%
      {##9}%
    \fi
   }%
   \renewcommand*{\DTMDisplay}{\DTMdisplay}%
 }
%    \end{macrocode}
%
% Define \style{mmddyyyy} style:
%    \begin{macrocode}
\DTMnewstyle
 {mmddyyyy}%label
 {% date style
    \renewcommand*\DTMdisplaydate[4]{%
      \DTMtwodigits{##2}\DTMsep{monthday}%
      \DTMtwodigits{##3}\DTMsep{dayyear}%
      \number##1
    }%
    \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
 }%
 {% time style
    \renewcommand*\DTMdisplaytime[3]{%
      \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}%
      \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi
    }%
 }%
 {% zone style
   \renewcommand*{\DTMdisplayzone}[2]{%
     \ifboolexpe
     { bool{DTMshowisoZ}
       and test{\ifnumequal{##1}{0}}
       and test{\ifnumequal{##2}{0}}
     }%
     {%
       Z%
     }%
     {%
      \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
      \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi
     }%
   }%
 }%
 {% full style
   \renewcommand*{\DTMdisplay}[9]{%
    \ifDTMshowdate
     \DTMdisplaydate{##1}{##2}{##3}{##4}%
     \DTMsep{datetime}%
    \fi
    \DTMdisplaytime
     {##5}%
     {##6}%
     {##7}%
    \ifDTMshowzone
     \DTMsep{timezone}%
     \DTMdisplayzone
      {##8}%
      {##9}%
    \fi
   }%
   \renewcommand*{\DTMDisplay}{\DTMdisplay}%
 }
%    \end{macrocode}
%
% Define \style{mdyyyy} style:
%    \begin{macrocode}
\DTMnewstyle
 {mdyyyy}%label
 {% date style
    \renewcommand*\DTMdisplaydate[4]{%
      \number##2 % space intended
      \DTMsep{monthday}%
      \number##3 % space intended
      \DTMsep{dayyear}%
      \number##1 % space intended
    }%
    \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
 }%
 {% time style
    \renewcommand*\DTMdisplaytime[3]{%
      \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}%
      \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi
    }%
 }%
 {% zone style
   \renewcommand*{\DTMdisplayzone}[2]{%
     \ifboolexpe
     { bool{DTMshowisoZ}
       and test{\ifnumequal{##1}{0}}
       and test{\ifnumequal{##2}{0}}
     }%
     {%
       Z%
     }%
     {%
      \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
      \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi
     }%
   }%
 }%
 {% full style
   \renewcommand*{\DTMdisplay}[9]{%
    \ifDTMshowdate
     \DTMdisplaydate{##1}{##2}{##3}{##4}%
     \DTMsep{datetime}%
    \fi
    \DTMdisplaytime
     {##5}%
     {##6}%
     {##7}%
    \ifDTMshowzone
     \DTMsep{timezone}%
     \DTMdisplayzone
      {##8}%
      {##9}%
    \fi
   }%
   \renewcommand*{\DTMDisplay}{\DTMdisplay}%
 }
%    \end{macrocode}
%
% Define \style{mdyy} style:
%    \begin{macrocode}
\DTMnewstyle
 {mdyy}%label
 {% date style
    \renewcommand*\DTMdisplaydate[4]{%
      \number##2 % space intended
      \DTMsep{monthday}%
      \number##3 % space intended
      \DTMsep{dayyear}%
      \DTMtwodigits{##1}%
    }%
    \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
 }%
 {% time style
    \renewcommand*\DTMdisplaytime[3]{%
      \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}%
      \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi
    }%
 }%
 {% zone style
   \renewcommand*{\DTMdisplayzone}[2]{%
     \ifboolexpe
     { bool{DTMshowisoZ}
       and test{\ifnumequal{##1}{0}}
       and test{\ifnumequal{##2}{0}}
     }%
     {%
       Z%
     }%
     {%
      \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
      \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi
     }%
   }%
 }%
 {% full style
   \renewcommand*{\DTMdisplay}[9]{%
    \ifDTMshowdate
     \DTMdisplaydate{##1}{##2}{##3}{##4}%
     \DTMsep{datetime}%
    \fi
    \DTMdisplaytime
     {##5}%
     {##6}%
     {##7}%
    \ifDTMshowzone
     \DTMsep{timezone}%
     \DTMdisplayzone
      {##8}%
      {##9}%
    \fi
   }%
   \renewcommand*{\DTMDisplay}{\DTMdisplay}%
 }
%    \end{macrocode}
%
% Define \style{hmmss} time style
%    \begin{macrocode}
\DTMnewtimestyle
 {hmmss}% label
 {% 
    \renewcommand*\DTMdisplaytime[3]{%
      \number##1
      \DTMsep{hourmin}\DTMtwodigits{##2}%
      \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi
    }%
 }%
%    \end{macrocode}
%
% Define \style{map} zone style
%    \begin{macrocode}
\DTMnewzonestyle
 {map}% label
 {% 
    \renewcommand*\DTMdisplaytime[3]{%
      \DTMusezonemapordefault{##1}{##2}%
    }%
 }%
%    \end{macrocode}
%
% Define \style{hhmm} zone style
%    \begin{macrocode}
\DTMnewzonestyle
 {hhmm}% label
 {%
    \renewcommand*\DTMdisplaytime[3]{%
      \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
      \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi
    }%
 }
%    \end{macrocode}
%
%\subsection{Saving and Using Dates}
% Date and time information is stored in control sequences in the
% form \cs{@dtm@}\meta{label}\texttt{@}\meta{tag}, where
% \meta{label} is the label uniquely identifying the information and
% \meta{tag} is the element (\texttt{year}, \texttt{month},
% \texttt{day}, \texttt{dow}, \texttt{hour}, \texttt{minute},
% \texttt{second}, \texttt{TZhour} and \texttt{TZminute}). Missing
% information is stored as \texttt{0} (except for the day of week, which is
% stored as \texttt{-1}).
%
%\begin{macro}{\DTMsavedate}
% Save the date specified in the format
% \meta{yyyy}-\meta{mm}-\meta{dd}. \cs{expandafter} is used in case
% the argument is a control sequence storing the date. This will
% redefine an existing saved date with the same label. The first
% argument is the label.
%    \begin{macrocode}
\newrobustcmd*{\DTMsavedate}[2]{%
  \expandafter\@dtm@parsedate#2\@dtm@endparsedate
  \cslet{@dtm@#1@year}{\@dtm@year}%
  \cslet{@dtm@#1@month}{\@dtm@month}%
  \cslet{@dtm@#1@day}{\@dtm@day}%
  \cslet{@dtm@#1@dow}{\@dtm@dow}%
  \ifcsundef{@dtm@#1@hour}{\csdef{@dtm@#1@hour}{0}}{}%
  \ifcsundef{@dtm@#1@minute}{\csdef{@dtm@#1@minute}{0}}{}%
  \ifcsundef{@dtm@#1@second}{\csdef{@dtm@#1@second}{0}}{}%
  \ifcsundef{@dtm@#1@TZhour}{\csdef{@dtm@#1@TZhour}{0}}{}%
  \ifcsundef{@dtm@#1@TZminute}{\csdef{@dtm@#1@TZminute}{0}}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMsavenoparsedate}
% Save the date without parsing the
% \meta{YYYY}-\meta{MM}-\meta{DD} format.
%    \begin{macrocode}
\newrobustcmd*{\DTMsavenoparsedate}[5]{%
  \csedef{@dtm@#1@year}{\number#2}%
  \csedef{@dtm@#1@month}{\number#3}%
  \csedef{@dtm@#1@day}{\number#4}%
  \csedef{@dtm@#1@dow}{\number#5}%
  \ifcsundef{@dtm@#1@hour}{\csdef{@dtm@#1@hour}{0}}{}%
  \ifcsundef{@dtm@#1@minute}{\csdef{@dtm@#1@minute}{0}}{}%
  \ifcsundef{@dtm@#1@second}{\csdef{@dtm@#1@second}{0}}{}%
  \ifcsundef{@dtm@#1@TZhour}{\csdef{@dtm@#1@TZhour}{0}}{}%
  \ifcsundef{@dtm@#1@TZminute}{\csdef{@dtm@#1@TZminute}{0}}{}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\DTMsavetime}
% Save the time specified in the format
% \meta{hh}:\meta{mm}:\meta{ss}. \cs{expandafter} is used in case
% the argument is a control sequence storing the date. This will
% redefine an existing saved date with the same label. The first
% argument is the label.
%    \begin{macrocode}
\newrobustcmd*{\DTMsavetime}[2]{%
  \expandafter\@dtm@parsetime#2\@dtm@endparsetime
  \cslet{@dtm@#1@hour}{\@dtm@hour}%
  \cslet{@dtm@#1@minute}{\@dtm@minute}%
  \cslet{@dtm@#1@second}{\@dtm@second}%
  \ifcsundef{@dtm@#1@year}{\csdef{@dtm@#1@year}{0}}{}%
  \ifcsundef{@dtm@#1@month}{\csdef{@dtm@#1@month}{0}}{}%
  \ifcsundef{@dtm@#1@day}{\csdef{@dtm@#1@day}{0}}{}%
  \ifcsundef{@dtm@#1@dow}{\csdef{@dtm@#1@dow}{-1}}{}%
  \ifcsundef{@dtm@#1@TZhour}{\csdef{@dtm@#1@TZhour}{0}}{}%
  \ifcsundef{@dtm@#1@TZminute}{\csdef{@dtm@#1@TZminute}{0}}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMsavetimezn}
% Save the time (including zone) specified in the format
% \meta{hh}:\meta{mm}:\meta{ss} \meta{tzh}:\meta{tzm}.
% \cs{expandafter} is used in case
% the argument is a control sequence storing the date. This will
% redefine an existing saved date with the same label. The first
% argument is the label.
%    \begin{macrocode}
\newrobustcmd*{\DTMsavetimezn}[2]{%
  \expandafter\@dtm@parsetimezn#2\@dtm@endparsetimezn
  \cslet{@dtm@#1@hour}{\@dtm@hour}%
  \cslet{@dtm@#1@minute}{\@dtm@minute}%
  \cslet{@dtm@#1@second}{\@dtm@second}%
  \cslet{@dtm@#1@TZhour}{\@dtm@timezonehour}%
  \cslet{@dtm@#1@TZminute}{\@dtm@timezoneminute}%
  \ifcsundef{@dtm@#1@year}{\csdef{@dtm@#1@year}{0}}{}%
  \ifcsundef{@dtm@#1@month}{\csdef{@dtm@#1@month}{0}}{}%
  \ifcsundef{@dtm@#1@day}{\csdef{@dtm@#1@day}{0}}{}%
  \ifcsundef{@dtm@#1@dow}{\csdef{@dtm@#1@dow}{-1}}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMsavetimestamp}
% Save the time (including zone) specified in the format
%\meta{YYYY}-\meta{MM}-\meta{DD}T\meta{hh}:\meta{mm}:\meta{ss}\meta{time
%zone}
%    \begin{macrocode}
\newrobustcmd*{\DTMsavetimestamp}[2]{%
  \expandafter\@dtm@parsetimestamp#2\@dtm@endparsetimestamp
  \cslet{@dtm@#1@year}{\@dtm@year}%
  \cslet{@dtm@#1@month}{\@dtm@month}%
  \cslet{@dtm@#1@day}{\@dtm@day}%
  \cslet{@dtm@#1@dow}{\@dtm@dow}%
  \cslet{@dtm@#1@hour}{\@dtm@hour}%
  \cslet{@dtm@#1@minute}{\@dtm@minute}%
  \cslet{@dtm@#1@second}{\@dtm@second}%
  \cslet{@dtm@#1@TZhour}{\@dtm@timezonehour}%
  \cslet{@dtm@#1@TZminute}{\@dtm@timezoneminute}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMsavenow}
%Save the current time.
%    \begin{macrocode}
\newrobustcmd{\DTMsavenow}[1]{%
  \cslet{@dtm@#1@year}{\@dtm@currentyear}%
  \cslet{@dtm@#1@month}{\@dtm@currentmonth}%
  \cslet{@dtm@#1@day}{\@dtm@currentday}%
  \cslet{@dtm@#1@dow}{\@dtm@currentdow}%
  \cslet{@dtm@#1@hour}{\@dtm@currenthour}%
  \cslet{@dtm@#1@minute}{\@dtm@currentminute}%
  \cslet{@dtm@#1@second}{\@dtm@currentsecond}%
  \cslet{@dtm@#1@TZhour}{\@dtm@currenttimezonehour}%
  \cslet{@dtm@#1@TZminute}{\@dtm@currenttimezoneminute}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMmakeglobal}
%Globally set the stored information.
%    \begin{macrocode}
\newrobustcmd{\DTMmakeglobal}[1]{%
  \global\csletcs{@dtm@#1@year}{@dtm@#1@year}%
  \global\csletcs{@dtm@#1@month}{@dtm@#1@month}%
  \global\csletcs{@dtm@#1@day}{@dtm@#1@day}%
  \global\csletcs{@dtm@#1@dow}{@dtm@#1@dow}%
  \global\csletcs{@dtm@#1@hour}{@dtm@#1@hour}%
  \global\csletcs{@dtm@#1@minute}{@dtm@#1@minute}%
  \global\csletcs{@dtm@#1@second}{@dtm@#1@second}%
  \global\csletcs{@dtm@#1@TZhour}{@dtm@#1@TZhour}%
  \global\csletcs{@dtm@#1@TZminute}{@dtm@#1@TZminute}%
}
%    \end{macrocode}
%\end{macro}
%
% Expandable ways of fetching saved data. (No check for existence
% performed.) The argument is the label.
%\begin{macro}{\DTMfetchyear}
%    \begin{macrocode}
\newcommand*{\DTMfetchyear}[1]{\csname @dtm@#1@year\endcsname}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\DTMfetchmonth}
%    \begin{macrocode}
\newcommand*{\DTMfetchmonth}[1]{\csname @dtm@#1@month\endcsname}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\DTMfetchday}
%    \begin{macrocode}
\newcommand*{\DTMfetchday}[1]{\csname @dtm@#1@day\endcsname}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\DTMfetchdow}
%    \begin{macrocode}
\newcommand*{\DTMfetchdow}[1]{\csname @dtm@#1@dow\endcsname}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\DTMfetchhour}
%    \begin{macrocode}
\newcommand*{\DTMfetchhour}[1]{\csname @dtm@#1@hour\endcsname}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\DTMfetchminute}
%    \begin{macrocode}
\newcommand*{\DTMfetchminute}[1]{\csname @dtm@#1@minute\endcsname}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\DTMfetchsecond}
%    \begin{macrocode}
\newcommand*{\DTMfetchsecond}[1]{\csname @dtm@#1@second\endcsname}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\DTMfetchTZhour}
%    \begin{macrocode}
\newcommand*{\DTMfetchTZhour}[1]{\csname @dtm@#1@TZhour\endcsname}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\DTMfetchTZminute}
%    \begin{macrocode}
\newcommand*{\DTMfetchTZminute}[1]{\csname @dtm@#1@TZminute\endcsname}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMusedate}
%\begin{definition}
%\cs{DTMusedate}\marg{label}
%\end{definition}
% Displays the previously saved date using \cs{DTMdisplaydate}.
%    \begin{macrocode}
\newcommand*\DTMusedate[1]{%
  \ifcsundef{@dtm@#1@year}%
  {%
     \PackageError{datetime2}{Undefined date `#1'}{}%
  }%
  {%
     \DTMdisplaydate
      {\csname @dtm@#1@year\endcsname}%
      {\csname @dtm@#1@month\endcsname}%
      {\csname @dtm@#1@day\endcsname}%
      {\csname @dtm@#1@dow\endcsname}%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMUsedate}
%\begin{definition}
%\cs{DTMUsedate}\marg{label}
%\end{definition}
% Displays the previously saved date using \cs{DTMDisplaydate}.
%    \begin{macrocode}
\newcommand*\DTMUsedate[1]{%
  \ifcsundef{@dtm@#1@year}%
  {%
     \PackageError{datetime2}{Undefined date `#1'}{}%
  }%
  {%
     \DTMDisplaydate
      {\csname @dtm@#1@year\endcsname}%
      {\csname @dtm@#1@month\endcsname}%
      {\csname @dtm@#1@day\endcsname}%
      {\csname @dtm@#1@dow\endcsname}%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMusetime}
%\begin{definition}
%\cs{DTMusetime}\marg{label}
%\end{definition}
% Displays the previously saved time using \cs{DTMdisplaytime}.
%    \begin{macrocode}
\newcommand*\DTMusetime[1]{%
  \ifcsundef{@dtm@#1@hour}%
  {%
     \PackageError{datetime2}{Undefined time `#1'}{}%
  }%
  {%
     \DTMdisplaytime
      {\csname @dtm@#1@hour\endcsname}%
      {\csname @dtm@#1@minute\endcsname}%
      {\csname @dtm@#1@second\endcsname}%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMusezone}
%\begin{definition}
%\cs{DTMusezone}\marg{label}
%\end{definition}
% Displays the previously saved date using \cs{DTMdisplayzone}.
%    \begin{macrocode}
\newcommand*\DTMusezone[1]{%
  \ifcsundef{@dtm@#1@TZhour}%
  {%
     \PackageError{datetime2}{Undefined time `#1'}{}%
  }%
  {%
     \DTMdisplayzone
      {\csname @dtm@#1@TZhour\endcsname}%
      {\csname @dtm@#1@TZminute\endcsname}%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMuse}
%\begin{definition}
%\cs{DTMuse}\marg{label}
%\end{definition}
% Displays the previously saved date and time.
%    \begin{macrocode}
\newcommand*\DTMuse[1]{%
  \ifcsundef{@dtm@#1@year}%
  {%
     \PackageError{datetime2}{Undefined date-time `#1'}{}%
  }%
  {%
     \DTMdisplay
      {\csname @dtm@#1@year\endcsname}%
      {\csname @dtm@#1@month\endcsname}%
      {\csname @dtm@#1@day\endcsname}%
      {\csname @dtm@#1@dow\endcsname}%
      {\csname @dtm@#1@hour\endcsname}%
      {\csname @dtm@#1@minute\endcsname}%
      {\csname @dtm@#1@second\endcsname}%
      {\csname @dtm@#1@TZhour\endcsname}%
      {\csname @dtm@#1@TZminute\endcsname}%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMUse}
%\begin{definition}
%\cs{DTMUse}\marg{label}
%\end{definition}
% Displays the previously saved date and time.
%    \begin{macrocode}
\newcommand*\DTMUse[1]{%
  \ifcsundef{@dtm@#1@year}%
  {%
     \PackageError{datetime2}{Undefined date-time `#1'}{}%
  }%
  {%
     \DTMDisplay
      {\csname @dtm@#1@year\endcsname}%
      {\csname @dtm@#1@month\endcsname}%
      {\csname @dtm@#1@day\endcsname}%
      {\csname @dtm@#1@dow\endcsname}%
      {\csname @dtm@#1@hour\endcsname}%
      {\csname @dtm@#1@minute\endcsname}%
      {\csname @dtm@#1@second\endcsname}%
      {\csname @dtm@#1@TZhour\endcsname}%
      {\csname @dtm@#1@TZminute\endcsname}%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMifsaveddate}
% Determine if the given label has been assigned to a date, time and
% zone.
%    \begin{macrocode}
\newcommand{\DTMifsaveddate}[3]{%
  \ifcsundef{@dtm@#1@year}{#3}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\subsection{Language Module Loading}
%
% Define commands to load regional settings.
%
%\begin{macro}{\@dtm@requiremodule}
% Use \sty{tracklang} interface to find the associated file for the
% given dialect.
%    \begin{macrocode}
\newcommand*{\@dtm@requiremodule}[1]{%
  \IfTrackedLanguageFileExists{#1}%
  {datetime2-}% prefix
  {.ldf}% suffix
  {%
    \RequireDateTimeModule{\CurrentTrackedTag}%
  }%
  {%
    \@dtm@warning{Date-Time Language Module `#1' not installed}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dtm@loadedregions}
% List of loaded \styfmt{datetime2} language modules.
%    \begin{macrocode}
\newcommand*{\@dtm@loadedregions}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\RequireDateTimeModule}
% Input the language file, if not already loaded.
% Should only be used with \cs{@dtm@requiremodule}
% which sets commands like \cs{CurrentTrackedDialect}.
% Since the language modules are loaded within
% \cs{@dtm@requiremodule} they may use this command to load
% dependent modules.
%    \begin{macrocode}
\newcommand*{\RequireDateTimeModule}[1]{%
 \ifundef\CurrentTrackedDialect
 {%
   \PackageError{datetime2}%
   {\string\RequireDateTimeModule\space not permitted here}%
   {This command is only permitted inside datetime2 language
    modules.}%
 }%
 {%
   \ifcsundef{ver@datetime2-#1.ldf}%
   {%
     \input{datetime2-#1.ldf}%
     \ifdefempty\@dtm@loadedregions
     {%
       \edef\@dtm@loadedregions{#1}%
     }%
     {%
       \edef\@dtm@loadedregions{\@dtm@loadedregions,#1}%
     }%
   }%
   {}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\ProvidesDateTimeModule}
% For use in language module to identify itself.
%    \begin{macrocode}
\newcommand*{\ProvidesDateTimeModule}[1]{%
  \ProvidesFile{datetime2-#1.ldf}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMdefkey}
%\begin{definition}
%\cs{DTMdefkey}\marg{region}\marg{key}\oarg{default}\marg{func}
%\end{definition}
% Used by language modules to define a key.
%    \begin{macrocode}
\newcommand*{\DTMdefkey}[1]{\define@key[dtm]{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMdefchoicekey}
%\begin{definition}
%\cs{DTMdefchoicekey}\marg{region}\marg{key}\oarg{bin}\marg{choice
%list}\marg{default}\marg{func}
%\end{definition}
% Used by language modules to define a choice key.
%    \begin{macrocode}
\newcommand*{\DTMdefchoicekey}[1]{\define@choicekey[dtm]{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMdefboolkey}
%\begin{definition}
%\cs{DTMdefboolkey}\marg{region}\oarg{mp}\marg{key}\oarg{default}\marg{func}
%\end{definition}
% Used by language modules to define a boolean key.
%    \begin{macrocode}
\newcommand*{\DTMdefboolkey}[1]{\define@boolkey[dtm]{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMifbool}
%\begin{definition}
%\cs{DTMifbool}\marg{region}\marg{key}\marg{true}\marg{false}
%\end{definition}
% Test boolean key that was defined using \cs{DTMdefboolkey}
%    \begin{macrocode}
\newcommand*{\DTMifbool}[4]{\ifbool{dtm@#1@#2}{#3}{#4}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMsetbool}
%\begin{definition}
%\cs{DTMsetbool}\marg{region}\marg{key}\marg{value}
%\end{definition}
% Set boolean key that was defined using \cs{DTMdefboolkey}
%    \begin{macrocode}
\newcommand*{\DTMsetbool}[3]{\setbool{dtm@#1@#2}{#3}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMlangsetup}
% Set up options for language modules. The optional argument is a
% list of language/regions. If omitted all loaded regions are
% iterated over. (I'm not sure why \cs{setkeys} doesn't work
% if the same key is present in multiple families, so this iterates
% over the families instead.)
%    \begin{macrocode}
\newcommand*{\DTMlangsetup}[2][\@dtm@loadedregions]{%
 \@for\@dtm@region:=#1\do{%
   \setkeys*+[dtm]{\@dtm@region}{#2}%
   \ifdefempty\XKV@rm{}%
   {%
     \@dtm@warning{Region `\@dtm@region' has ignored
      \MessageBreak the following settings:\MessageBreak
      \XKV@rm
      ^^J}%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
% Now load all the required modules (if installed) using the
% \sty{tracklang} interface. (Language packages, such as \sty{babel}
% or \sty{polyglossia} must be loaded before this.)
%    \begin{macrocode}
\AnyTrackedLanguages
{%
  \ForEachTrackedDialect{\this@dialect}%
  {%
    \@dtm@requiremodule\this@dialect
  }%
}
{%
%    \end{macrocode}
% No tracked languages. The default is already set up, so nothing to
% do here.
%    \begin{macrocode}
}
%    \end{macrocode}
%
% Load \sty{datetime2-calc} if required.
%    \begin{macrocode}
\@dtm@usecalc
%    \end{macrocode}
%
% Use the \pkgopt{style} package option, if set.
%    \begin{macrocode}
\ifdefempty\@dtm@initialstyle{}{\DTMsetstyle{\@dtm@initialstyle}}
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</datetime2.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*datetime2-calc.sty>
%    \end{macrocode}
%\fi
%\section{datetime2-calc.sty code}
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{datetime2-calc}[2015/03/24 v1.0 (NLCT)]
%    \end{macrocode}
% Load other required packages
%    \begin{macrocode}
\RequirePackage{pgfkeys}
\RequirePackage{pgfcalendar}
%    \end{macrocode}
%
%\begin{macro}{\@dtm@julianday}
% Register for storing Julian day number.
%    \begin{macrocode}
\newcount\@dtm@julianday
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dtm@parsedate}
% Redefine \cs{@dtm@parsedate} so that it uses \sty{pgfcalendar} to
% compute the required information. This allows for offsets, the use
% of \texttt{last} and also determine the day of week.
%    \begin{macrocode}
\def\@dtm@parsedate#1-#2-#3\@dtm@endparsedate{%
  \pgfcalendardatetojulian{#1-#2-#3}{\@dtm@julianday}%
  \pgfcalendarjuliantodate{\@dtm@julianday}{\@dtm@year}{\@dtm@month}{\@dtm@day}%
  \pgfcalendarjuliantoweekday{\@dtm@julianday}{\count@}%
  \edef\@dtm@dow{\number\count@}%
}
%    \end{macrocode}
%\end{macro}
%
% Set the current day of week
%\begin{macro}{\@dtm@currentdow}
%    \begin{macrocode}
\pgfcalendardatetojulian
 {\@dtm@currentyear-\@dtm@currentmonth-\@dtm@currentday}%
 {\@dtm@julianday}%
\pgfcalendarjuliantoweekday{\@dtm@julianday}{\count@}%
\edef\@dtm@currentdow{\number\count@}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMsavejulianday}
% Save the date obtained from the Julian day number.
%    \begin{macrocode}
\newrobustcmd*{\DTMsavejulianday}[2]{%
  \pgfcalendarjuliantodate{#2}{\@dtm@year}{\@dtm@month}{\@dtm@day}%
  \pgfcalendarjuliantoweekday{#2}{\count@}%
  \csedef{@dtm@#1@dow}{\number\count@}%
  \cslet{@dtm@#1@year}{\@dtm@year}%
  \cslet{@dtm@#1@month}{\@dtm@month}%
  \cslet{@dtm@#1@day}{\@dtm@day}%
  \ifcsundef{@dtm@#1@hour}{\csdef{@dtm@#1@hour}{0}}{}%
  \ifcsundef{@dtm@#1@minute}{\csdef{@dtm@#1@minute}{0}}{}%
  \ifcsundef{@dtm@#1@second}{\csdef{@dtm@#1@second}{0}}{}%
  \ifcsundef{@dtm@#1@TZhour}{\csdef{@dtm@#1@TZhour}{0}}{}%
  \ifcsundef{@dtm@#1@TZminute}{\csdef{@dtm@#1@TZminute}{0}}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMsaveddatetojulianday}
% Converts a saved date to a Julian day number. The first argument
% is the name referencing the saved date, the second is a count
% register in which to store the result.
%    \begin{macrocode}
\newrobustcmd*{\DTMsaveddatetojulianday}[2]{%
  \ifcsundef{@dtm@#1@year}%
  {%
     \PackageError{datetime2-calc}{Unknown date `#1'}{}%
  }%
  {%
    \pgfcalendardatetojulian
     {\csname @dtm@#1@year\endcsname
     -\csname @dtm@#1@month\endcsname
     -\csname @dtm@#1@day\endcsname}
     {#2}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMsaveddateoffsettojulianday}
% Converts an offset from the saved date to a Julian day number.
% The first argument is the name referencing the saved date,
% the second is the offset increment and the third is a count register
% in which to store the result.
%    \begin{macrocode}
\newrobustcmd*{\DTMsaveddateoffsettojulianday}[3]{%
  \ifcsundef{@dtm@#1@year}%
  {%
     \PackageError{datetime2-calc}{Unknown date `#1'}{}%
  }%
  {%
    \pgfcalendardatetojulian
     {\csname @dtm@#1@year\endcsname
     -\csname @dtm@#1@month\endcsname
     -\csname @dtm@#1@day\endcsname
     +#2}
     {#3}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMifdate}
% Test a saved date using \cs{pgfcalendarifdate}
%    \begin{macrocode}
\newrobustcmd*{\DTMifdate}[4]{%
  \ifcsundef{@dtm@#1@year}%
  {%
     \PackageError{datetime2-calc}{Unknown date `#1'}{}%
  }%
  {%
    \pgfcalendarifdate
     {\csname @dtm@#1@year\endcsname
     -\csname @dtm@#1@month\endcsname
     -\csname @dtm@#1@day\endcsname}
     {#2}{#3}{#4}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMsaveddatediff}
% Computes the difference between two saved dates. The result is
% stored in the third argument, which should be a count register.
%    \begin{macrocode}
\newrobustcmd*{\DTMsaveddatediff}[3]{%
  \ifcsundef{@dtm@#1@year}%
  {%
     \PackageError{datetime2-calc}{Unknown date `#1'}{}%
  }%
  {%
     \ifcsundef{@dtm@#2@year}%
     {%
        \PackageError{datetime2-calc}{Unknown date `#1'}{}%
     }%
     {%
       \pgfcalendardatetojulian
        {\csname @dtm@#1@year\endcsname
        -\csname @dtm@#1@month\endcsname
        -\csname @dtm@#1@day\endcsname}
        {#3}%
       \pgfcalendardatetojulian
        {\csname @dtm@#2@year\endcsname
        -\csname @dtm@#2@month\endcsname
        -\csname @dtm@#2@day\endcsname}
        {\@dtm@julianday}%
       \advance#3 by -\@dtm@julianday\relax
    }
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMtozulu}
% Converts the datetime data referenced by the first argument into
% Zulu time and saves it to data referenced by the second argument.
%    \begin{macrocode}
\newrobustcmd*{\DTMtozulu}[2]{%
  \ifcsundef{@dtm@#1@year}%
  {%
     \PackageError{datetime2-calc}{Unknown date `#1'}{}%
  }%
  {%
    \DTMsaveaszulutime{#2}%
    {\DTMfetchyear{#1}}%
    {\DTMfetchmonth{#1}}%
    {\DTMfetchday{#1}}%
    {\DTMfetchhour{#1}}%
    {\DTMfetchminute{#1}}%
    {\DTMfetchsecond{#1}}%
    {\DTMfetchTZhour{#1}}%
    {\DTMfetchTZminute{#1}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMsaveaszulutime}
% Converts the given datetime into Zulu (+00:00) and saves
% the result.
%\begin{definition}
%\cs{DTMsavetozulutime}\marg{name}\marg{year}\marg{month}\marg{day}\marg{hour}\newline\marg{minute}\marg{second}\marg{tzh}\marg{tzm}
%\end{definition}
%    \begin{macrocode}
\newrobustcmd*{\DTMsaveaszulutime}[9]{%
  \edef\@dtm@year{\number#2}%
  \edef\@dtm@month{\number#3}%
  \edef\@dtm@day{\number#4}%
  \edef\@dtm@hour{\number#5}%
  \edef\@dtm@minute{\number#6}%
  \edef\@dtm@second{\number#7}%
  \edef\@dtm@TZhour{\number#8}%
  \edef\@dtm@TZminute{\number#9}%
  \pgfcalendardatetojulian{\@dtm@year-\@dtm@month-\@dtm@day}{\@dtm@julianday}%
%    \end{macrocode}
% First adjust the minute offset if non-zero
%    \begin{macrocode}
  \ifnum\@dtm@TZminute=0\relax
  \else
    \count@=\@dtm@minute\relax
%    \end{macrocode}
% Add or subtract the offset minute
%    \begin{macrocode}
    \ifnum\@dtm@TZhour<0\relax
      \advance\count@ by -\@dtm@TZminute\relax
    \else
      \advance\count@ by \@dtm@TZminute\relax
    \fi
    \edef\@dtm@minute{\number\count@}%
%    \end{macrocode}
% Does the hour need adjusting?
%    \begin{macrocode}
    \ifnum\count@<0\relax
      \advance\count@ by 60\relax
      \edef\@dtm@minute{\number\count@}%
%    \end{macrocode}
% Need to subtract 1 from the hour
% but does the day need adjusting?
%    \begin{macrocode}
      \ifnum\@dtm@hour=0\relax
       \def\@dtm@hour{23}%
%    \end{macrocode}
% Day needs adjusting.
%    \begin{macrocode}
       \advance\@dtm@julianday by -1\relax
      \else
%    \end{macrocode}
% Subtract 1 from the hour
%    \begin{macrocode}
        \count@ = \@dtm@hour\relax
        \advance\count@ by -1\relax
        \edef\@dtm@hour{\number\count@}%
      \fi
    \else
%    \end{macrocode}
% Minute isn't negative. Is it $\ge 60$?
%    \begin{macrocode}
      \ifnum\count@>59\relax
        \advance\count@ by -60\relax
        \edef\@dtm@minute{\number\count@}%
%    \end{macrocode}
% Add 1 to the hour
%    \begin{macrocode}
        \count@ = \@dtm@hour\relax
        \advance\count@ by 1\relax
        \edef\@dtm@hour{\number\count@}%
%    \end{macrocode}
% Does the day need adjusting?
%    \begin{macrocode}
        \ifnum\thehour=24\relax
          \def\thehour{00}%
          \advance\@dtm@julianday by 1\relax
        \fi
      \fi
    \fi
  \fi
%    \end{macrocode}
% Now adjust the hour offset if non-zero
%    \begin{macrocode}
  \ifnum\@dtm@TZhour=0\relax
  \else
    \count@=\@dtm@hour\relax
    \advance\count@ by \@dtm@TZhour\relax
%    \end{macrocode}
% Does the day need adjusting?
%    \begin{macrocode}
    \ifnum\count@<0\relax
      \advance\count@ by 24\relax
      \edef\@dtm@hour{\number\count@}%
      \advance\@dtm@julianday by -1\relax
    \else
      \ifnum\count@>23\relax
      \advance\count@ by -24\relax
      \edef\@dtm@hour{\number\count@}%
      \advance\@dtm@julianday by 1\relax
      \else
        \edef\@dtm@hour{\number\count@}%
      \fi
    \fi
  \fi
  \pgfcalendarjuliantodate{\@dtm@julianday}{\@dtm@year}{\@dtm@month}{\@dtm@day}%
  \pgfcalendarjuliantoweekday{\@dtm@julianday}{\count@}%
%    \end{macrocode}
% Save the results.
%    \begin{macrocode}
  \csedef{@dtm@#1@dow}{\number\count@}%
  \cslet{@dtm@#1@year}{\@dtm@year}%
  \cslet{@dtm@#1@month}{\@dtm@month}%
  \cslet{@dtm@#1@day}{\@dtm@day}%
  \cslet{@dtm@#1@hour}{\@dtm@hour}%
  \cslet{@dtm@#1@minute}{\@dtm@minute}%
  \cslet{@dtm@#1@second}{\@dtm@second}%
  \csdef{@dtm@#1@TZhour}{0}%
  \csdef{@dtm@#1@TZminute}{0}%
}
%    \end{macrocode}
%\end{macro}
%\iffalse
%    \begin{macrocode}
%</datetime2-calc.sty>
%    \end{macrocode}
%\fi
%\Finale
\endinput
