DateTime型をDateTimetoStrでString型に変換し、
年、月、時、分、秒と各テキストボックスに分けて
表示したいのですが、日付や時間の表示形式が変わっても、
対応できるような方法を教えてください。お願いします。
FormatDateTime() をヘルプで調べてください。
procedure TForm1.Button1Click(Sender: TObject);
var
ima:TDateTime;
begin
ima := Now;
Edit1.Text := FormatDateTime('yyyy "年"',ima);
Edit2.Text := FormatDateTime('mmmm 月',ima);
Edit3.Text := FormatDateTime('dd "日"',ima);
Edit4.Text := FormatDateTime('hh "時"',ima);
Edit5.Text := FormatDateTime('nn "分"',ima);
Edit6.Text := FormatDateTime('ss "秒"',ima);
end;
すこし訂正
Edit2.Text := FormatDateTime('mm "月"',ima);
表示形式が変わっても・・・というのが表示を統一させるのか
OSの日付表示形式にあわせた内容にするのかどちらの意味にもとれるので
環境に左右されない固定方式を記述しておきます。
procedure TForm1.Button1Click(Sender: TObject);
var
d : TDateTime;
aYer,aMon,aDay,aHou,aMin,aSec,aMSec : word;
begin
d := Now;
DecodeDate(d,aYer,aMon,aDay);
DecodeTime(d,aHou,aMin,aSec,aMSec);
Edit1.Text := IntToStr(aYer);
Edit2.Text := IntToStr(aMon);
Edit3.Text := IntToStr(aDay);
Edit4.Text := IntToStr(aHou);
Edit5.Text := IntToStr(aMin);
Edit6.Text := IntToStr(aSec);
end;
文章足らずで申し訳ございません。
OSの日付表示形式にあわせた内容にしたいと考えています。
またその逆にテキストボックスに入力した値を元に
OSの表示形式に対応したDateTime型に変換したいとも考えています。
お願いします。
OSの設定では、年、月、日を別々に設定できなかったと思います。
# コントロールパネルでご確認ください
短い日付、長い日付のフォーマットでしたら、SysUtilsユニットに
ShortDateFormat: String;
LongDateFormat: String;
という変数が定義されています。
これを使えば、OSの設定通りに日付を表示することはできます。
日付は日本の場合、年月日ですが他の国の場合は並びが違うのでそれも
考慮して表示となると、にしのさんの指摘のようにShortDateFormatや
LongDateFormatを使用して生成された文字列を分解して表示するぐらいしか
ないかと思います。
数字以外の文字を区切りとして分解し表示するサンプルを作ってみました。
「/」や「:」「年」などの単位も工夫次第では出来るかもしれません。
文字列から日付型の変換は難しそうですね。
StrToDateTime 関数のヘルプに書いてますが把握できませんでした。
procedure TForm1.Button1Click(Sender: TObject);
begin
DataTest(FormatDateTime(ShortDateFormat+ ' hh:mm:ss',now));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
DataTest(FormatDateTime(LongDateFormat+ ' hh:mm:ss',now));
end;
procedure TForm1.DataTest(str: string);
var
tbl : array[0..5] of string;
i,j : Integer;
f : Boolean;
begin
j := 0;
f := False;
for i := 1 to Length(str) do begin
if (str[i] >= '0') and (str[i] <= '9') then begin
if f then begin
inc(j);
f := False;
end;
tbl[j] := tbl[j] + str[i];
end
else begin
f := True;
end;
end;
Edit1.Text := tbl[0];
Edit2.Text := tbl[1];
Edit3.Text := tbl[2];
Edit4.Text := tbl[3];
Edit5.Text := tbl[4];
Edit6.Text := tbl[5];
end;
日付型に変換する部分は、結局は内部で使用するわけですから、yyyy/mm/ddだけでかまわないと思います。
問題は、ユーザが指定している文字列を、どうやって入力欄として使うかです。
ユーザは、日しか出さないかもしれないし、日月年の順にだすかもしれませんから。
解析して、ラベルとエディットの順番を変えながら何とかするしかなさそうです。
# 私ならば、yyyy/mm/ddのみにしますが・・・
いろいろ試してみると、LongDateFormatをそのまま使えなさそうです。
# WinXPPro日本語版+Delphi7で試しました
例えば、OSの設定で
短い日付:yyyy/MM/dd
長い日付:ddddd
とします。
この場合、コントロールパネルでは、短い日付には「2004/03/10」と表示され、長い日付には「水曜日」と表示されます。
FormatDateTimeを使って、
str := FormatDateTime(LongDateFormat, Now);
とすると、strには「水曜日」でなく、「2004/03/10」と出ます。
# 'ddddd'では、ShortDateFormatを使用するので、Delphi的には正しい動作です
また、長い日付を、「dddddd」にすると、戻り値は''となります。
# 'dddddd'では、LongDateFormatを使用するので、永久ループに入らないぶん正常な動作と言えます
FormatDateTimeで変換する場合には、LongDateFormatをそのまま使用せずに、ある程度置換する必要がありそうです。
たくさんのご意見ありがとうございます。
なんとか解決することができました。
年、月、時、分、秒と各テキストボックスに分けて
表示する場合は、DecodeDatetime関数を使い、
テキストボックスに入力した値を元にDateTime型に
変換するときはEncodeDatetime関数を使いました。
ツイート | ![]() |