†Sibylのお部屋†

ファイルの日時情報

作成開始日 2022.03.30
最終更新日 2022.04.05

ファイルの日時情報を取得する関数には「FileGetDate」があるが、これはファイルのハンドルが必要だったりして、あまり便利ではなさそうだ。むしろ、ファイル検索(TSearchRec型)の日付情報(SearchRec.time)を利用する方が良いだろう。ここでは、例として「d:\mywork\myfile.txt」と言うファイルの日時情報を取得してみる。なお、FindNextでループを回せば、ファイル名と日時の一覧を作成することも可能。TSearchRec型でどんな情報を取得できるかも、そちらを参照。
Var
  rec: TSearchRec;		//ファイル情報を格納する構造体
  dt : TDateTime;		//Sibyl標準の日時情報形式
  st : String;

Begin
  FindFirst('d:\mywork\myfile.txt', 0, rec);	//当該ファイルの各種情報を取得
  dt:=FileDateToDateTime(rec.time);		//日時情報を内部形式→標準形式変換
  st:=FormatDateTime('yy-mm-dd hh:nn:ss',dt);	//標準形式を文字列に変換
ここで留意すべきは、日時情報には;

@内部形式(LongInt型)
A内部形式をアンパックした形式(DateTime型)
BSibyl標準形式(TDateTime型)

の3種類があること。

このうち、@内部形式は、日時情報を1つのLongInt値で表現した物で、人間がそのまま見ても、いつを指しているかは判らないと思われる。多分、「特定の日時を起点とした通し秒」とか「ユリウス通日+その日の通し秒」みたいな形式ではないかと思う。したがって、日時の新旧判断にはそのまま使えるのではないかと…(未確認)

次に、Aのアンパック形式は、@の内部形式を構造体に展開した物で、DateTime型として定義されている(TDateTime型とは別物)。内部形式をアンパック形式に変換するには、以下のようにUnpackTimeプロシージャを使用する。

UnpackTime(rec.time, dt);	//recはTSearchRec型、dtはDateTime型

y:=dt.year			//年(整数型)
m:=dt.month			//月(整数型)
d:=dt.day			//日(整数型)

また、BはSibylの標準形式で、TDateTime型として定義されている。用途にもよるだろうが、通常はこの形式に変換するのが最も扱い易いように思う。以下のように「FileDateToDateTime」関数を用いて、内部形式(rec.time)を標準形式(TDateTime)に変換し、「FormatDateTime」関数で扱いやすいフォーマットの文字列に変換する。

dt:=FileDateToDateTime(rec.time);		//dtはTDateTimenai型
st:=FormatDateTime('yy-mm-dd hh:nn:ss',dt);	//stは文字列型
これで、たとえば「2022年4月2日23時43分46秒」が「22-04-02 23:43:46」のフォーマットで表示される。年の4桁表示、月名表示、曜日表示、am/pm表示なども可能。詳しくはヘルプの「FormatDateTime」を参照。

日付のフォーマットは各国様々で、日本と欧米で異なるのは勿論、欧州と米国でも異なる。日本の「年・月・日」フォーマットが最も合理的ではあるが、「月名・日・年」や「日・月・年」が慣例の国で開発された処理系に、日本式を求めても無理だろう。その点、「FormatDateTime」で汎用的な書式変換ができるのは大変に重宝する。

なお、この他にもSibylにはTDateTime型を文字列型に変換する「DateTimeToStr」関数も用意されているのだが、これが上手く機能しない。

st:=DateTimeToStr(dt);	//dtはTDateTime型
この関数の実行結果は、例えばこんなカンジ;
21-01-Tuesday 10:07:39

頭の2つは「年-月」で間違いないが(正常な日時情報と比較して確認した)、次に「曜日」が出て来るのは不可解。てか、「日」情報はどこ行った? ひょっとすると、「LongDataFormat/ShortDateFormat」というパラメータを弄れば、正常なフォーマットになるのかも知れないが、デフォルトでこれって、何よ?


【Sibylのお部屋目次】 【ホーム】