†Sibylのお部屋†
作成開始日 2022.03.30
最終更新日 2022.04.05
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」というパラメータを弄れば、正常なフォーマットになるのかも知れないが、デフォルトでこれって、何よ?