素人の質問です


杏樹  2009-11-05 18:51:53  No: 36076

DateTimeToStrの引数を見るとヘルプには
以下のように書かれています。

function DateTimeToStr(DateTime: TDateTime; const FormatSettings: TFormatSettings): string; overload;

ここで
const FormatSettings: TFormatSettings
というのがありますが、
ヘルプを見ても使い方(使い道)がまったく理解できません。

どのような時にどのような場合に使用するのか教えてください。


すれっどセーフ  2009-11-05 21:42:16  No: 36077

引数にTFormatSettingsがある書式は、スレッド内なら使う必要があるけど、
スレッドでなければあえて使うこともないんじゃないかな?

var
 FormatSettings: TFormatSettings;
 Value: String;
begin
 GetLocaleFormatSettings(LOCALE_USER_DEFAULT, FormatSettings);
 FormatSettings.DateSeparator := '-';
 FormatSettings.ShortDateFormat := 'YY/MM/DD hh:nn';
 Value := DateTimeToStr(Now, FormatSettings);


monaa  2009-11-06 03:19:09  No: 36078

自分で、指定した形式で日付を表示したいときにここで仕様を定義します。
TFormatSettingsはレコード型で最終的に内部ではStringで処理されてます。
でもって、確かに説明無しですね
http://docwiki.embarcadero.com/VCL/ja/SysUtils.TFormatSettings
省略も可能です、このフォーマットを使ってどんなことをしているかは
SysUtils.pasを読むしかありません。
実体はprocedure DateTimeToString(var Result: string; const Format: string;  DateTime: TDateTime);
です。
軽くググりましたが、日本語の解説は皆無ですね、
http://www.freepascal.org/docs-html/rtl/sysutils/tformatsettings.html
一応誰かが調べた解説です。


たぬ吉  2009-11-06 18:50:34  No: 36079

他の方の回答の補足ですが、TFormatSettingsの各メンバと同じ名前のグローバル変数が定義されています。
スレッドでない場合は、このグローバル変数を変更することで書式を変更することができます。下記はすれっどセーフ さんと提示されたものと同等です。

 DateSeparator := '-';
 ShortDateFormat := 'YY/MM/DD hh:nn';
 Value := DateTimeToStr(Now);

※ただし、グローバル変数なので一度変更すると以降そのアプリケーションの書式全て変更されます。必要に応じて元に戻すことも必要です。

当方、D7とD2009をもっていますが2009のヘルプではこの辺りの説明が見当たりません(探し方が悪い^^;)もっぱらD7のヘルプを活用しています。


杏樹  2009-11-17 17:47:32  No: 36080

遅くなってすみません。
スレッド内では必ず使わなければならないのですか?
実はスレッドの中でも使用していますが
使わないとどうなるのでしょうか?

ちなみに 英語OS上と日本語OS上の両方で
同じ日付を使用するとかわるのでしょうか?
たとえば以下の場合はどうなりますか?
FormatDateTime('yyyy/mm/dd hh:nn:ss', Now)
フォーマットを無視されてしまうのでしょうか?

今作成のプログラムは時間や日付を日本語の状態で処理したいのですが。

たとえば、

Str: String;
DTim: TDateTime;
Str := FormatDateTime('yyyy/mm/dd hh:nn:ss');
DTim := StrToDateTime(Str);

OSや言語などによって変わらないようにしたいのですが

Y := Copy(Str, 1, 4);
M := Copy(Str, 6, 2);
のような処理が必ず行えるようにしたいのです。

よろしくお願いします。


杏樹  2009-11-17 19:28:11  No: 36081

使い方としてはどれが正しいのでしょうか?
細かい部分は抜きにして、ざっぱでかいてみました。
イメージは伝わると思う(信じている)のですが

------------------------------------------------------------
TFormatSettings はグローバルにおいてはだめなのでしょうか?
------------------------------------------------------------
var
  FmtSet: TFormatSettings;

procedure TForm1.Create;
begin
  GetLocaleFormatSettings(GetUserDefaultLCID, FmtSet);
end;

procedure TForm1.Button1Click(Sender: TObject)
begin
  MyThread := TMyThread.Create;
end;

procedure TThread.Execute;
begin
  DateTimeToStr(Now, FFormatSettings);
end;

------------------------------------------------------------
やはり、ローカルで持たせないとだめなのかな?
------------------------------------------------------------
TMyThread = class(TThread)
private
  FFormatSettings: TFormatSettings;
public
  __property FormatSettings: TFormatSettings 
         read FFormatSettings write FFormatSettings
end;

procedure TForm1.Create;
begin
  MyThread := TThread.Create;
  GetLocaleFormatSettings(GetUserDefaultLCID, MyThread.FormatSettings);
end;

procedure TThread.Execute;
begin
  DateTimeToStr(Now, FFormatSettings);
end;

------------------------------------------------------------

私としては DateTimeToStr(Now);  がどのような状況においても
'yyyy/mm/dd hh:nn:ss'  になっていればいいのですが


HOta  2009-11-17 21:35:50  No: 36082

>私としてはDateTimeToStr(Now);がどのような状況においても
>'yyyy/mm/dd hh:nn:ss'  になっていればいいのですが
この場合なら、TFormatSettingsが必要です。

YearOf関数、MonthOf関数、DayOf関数はどうですか?


杏樹  2009-11-17 23:59:51  No: 36083

>YearOf関数、MonthOf関数、DayOf関数はどうですか?
これらの関数の引数にはTFormatSetting は使われていないみたいです。
何か不都合が生じるのでしょうか?


HOta  2009-11-18 01:33:26  No: 36084

表示はしませんので、TFormatSettingは不要です。
それぞれの数値を得るだけです。

Y := IntToStr(YearOf(Adate));
のようにすれば年の文字列が入ります。


たぬ吉  2009-11-18 01:57:53  No: 36085

HOtaさんはDateTimeToStrはロケールのことを考慮しなければならないので、
ロケールに左右されないYearOf関数等を使用したほうが良いのではといっているのではないでしょうか。
どうしても、DateTimeToStrを使用しないといけないのでしょうか?


杏樹  2009-11-18 03:18:48  No: 36086

何度もすみません
FormatDateTime('yyyy/mm/dd hh:nn:ss', now);

の代わりに以下のようにするということですか?

Format('%4.4d/%02.2d/%02.2d %02.2d:%02.2d:%02.2d', 
        [YearOf(Now), MonthOf(Now), DayOf(Now),
         HourOf(Now), MinutesOf(Now), SecondOf(Now)]);


HOta  2009-11-19 16:36:06  No: 36087

DateTimeToStrはロケールをセットするのなら、
FormatDateTime('yyyy/mm/dd hh:nn:ss', now)で得られますが、
セットしないのなら、YearOf(Now)等を使わないと不都合が生じます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加