LoginSignup
0
0

More than 5 years have passed since last update.

c++ builder XE4, 10.2 Tokyo > TDateTime > 2015 Oct 14のような表示 > 自作

Last updated at Posted at 2015-10-15
動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)

FormatString()を使って2015 Oct 14のような表示にしたい。

参考
http://www.delphibasics.co.uk/RTL.asp?Name=FormatDateTime

Now().FormatString(L"yyyy mmm dd hh:nn:ss")



よくわからないが、上記を実行してもOctでなく10となってしまう場合がある。

mmmmとして試すと10月となる時がある。
Locale関連の設定がJaとENで違うのかもしれない。


try1

上記で希望通りの動作にならないので自作することにした。

1つの方法は以下。

static const String kNumToShortName_tbl [][2] =
{
    {"/01/", " Jan "},
    {"/02/", " Feb "},
    {"/03/", " Mar "},
    {"/04/", " Apr "},
    {"/05/", " May "},
    {"/06/", " Jun "},
    {"/07/", " Jul "},
    {"/08/", " Aug "},
    {"/09/", " Sep "},
    {"/10/", " Oct "},
    {"/11/", " Nov "},
    {"/12/", " Dec "},
};

static String ToShortMonthName(String src)
{
    String dst = src;
    for(int idx=0; idx < 12; idx++) {
        dst = StringReplace(dst, kNumToShortName_tbl[idx][0], kNumToShortName_tbl[idx][1], TReplaceFlags()<<rfReplaceAll);
    }
    return dst;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    String srcs[] = {
        L"2015/01/05 12:30:45",
        L"2015/02/11 12:30:45",
        L"2015/03/06 12:30:45",
        L"2015/10/12 12:30:45",
    };
    String dst;

    for(int mi=0; mi < 4; mi++) {
        dst = ToShortMonthName(srcs[mi]);
        Memo1->Lines->Add(srcs[mi] + L" --> " + dst);
    }

}
結果
2015/01/05 12:30:45 --> 2015 Jan 05 12:30:45
2015/02/11 12:30:45 --> 2015 Feb 11 12:30:45
2015/03/06 12:30:45 --> 2015 Mar 06 12:30:45
2015/10/12 12:30:45 --> 2015 Oct 12 12:30:45

以下の前提条件が必要
1. 月の表記が/で囲われている
2. 1桁の月は0つきで表示 (3月 -> /03/)

他の方法として、月をint型で取得して、配列のインデックスに返す方法などもある。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0