%表題   MISC1 (その他の基本関数下位パッケージ)
%
%履歴
%\Drireki{
%         90/03/22 塩谷雅人
%         91/09/05 林祥介
%         91/12/17 塩谷雅人
%         92/01/23 塩谷雅人
%         92/03/14 塩谷雅人
%         92/04/13 塩谷雅人
%         92/04/22 林祥介   (4.1版)
%        }
%
%  \Dchapter{DATELIB : 日付}
\Dchapterhead
\label{datelib}

\section{概要}
日付を扱う関数・サブルーチンパッケージ.
このパッケージの説明では, 次の用語を用いる.
\begin{itemize}
  \item 1型の日付(IDATE) -- 上5桁以上が年, 3,4桁が月, 1,2桁が日の1整数で
    日付をあらわす. 例: 19920401.
  \item 2型の日付(IY,ITD) -- 年と通しの日数の2整数で日付をあらわす.
    例: 1992, 92.
  \item 3型の日付(IY,IM,ID) -- 年, 月, 日の3整数で日付を表す. 例: 1992, 4, 1.
  \item 曜日番号 -- 1:日曜, 2:月曜, 3:火曜, 4:水曜, 5:木曜,
                    6:金曜, 7:土曜 であるような整数値.
\end{itemize}

\section{サブルーチンのリスト}
\begin{tabular}{lp{10cm}}
  {\tt DATE12(IDATE,IY,ITD)}   & 1型の日付を2型の日付に変換する. \\
  {\tt DATE13(IDATE,IY,IM,ID)} & 1型の日付を3型の日付に変換する. \\
  {\tt DATE21(IDATE,IY,ITD)}   & 2型の日付を1型の日付に変換する. \\
  {\tt DATE23(IY,IM,ID,ITD)}   & 2型の日付を3型の日付に変換する. \\
  {\tt DATE31(IDATE,IY,IM,ID)} & 3型の日付を1型の日付に変換する. \\
  {\tt DATE32(IY,IM,ID,ITD)}   & 3型の日付を2型の日付に変換する. \\
  {\tt DATEF1(N,IDATE,NDATE)} &
    {\tt IDATE}の{\tt N}日後({\tt NDATE})を求める. \\
  {\tt DATEF2(N,IY,ITD,NY,NTD)} &
    {\tt IY,ITD}の{\tt N}日後({\tt NY,NTD})を求める. \\
  {\tt DATEF3(N,IY,IM,ID,NY,NM,ND)} &
    {\tt IY,IM,ID}の{\tt N}日後({\tt NY,NM,ND})を求める. \\
  {\tt DATEG1(N,IDATE,NDATE)} &
    {\tt IDATE}の何({\tt N})日後が{\tt NDATE}かを求める. \\
  {\tt DATEG2(N,IY,ITD,NY,NTD)} &
    {\tt IY,ITD}の何({\tt N})日後が{\tt NY,NTD}かを求める. \\
  {\tt DATEG3(N,IY,IM,ID,NY,NM,ND)} &
    {\tt IY,IM,ID}の何({\tt N})日後が{\tt NY,NM,ND}かを求める. \\
  {\tt DATEQ1(IDATE)} & 今日の1型の日付を求める. \\
  {\tt DATEQ2(IY,ITD)} & 今日の2型の日付を求める. \\
  {\tt DATEQ3(IY,IM,ID)} & 今日の3型の日付を求める. \\
  {\tt DATEC1(CFORM,IDATE)} &
    {\tt IDATE}を{\tt CFORM}に従って表現して{\tt CFORM}で返す. \\
  {\tt DATEC2(CFORM,IY,ITD)} &
    {\tt IY,ITD}を{\tt CFORM}に従って表現して{\tt CFORM}で返す. \\
  {\tt DATEC3(CFORM,IY,IM,ID)} &
    {\tt IY,IM,ID}を{\tt CFORM}に従って表現して{\tt CFORM}で返す.
\end{tabular}

\vspace{1em}
{\tt CFORM}中で使えるキーとなる文字は,
{\tt 'Y'} : 年, {\tt 'M'} : 月, {\tt 'D'} : 日, {\tt 'C'} : 文字型の月,
{\tt 'W'} : 曜日,
である. たとえば{\tt IDATE=19920401} (この日は水曜日)に対して
{\tt CFORM='CCC,DD,YY (WWW)'}
と指定して{\tt DATEC1}を呼ぶと{\tt CFORM='APR, 1,92 (WED)'}が返される.

\section{関数のリスト}
\begin{tabular}{lp{10cm}}
  {\tt NDATE1(IDATE,NDATE)} &
    {\tt DATEG1(NDATE1,IDATE,NDATE)}と同じ. \\
  {\tt NDATE2(IY,ITD,NY,NTD)} &
    {\tt DATEG2(NDATE2,IY,ITD,NY,NTD)}と同じ. \\
  {\tt NDATE3(IY,IM,ID,NY,NM,ND)} &
    {\tt DATEG3(NDATE3,IY,IM,ID,NY,NM,ND)}と同じ. \\
  {\tt IWEEK1(IDATE)} & 1型の日付{\tt IDATE}に対応する曜日番号を返す. \\
  {\tt IWEEK2(IY,ITD)} & 2型の日付{\tt IY,ITD}に対応する曜日番号を返す. \\
  {\tt IWEEK3(IY,IM,ID)} & 3型の日付{\tt IY,IM,ID}に対応する曜日番号を返す. \\
  {\tt NDMON(IY,IM)} & {\tt IY}年{\tt IM}月は何日あるかを返す. \\
  {\tt NDYEAR(IY)} & {\tt IY}年は何日あるかを返す. \\
  {\tt CMON(IM)} & 文字型の月名を返す文字型関数.
    文字の長さはユーザーが指定すること. \\
  {\tt CWEEK(IW)} & 文字型の曜日を返す文字型関数.
    文字の長さはユーザーが指定すること.
\end{tabular}

\section{サブルーチンの説明}
\label{datelib/sub/date12}
\subsection{DATE12/DATE13/DATE21/DATE23/DATE31/DATE32}
\begin{enumerate}
  \item 機能
  \begin{quote}
    日付の型を変換する. \\
    {\tt DATE12} : 1型の日付を2型の日付に変換する. \\
    {\tt DATE13} : 1型の日付を3型の日付に変換する. \\
    {\tt DATE21} : 2型の日付を1型の日付に変換する. \\
    {\tt DATE23} : 2型の日付を3型の日付に変換する. \\
    {\tt DATE31} : 3型の日付を1型の日付に変換する. \\
    {\tt DATE32} : 3型の日付を2型の日付に変換する.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CALL DATE12(IDATE,IY,ITD)}   \\
    {\tt CALL DATE13(IDATE,IY,IM,ID)} \\
    {\tt CALL DATE21(IDATE,IY,ITD)}   \\
    {\tt CALL DATE23(IY,IM,ID,ITD)}   \\
    {\tt CALL DATE31(IDATE,IY,IM,ID)} \\
    {\tt CALL DATE32(IY,IM,ID,ITD)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IDATE} & {\tt (I)} & 1型の日付.\\
      {\tt IY}    & {\tt (I)} & 年.\\
      {\tt IM}    & {\tt (I)} & 月.\\
      {\tt ID}    & {\tt (I)} & 日.\\
      {\tt ITD}   & {\tt (I)} & 通しの日付.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item なし.
  \end{enumerate}
\end{enumerate}

\subsection{DATEF1/DATEF2/DATEF3}
\label{datelib.sub.datef1}
\begin{enumerate}
  \item 機能
  \begin{quote}
    {\tt N}日後の日付を求める. \\
    {\tt DATEF1} : {\tt IDATE}の{\tt N}日後({\tt NDATE})を求める. \\
    {\tt DATEF2} : {\tt IY,ITD}の{\tt N}日後({\tt NY,NTD})を求める. \\
    {\tt DATEF3} : {\tt IY,IM,ID}の{\tt N}日後({\tt NY,NM,ND})を求める.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CALL DATEF1(N,IDATE,NDATE)} \\
    {\tt CALL DATEF2(N,IY,ITD,NY,NTD)} \\
    {\tt CALL DATEF3(N,IY,IM,ID,NY,NM,ND)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IDATE, NDATE} & {\tt (I)} & 1型の日付.\\
      {\tt IY,    NY}    & {\tt (I)} & 年.\\
      {\tt IM,    NM}    & {\tt (I)} & 月.\\
      {\tt ID,    ND}    & {\tt (I)} & 日.\\
      {\tt ITD,   NTD}   & {\tt (I)} & 通しの日付.\\
      {\tt N}            & {\tt (I)} & 日付の差(日数).
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item {\tt N}としては負の値を指定してもよい.
          つまり負の{\tt N}に対して$-{\tt N}$日前の日付も
          調べることができる.
  \end{enumerate}
\end{enumerate}

\subsection{DATEG1/DATEG2/DATEG3}
\label{datelib.sub.dateg1}
\begin{enumerate}
  \item 機能
  \begin{quote}
    日付の差を求める. \\
    {\tt DATEG1} : {\tt IDATE}の何({\tt N})日後が{\tt NDATE}かを求める. \\
    {\tt DATEG2} : {\tt IY,ITD}の何({\tt N})日後が{\tt NY,NTD}かを求める. \\
    {\tt DATEG3} : {\tt IY,IM,ID}の何({\tt N})日後が{\tt NY,NM,ND}かを求める.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CALL DATEG1(N,IDATE,NDATE)} \\
    {\tt CALL DATEG2(N,IY,ITD,NY,NTD)} \\
    {\tt CALL DATEG3(N,IY,IM,ID,NY,NM,ND)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IDATE, NDATE} & {\tt (I)} & 1型の日付.\\
      {\tt IY,    NY}    & {\tt (I)} & 年.\\
      {\tt IM,    NM}    & {\tt (I)} & 月.\\
      {\tt ID,    ND}    & {\tt (I)} & 日.\\
      {\tt ITD,   NTD}   & {\tt (I)} & 通しの日付.\\
      {\tt N}            & {\tt (I)} & 日付の差(日数).
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item 過去にさかのぼって日付の差を求めることもできる.
          つまり日付の差として{\tt N}は負にもなりうる.
  \end{enumerate}
\end{enumerate}

\subsection{DATEQ1/DATEQ2/DATEQ3}
\label{datelib.sub.dateq1}
\begin{enumerate}
  \item 機能
  \begin{quote}
    今日の日付を求める. \\
    {\tt DATEQ1} : 今日の1型の日付を求める. \\
    {\tt DATEQ2} : 今日の2型の日付を求める. \\
    {\tt DATEQ3} : 今日の3型の日付を求める.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt DATEQ1(IDATE)} \\
    {\tt DATEQ2(IY,ITD)} \\
    {\tt DATEQ3(IY,IM,ID)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IDATE} & {\tt (I)} & 1型の日付.\\
      {\tt IY}    & {\tt (I)} & 年.\\
      {\tt IM}    & {\tt (I)} & 月.\\
      {\tt ID}    & {\tt (I)} & 日.\\
      {\tt ITD}   & {\tt (I)} & 通しの日付.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item これらはシステムに依存したサブルーチンなので,
      正しく移植されていない可能性もある.
  \end{enumerate}
\end{enumerate}

\subsection{DATEC1/DATEC2/DATEC3}
\label{datec1.sub.datec1}
\begin{enumerate}
  \item 機能
  \begin{quote}
    フォーマットを指定して日付を文字列で表現する. \\
    {\tt DATEC1} : 1型の日付を文字列で表現する. \\
    {\tt DATEC2} : 2型の日付を文字列で表現する. \\
    {\tt DATEC3} : 3型の日付を文字列で表現する.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CALL DATEC1(CFORM,IDATE)}  \\
    {\tt CALL DATEC2(CFORM,IY,ITD)} \\
    {\tt CALL DATEC3(CFORM,IY,IM,ID)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IDATE} & {\tt (I)} & 1型の日付.\\
      {\tt IY}    & {\tt (I)} & 年.\\
      {\tt IM}    & {\tt (I)} & 月.\\
      {\tt ID}    & {\tt (I)} & 日.\\
      {\tt ITD}   & {\tt (I)} & 通しの日付.\\
      {\tt CFORM} & {\tt (C*(*))} & 日付のフォーマット.
        入力パラメータでもあり, 出力パラメーターでもある.
        {\tt CFORM}中で使えるキーとなる文字は,
        {\tt 'Y'} : 年, {\tt 'M'} : 月, {\tt 'D'} : 日,
        {\tt 'C'} : 文字型の月, {\tt 'W'} : 曜日, である.
        たとえば{\tt IDATE=19920401} (この日は水曜日)に対して
        {\tt CFORM='CCC,DD,YY (WWW)'}
        と指定して{\tt DATEC1}を呼ぶと
        \verb*|CFORM='APR, 1,92 (WED)'|が返される.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item 日付のフォーマットの指定方法について, 正確には,
          キーとなる文字が最初に現れたところから最後に現れたところの
          間の部分をおきかえる. したがって例えば, {\tt 'CCCCC/YYYY'}と
          書くのと{\tt 'CAAAC/YBBY}と書くのは同じである.
    \item 文字型の月名は右寄せして出力される.
  \end{enumerate}
\end{enumerate}

\section{関数の説明}

\subsection{NDATE1/NDATE2/NDATE3}
\label{datelib.sub.ndate1}
\begin{enumerate}
  \item 機能
  \begin{quote}
    日付の差を求める. \\
    {\tt NDATE1} : {\tt IDATE}の何日後が{\tt NDATE}かを求める. \\
    {\tt NDATE2} : {\tt IY,ITD}の何日後が{\tt NY,NTD}かを求める. \\
    {\tt NDATE3} : {\tt IY,IM,ID}の何日後が{\tt NY,NM,ND}かを求める.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt NDATE1(IDATE,NDATE)} \\
    {\tt NDATE2(IY,ITD,NY,NTD)} \\
    {\tt NDATE3(IY,IM,ID,NY,NM,ND)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IDATE, NDATE} & {\tt (I)} & 1型の日付.\\
      {\tt IY,    NY}    & {\tt (I)} & 年.\\
      {\tt IM,    NM}    & {\tt (I)} & 月.\\
      {\tt ID,    ND}    & {\tt (I)} & 日.\\
      {\tt ITD,   NTD}   & {\tt (I)} & 通しの日付.\\
      {\tt NDATE1} & {\tt (I)} & 1型の日付の差を与える関数値. \\
      {\tt NDATE2} & {\tt (I)} & 2型の日付の差を与える関数値. \\
      {\tt NDATE3} & {\tt (I)} & 3型の日付の差を与える関数値.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item なし
  \end{enumerate}
\end{enumerate}

\subsection{IWEEK1/IWEEK2/IWEEK3}
\label{datelib.sub.iweek1}
\begin{enumerate}
  \item 機能
  \begin{quote}
    曜日番号を求める. \\
    {\tt IWEEK1} : 1型の日付に対応する曜日番号を求める. \\
    {\tt IWEEK2} : 2型の日付に対応する曜日番号を求める. \\
    {\tt IWEEK3} : 3型の日付に対応する曜日番号を求める.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt IWEEK1(IDATE)} \\
    {\tt IWEEK2(IY,ITD)} \\
    {\tt IWEEK3(IY,IM,ID)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IDATE} & {\tt (I)} & 1型の日付.\\
      {\tt IY}    & {\tt (I)} & 年.\\
      {\tt IM}    & {\tt (I)} & 月.\\
      {\tt ID}    & {\tt (I)} & 日.\\
      {\tt ITD}   & {\tt (I)} & 通しの日付.\\
      {\tt IWEEK1} & {\tt (I)} & 1型の日付に対応する曜日番号を与える関数値. \\
      {\tt IWEEK2} & {\tt (I)} & 2型の日付に対応する曜日番号を与える関数値. \\
      {\tt IWEEK3} & {\tt (I)} & 3型の日付に対応する曜日番号を与える関数値.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item なし
  \end{enumerate}
\end{enumerate}

\subsection{NDMON/NDYEAR}
\begin{enumerate}
  \item 機能
  \begin{quote}
    {\tt NDMON}  : {\tt IY}年{\tt IM}月は何日あるかを返す. \\
    {\tt NDYEAR} : {\tt IY}年は何日あるかを返す.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt NDMON(IY,IM)} \\
    {\tt NDYEAR(IY)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IY}    & {\tt (I)} & 年.\\
      {\tt IM}    & {\tt (I)} & 月.\\
      {\tt NDMON} & {\tt (I)} & 指定した月の日数を与える関数値. \\
      {\tt NDYEAR} & {\tt (I)} & 指定した年の日数を与える関数値.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item なし.
  \end{enumerate}
\end{enumerate}

\subsection{CMON}
\begin{enumerate}
  \item 機能
  \begin{quote}
    文字型の月名を返す文字型関数.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CMON(IM)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IM}   & {\tt (I)} & 月. \\
      {\tt CMON} &  {\tt (C*(*))} & 文字型の月名を返す文字型関数値.
         文字の長さはユーザーが指定すること.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item 文字型の月名とは, {\tt JANUARY}, {\tt FEBRUARY}\ldots
          のことである. 先頭から{\tt LEN(CMON)}の長さの分だけ返される.
  \end{enumerate}
\end{enumerate}

\subsection{CWEEK}
\begin{enumerate}
  \item 機能
  \begin{quote}
    文字型の曜日を返す文字型関数.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CWEEK(IW)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IW}   & {\tt (I)} & 曜日番号. \\
      {\tt CWEEK} &  {\tt (C*(*))} & 文字型の曜日を返す文字型関数値.
         文字の長さはユーザーが指定すること.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item 文字型の曜日とは, {\tt SUNDAY}, {\tt MONDAY}\ldots
          のことである. 先頭から{\tt LEN(CWEEK)}の長さの分だけ返される.
  \end{enumerate}
\end{enumerate}

