日付表示形式について

解決


みずき  2010-04-10 04:29:24  No: 38255

日付に関する各国の違いの混乱を防ぐため月をJanなどにしたいと思って月の部分をmmmにしてみました。しかし結果はゼロなしの数字の月表示しか表示されません。DELPHIはD6パーソナルで現在のOSの表示形式はyyyy/mm/ddです。ファイルに書き込むときだけdd/mmm/yyyy形式にしたいと思っています。コードがおかしいのかOSの表示形式指定の問題なのかD6が原因なのかわかりません。解決策があったら教えてください。  

procedure TForm1.Button1Click(Sender: TObject);
var
  d : TDateTime;
begin
  d :=  now;
  Label1.Caption  :=  FormatDateTime('yyyy/mmm/dd', d);  
end;


tor  2010-04-10 05:10:43  No: 38256

mmmだとグローバル変数ShortMonthNamesの値が使われるとヘルプにはありますが、その中身はどうなっていますか?
日本では月を数字で表すので、日本語のシステムであれば'1'とか'2'とかが入っているのが普通だと思いますが。

もし1月が英語の'Jan'になってくれないと困るというのなら
・LANG_ENGLISHあたりを指定してLCIDを作り、それを使ってGetDateFormatで書式化する
・ShortMonthNameに自分で'Jan'とか'Feb'とかを入れておく
・いっそ自前で'Jan'とかを入れておいた配列を使う
などが考えられます。
ただ、国際的に書式を統一するという目的では、むしろ数字を使って
YYYY-MM-DD
の形式で表すのが推奨されていたと思います。


tor  2010-04-10 05:40:06  No: 38257

改めて調べてみたところ、国際的な日付書式はISO 8601という規格ですが
W3Cの説明がわかりやすいので、そっちの定義がよく使われるようです。
http://www.w3.org/TR/NOTE-datetime

ついでに、手元のDelphi6+Windows XPの環境で見たところ
やはりShortMonthNamesの初期値は['1', '2', ...] でした。


みずき  2010-04-10 18:10:26  No: 38258

tor様、テストまでしていただいて恐縮です。
日付の読み違えでケースがあって誰が見ても間違いようがないものを考えていました。HELPでもmmmが出ていましたので当方に問題があって何か策があるのかと質問させていただきましたがやはり同じ結果になると確認できて安心しました。ソースをスマートに、などと考えずに地道に配列を作って対処することにします。ありがとうございました。


Mr.XRAY  2010-04-11 03:58:48  No: 38259

みなさんこんにちは.Mr.XRAYです.

月と曜日の表示形式ですが,[地域と言語のオプション]の設定が使われるようです.
http://mrxray.on.coocan.jp/Others/FormatDate01.htm


みずき  2010-04-11 19:00:42  No: 38260

tor様、Mr.XRAY様
的確なご回答をありがとうございました。HELPにもmmmでJanが出ると書いてあったのでてっきり私の未熟さ故の問題かと思っていましたがこれで確信できました。
var
tuki:Array [1..12] of String;

Begin
tuki[1]:='Jan';
tuki[2]:='Feb';

などと書いて解決しました。お礼まで。


みずき  2010-04-11 19:04:14  No: 38261

追伸。例えば'hh:nn:ss'と指定してもhhは0付きにはなりませんでした。


TS  2010-04-11 21:07:29  No: 38262

テストしてみました。
const
  E_Months: array[1..12] of String =
  ('Jan','Feb','Mar','Apr','May','Jun'
  ,'Jul','Aug','Sep','Oct','Nov','Dec');
var
  d:TDateTime;
  Year1,Month1,Day1:word;
begin
  d:=VarToDateTime('2010/4/9 5:6:7');
  DecodeDate(d,Year1,Month1,Day1);
  Edit1.Text :=  FormatDateTime('yyyy/',d)
               + E_Months[Month1]
               + FormatDateTime('/dd hh:nn:ss' ,d);
  上記結果//2010/Apr/09 05:06:07

私の環境Delphi2010では0付になりました。


みずき  2010-04-12 02:39:18  No: 38263

TS様、テストしていただきありがとうございました。配列にデータを書き込む手法は拝借させていただきました。私のPC(XP)では時刻が0付きのになりませんので文字列処理で強制的に修正しました。delphiはバージョン、OSなどにより結果が異なるためかHELPも絶対的なものではないようですが、逆に工夫すれば何でもできるようで助かります。ありがとうございました。


Mr.XRAY  2010-04-12 04:17:05  No: 38264

>私のPC(XP)では時刻が0付きのになりませんの

処理の前に以下のコードを追加してみてください.

  //アプリ実行中に行われた[地域と言語のオプション]の変更を無視する
  Application.UpdateFormatSettings := False;
  //年は4桁,月と日を2桁表示
  //ただしこの設定を行ってもm,dの1桁で表示形式を指定した場合は1桁)
  ShortDateFormat := 'yyyy/mm/dd';

ただし,表示コントロールによっては機能しない場合もあります.


Mr.XRAY  2010-04-12 04:32:49  No: 38265

>処理の前に以下のコードを追加してみてください.

と思ったのですが,当方では動作確認できませんでした.
残念!!


みずき  2010-04-12 19:37:24  No: 38266

Mr.XRAY様  色々とご指導をありがとうございます。私もこれでテストしてみた結果mmを入れると2010/04/12と出ましたがmmmとすると逆に2010/4/12とゼロなしの月になりました。OSやPCの設定などに関係なく所定の結果を出すにはやはり確信の持てる方法でやりたいと思いました。ありがとうございました。


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

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






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