DateTimeToStrの引数を見るとヘルプには
以下のように書かれています。
function DateTimeToStr(DateTime: TDateTime; const FormatSettings: TFormatSettings): string; overload;
ここで
const FormatSettings: TFormatSettings
というのがありますが、
ヘルプを見ても使い方(使い道)がまったく理解できません。
どのような時にどのような場合に使用するのか教えてください。
引数に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);
自分で、指定した形式で日付を表示したいときにここで仕様を定義します。
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
一応誰かが調べた解説です。
他の方の回答の補足ですが、TFormatSettingsの各メンバと同じ名前のグローバル変数が定義されています。
スレッドでない場合は、このグローバル変数を変更することで書式を変更することができます。下記はすれっどセーフ さんと提示されたものと同等です。
DateSeparator := '-';
ShortDateFormat := 'YY/MM/DD hh:nn';
Value := DateTimeToStr(Now);
※ただし、グローバル変数なので一度変更すると以降そのアプリケーションの書式全て変更されます。必要に応じて元に戻すことも必要です。
当方、D7とD2009をもっていますが2009のヘルプではこの辺りの説明が見当たりません(探し方が悪い^^;)もっぱらD7のヘルプを活用しています。
遅くなってすみません。
スレッド内では必ず使わなければならないのですか?
実はスレッドの中でも使用していますが
使わないとどうなるのでしょうか?
ちなみに 英語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);
のような処理が必ず行えるようにしたいのです。
よろしくお願いします。
使い方としてはどれが正しいのでしょうか?
細かい部分は抜きにして、ざっぱでかいてみました。
イメージは伝わると思う(信じている)のですが
------------------------------------------------------------
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' になっていればいいのですが
>私としてはDateTimeToStr(Now);がどのような状況においても
>'yyyy/mm/dd hh:nn:ss' になっていればいいのですが
この場合なら、TFormatSettingsが必要です。
YearOf関数、MonthOf関数、DayOf関数はどうですか?
>YearOf関数、MonthOf関数、DayOf関数はどうですか?
これらの関数の引数にはTFormatSetting は使われていないみたいです。
何か不都合が生じるのでしょうか?
表示はしませんので、TFormatSettingは不要です。
それぞれの数値を得るだけです。
Y := IntToStr(YearOf(Adate));
のようにすれば年の文字列が入ります。
HOtaさんはDateTimeToStrはロケールのことを考慮しなければならないので、
ロケールに左右されないYearOf関数等を使用したほうが良いのではといっているのではないでしょうか。
どうしても、DateTimeToStrを使用しないといけないのでしょうか?
何度もすみません
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)]);
DateTimeToStrはロケールをセットするのなら、
FormatDateTime('yyyy/mm/dd hh:nn:ss', now)で得られますが、
セットしないのなら、YearOf(Now)等を使わないと不都合が生じます。
ツイート | ![]() |