Извлечение года, месяца и дня из указанной datetime2даты

Извлечение года, месяца и дня из указанной datetime2даты

Я создал команду, которая выглядит так:

\newcommand*{\numdash}{\,--\,}

\ExplSyntaxOn
\NewDocumentCommand{\dateRange}{mmmmmm}
    {
        \str_case:nnF { #1 }
        {
        {#4}  { 
            \str_case:nnF { #2 }
            {
            {#5}  { 
                \str_case:nnF { #3 }
                {
                {#6}  { \DTMdisplaydate{#4}{#5}{#6}{-1} }%
                }{\DTMordinal{#3}{}{}\numdash{}\DTMdisplaydate{#4}{#5}{#6}{-1}}
            }
            }{\DTMordinal{#3}~\DTMmonthname{#2}%
            {}\numdash{}\DTMdisplaydate{#4}{#5}{#6}{-1}}
        }
        }{\DTMdisplaydate{#1}{#2}{#3}{-1}{}\numdash{}\DTMdisplaydate{#4}{#5}{#6}{-1}}
    }
\ExplSyntaxOff

Он отображает длительность от одной даты до другой в сжатом виде. Смотрите изображение ниже.

введите описание изображения здесь

Однако мне нужно манипулировать конечной датой, увеличивая ее на несколько дней. Что-то вроде этого \dateRange{2016}{12}{31}{2016}{12}{31 + 1}не работает. Я нашел следующий код

%https://tex.stackexchange.com/questions/318006/add-n-days-to-variable-date
\DTMsavedate{DeadLineDate}{2016-05-20}
\newcommand{\DeadLineDateExtend}{1}

\newcount\daycount
\newcommand{\dueDate}[1]{%
    \DTMsaveddateoffsettojulianday{DeadLineDate}{#1}\daycount
    \DTMsavejulianday{newDeadLineDate}{\number\daycount}
    \DTMusedate{newDeadLineDate}
 }

Что может добавить дни к DTMdate. Моя проблема заключается в том, чтобы заставить эти две функции работать вместе.

  1. Перепишите так, чтобы вместо обычных цифр dateRangeвводилось два .DTMdates
  2. Извлекитегод,месяцидатаиз newDeadLineDateи вставьте его обратно вdateRange

Итак, мне нужна помощь с тем, чтобы сначала получить две даты, увеличить одну из них и отобразить диапазон дат с помощью \dateRangeфункции. Любая помощь с 1. или 2. из списка выше будет высоко оценена.

\documentclass{article}

\usepackage[english]{babel}
\usepackage[en-GB,calc]{datetime2}

\usepackage{xparse}

% https://tex.stackexchange.com/questions/390693/datetime-ranges-using-datetime2/390738
\newcommand*{\numdash}{\,--\,}

\ExplSyntaxOn
\NewDocumentCommand{\dateRange}{mmmmmm}
    {
        \str_case:nnF { #1 }
        {
        {#4}  { 
            \str_case:nnF { #2 }
            {
            {#5}  { 
                \str_case:nnF { #3 }
                {
                {#6}  { \DTMdisplaydate{#4}{#5}{#6}{-1} }%
                }{\DTMordinal{#3}{}{}\numdash{}\DTMdisplaydate{#4}{#5}{#6}{-1}}
            }
            }{\DTMordinal{#3}~\DTMmonthname{#2}%
            {}\numdash{}\DTMdisplaydate{#4}{#5}{#6}{-1}}
        }
        }{\DTMdisplaydate{#1}{#2}{#3}{-1}{}\numdash{}\DTMdisplaydate{#4}{#5}{#6}{-1}}
    }
\ExplSyntaxOff

%https://tex.stackexchange.com/questions/318006/add-n-days-to-variable-date
\DTMsavedate{DeadLineDate}{2016-05-20}
\newcommand{\DeadLineDateExtend}{1}

\newcount\daycount
\newcommand{\dueDate}[1]{%
    \DTMsaveddateoffsettojulianday{DeadLineDate}{#1}\daycount
    \DTMsavejulianday{newDeadLineDate}{\number\daycount}
    \DTMusedate{newDeadLineDate}
 }

\begin{document}

\dateRange{2016}{12}{31}{2016}{12}{31}

\dateRange{2016}{12}{30}{2016}{12}{31}

\dateRange{2016}{11}{31}{2016}{12}{31}

\dateRange{2015}{12}{31}{2016}{12}{31}

\end{document}

решение1

Извлечение года, месяца и дня из указанной datetime2даты

Как вы, вероятно, заметили в вашем примере кода, где используются команды \DTMsavedateи , пакет может сохранять даты в специальных хранилищах, идентифицируемых по 〈имени〉. Раздел цитирования\DTMsavejuliandaydatetime2Хранение и использование дат и временируководства datetime2:

В приведенных ниже командах 〈имя〉 (без активных символов) — это имя, которое однозначно идентифицирует информацию.

Когда у вас есть дата в таком хранилище, как в случае после выполнения \DTMsavejulianday{〈name〉}{〈number〉}, вы можете извлечь соответствующий год, месяц и день с помощью команд \DTMfetchyear, \DTMfetchmonthи \DTMfetchday. Каждая из этих команд принимает аргумент 〈name〉 и расширяется до соответствующего числа. Другими словами, \DTMfetchyear{〈name〉}расширяется до года, \DTMfetchmonth{〈name〉}до месяца и \DTMfetchday{〈name〉}до дня. Остальное по сути сантехническая работа. :-)

Соединение различных частей

Я предлагаю \dateRangeкоманду, которая действует так же, как ваша, за исключением того, что:

  • он принимает необязательный аргумент (по умолчанию 0), который указывает количество дней, которое вы хотите добавить к конечной дате перед отображением результирующего диапазона;

  • между порядковым номером дня и названием месяца используется неразрывный пробел ( ~это обычный пробел в строке \ExplSyntaxOn«режим», но я полагаю, что вы хотели неразрывный пробел);

  • он использует целочисленные сравнения, поэтому that 01считается тем же самым 1, что и , 02тем же самым 2, что и и т. д. для всех аргументов дня, месяца и года (если вы этого не хотите, используйте \str_if_eq:nnTFas в первой редакции этого ответа, но я не вижу никаких веских причин делать это).

Я изменил отступ функции и использовал \int_compare:nNnTFвместо , \str_case:nnFчтобы сделать код более читабельным и решить третий пункт выше.

Я также определил функцию на уровне кода, \nebuch_display_date_range:nnnnnnсодержащую этот переработанный код, потому что так его гораздо проще использовать повторно в разных ситуациях. Это позволяет нам сгенерировать вариант, \nebuch_display_date_range:nnnxxxкоторый полностью расширяет три последних аргумента перед передачей их базовой функции \nebuch_display_date_range:nnnnnn(полное расширение, как это делает \edef). Для этого требуется всего лишь простая строка кода:

\cs_generate_variant:Nn \nebuch_display_date_range:nnnnnn { nnnxxx }

Используя вариант, можно легко передать результат вычисления временной даты (который добавляет смещение) в базовую функцию \nebuch_display_date_range:nnnnnn, поскольку \DTMfetchday, \DTMfetchmonthи \DTMfetchyearявляются расширяемыми функциями (см. документацию datetime2).

Вычисление даты смещения также реализовано в функции уровня кода, а именно \nebuch_compute_offset_date:nnnnn, чтобы сделать ее легко повторно используемой другим кодом (и она используется в моей реализации \dateRange).

\documentclass{article}
\usepackage[english]{babel}
\usepackage[en-GB,calc]{datetime2}
\usepackage{xparse}

\newcommand*{\numdash}{\,--\,}

\ExplSyntaxOn

% Similar to your \dateRange, but we use integer comparisons here and the
% code-level API allows the creation of variants with \cs_generate_variant:Nn.
\cs_new_protected:Npn \nebuch_display_date_range:nnnnnn #1#2#3#4#5#6
  {
    \int_compare:nNnTF {#1} = {#4}
      {
        \int_compare:nNnTF {#2} = {#5}
          {
            \int_compare:nNnTF {#3} = {#6}
              { \DTMdisplaydate {#4} {#5} {#6} {-1} }
              {
                \DTMordinal {#3} {} {} \numdash
                \DTMdisplaydate {#4} {#5} {#6} {-1}
              }
          }
          {
            % I replaced ~ with \nobreakspace here because of \ExplSyntaxOn
            \DTMordinal {#3} \nobreakspace \DTMmonthname {#2} \numdash
            \DTMdisplaydate {#4} {#5} {#6} {-1}
          }
      }
      {
        \DTMdisplaydate {#1} {#2} {#3} {-1} \numdash
        \DTMdisplaydate {#4} {#5} {#6} {-1}
      }
  }

\cs_generate_variant:Nn \nebuch_display_date_range:nnnnnn { nnnxxx }

\newcount \nebuch_tmp_count

% #1, #2, #3: year, month, day
% #4: number of days (offset)
% #5: <name> (in the sense of datetime2) used to store the resulting date
\cs_new_protected:Npn \nebuch_compute_offset_date:nnnnn #1#2#3#4#5
  {
    \DTMsavedate { nebuch_compute_offset_date_tmp_date } { #1-#2-#3 }
    \DTMsaveddateoffsettojulianday
      { nebuch_compute_offset_date_tmp_date } {#4} { \nebuch_tmp_count }
    \DTMsavejulianday {#5} { \number \nebuch_tmp_count }
  }

\NewDocumentCommand { \dateRange } { O{0} m m m m m m }
  {
    \nebuch_compute_offset_date:nnnnn {#5} {#6} {#7} {#1}
                                      { nebuch_dateRange_tmp_date }
    \nebuch_display_date_range:nnnxxx {#2} {#3} {#4}
      { \DTMfetchyear { nebuch_dateRange_tmp_date } }
      { \DTMfetchmonth { nebuch_dateRange_tmp_date } }
      { \DTMfetchday { nebuch_dateRange_tmp_date } }
  }

\ExplSyntaxOff

\begin{document}

\dateRange{2016}{12}{31}{2016}{12}{31}\par
\dateRange{2016}{12}{30}{2016}{12}{31}\par
\dateRange{2016}{11}{31}{2016}{12}{31}\par
\dateRange{2015}{12}{31}{2016}{12}{31}

\bigskip
\dateRange[3]{2016}{12}{31}{2016}{12}{31}\par
\dateRange[3]{2016}{12}{31}{2016}{12}{28}\par
\dateRange[3]{2016}{12}{30}{2016}{12}{31}\par
\dateRange[3]{2016}{12}{30}{2016}{12}{28}\par
\dateRange[31]{2016}{11}{31}{2016}{12}{31}\par
\dateRange[31]{2016}{11}{31}{2016}{11}{30}\par
\dateRange[365]{2015}{12}{31}{2016}{12}{31}\par
\dateRange[365]{2015}{12}{31}{2016}{01}{01}

\bigskip
\dateRange{2016}{02}{7}{2016}{2}{07}

\end{document}

Скриншот

Связанный контент