mcalでは日付時刻について2つの型を用意している。 一つは日付型で他方は時刻型である。 時刻型は時刻だけでなく日付とセットで表現する。 内部的にはグレゴリオ暦に基づいたboost C++ライブラリのdate_timeライブラリを利用しており、 日付型にはboost::gregorian::dateクラスを、 時刻型にはboost::posix_time::ptimeクラスを使っている。 詳細はboost.orgのドキュメントを参照されたい。
dateクラスは32ビット整数で管理されており、1400年1月1日から9999年12月31日の範囲をサポートしている。 日付の演算は全てグレゴリオ暦に基づいたものとなっている。 不正な日付(例えば、2013/2/29や1399/12/31)が与えられたときはNULL値が出力される。
一方でptimeクラスは、64ビットで管理されており、ミリ秒まで扱える時刻システムであるが、 mcalコマンドにおいてはミリ秒を扱うインターフェースは備えていない。 またptimeクラスはdateクラスも内部で参照しており、日付をまたいだ時間計算を可能としている。 不正な時刻(例えば、18:62:11)が与えられたときはNULL値が出力される。
MCMDはCSVテキストを扱うので、日付/時刻は、データ上は文字列で表現される必要がある。 それらの文字列を日付型および時刻型に内部で変換して各種演算を行い、最終結果を再度文字列に戻して出力している。 文字列のフォーマットは、日付型は8桁固定長文字列(例えば、"20130911")、 時刻型は14桁固定長文字列(例えば、"20130911110528")、もしくは6桁固定長文字列(例えば、"110528")を標準としている。
日付型と時刻型と各種関数の関係をFigure 4.1に示す。
またユーザは日付/時刻として固定長文字列を標準とせずに、 ユリウス通日(紀元前4713年1月1日正午からの日数)やUNIX時刻(1970年1月1日00時00分00秒(GMT)からの 経過秒数)などの整数を標準の日時の表記として利用してもよいであろう。 ユリウス通日やUNIX時刻と、日付型/時刻型との変換関数も備えており、十分に運用可能である。 ただし、mcalが提供する日付/時刻関数を使う限りにおいては、内部的にはグレゴリオ暦によって管理されており、 その範囲は、1400年1月1日から9999年12月31日に限定されることに注意する。 またUNIX時刻は32ビット整数で管理されているため、2038年1月19日3時14分7秒を超えると正しく計算できないことに注意する。 ただユリウス通日やUNIX時刻を利用する欠点は、その数字を見ただけでは実際にいつの日付時刻なのか理解出来ない点にあろう。