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. 일반 숫자 대신 dateRange2를 입력하도록 다시 작성합니다 .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및 명령이 \DTMsavejulianday사용되는 코드 샘플에서 알 수 있듯이 datetime2패키지는 〈이름〉으로 식별되는 특수 저장소에 날짜를 저장할 수 있습니다. 인용 섹션날짜와 시간 저장 및 사용매뉴얼 중 datetime2:

아래 명령에서 〈이름〉(활성 문자 없음)은 정보를 고유하게 식별하는 이름입니다.

를 실행한 후와 같이 해당 저장소에 날짜가 있는 경우 , 및 \DTMsavejulianday{〈name〉}{〈number〉}명령을 사용하여 해당 연도, 월, 일을 추출할 수 있습니다 \DTMfetchyear. 이러한 각 명령은 〈name〉 인수를 사용하여 해당 숫자로 확장됩니다. 즉, 연도, 월, 일로 확장됩니다. 나머지는 본질적으로 배관 작업입니다. :-)\DTMfetchmonth\DTMfetchday\DTMfetchyear{〈name〉}\DTMfetchmonth{〈name〉}\DTMfetchday{〈name〉}

다양한 부품 연결하기

\dateRange나는 다음과 같은 점을 제외하고는 당신과 비슷하게 동작하는 명령을 제안합니다 :

  • 결과 범위를 표시하기 전에 종료 날짜에 추가하려는 일 수를 지정하는 선택적 인수(기본값은 0)를 허용합니다.

  • 일 서수와 월 이름 사이에 중단 없는 공백을 사용합니다( 정권 ~에서는 일반적인 공백이지만 \ExplSyntaxOn귀하는 중단 없는 공백을 원했다고 생각합니다).

  • 정수 비교를 사용하므로 모든 일, 월 및 연도 인수에 대해 01와 같은 것으로 간주됩니다 (원하지 않으면 이 답변의 첫 번째 개정판에서 as를 사용 1하지만 저는 그렇지 않습니다). 그렇게 할 타당한 이유가 없습니다).022\str_if_eq:nnTF

코드를 더 쉽게 읽고 위의 세 번째 사항을 해결하기 위해 함수를 다시 들여쓰기하고 \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}

스크린샷

관련 정보