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


動作確認
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型で取得して、配列のインデックスに返す方法などもある。