TDateには++演算子が使えることを今さら知った。値を一日ずつ進めてくれる。
比較演算子(<)もあるので、std::setやmapにも格納できる。
Vclアプリケーションでのテストコード。
1 2 3 4 5 6 7 |
void __fastcall TForm1::Button1Click(TObject *Sender) { TDate d( 2018, 10, 31 ); Memo->Lines->Add( d.DateString() ); ++d; Memo->Lines->Add( d.DateString() ); } |
出力結果:
2018/10/31
2018/11/01
もちろん閏月判定もやってくれる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void __fastcall TForm1::Button1Click(TObject *Sender) { TDate d1( 2015, 2, 28 ); Memo->Lines->Add( d1.DateString() ); ++d1; Memo->Lines->Add( d1.DateString() ); Memo->Lines->Add( L"----------------" ); TDate d2( 2016, 2, 28 ); Memo->Lines->Add( d2.DateString() ); ++d2; Memo->Lines->Add( d2.DateString() ); ++d2; Memo->Lines->Add( d2.DateString() ); } |
出力結果:
2015/02/28
2015/03/01
—————-
2016/02/28
2016/02/29
2016/03/01
前置と後置の評価タイミングも当然異なる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void __fastcall TForm1::Button1Click(TObject *Sender) { TDate d( 2018, 11, 11 ), d1, d2; d1 = d; d2 = d; if( d1++ == d ) Memo->Lines->Add( L"postfix : equal" ); else Memo->Lines->Add( L"postfix : differ" ); if( ++d2 == d ) Memo->Lines->Add( L"prefix : equal" ); else Memo->Lines->Add( L"prefix : differ" ); } |
出力結果:
postfix : equal
prefix : differ
もともと与えられた日付の一覧から、欠落した日付を列挙する方法を調べていて気付いたので、以下、そのサンプル。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
void __fastcall TForm1::Button1Click(TObject *Sender) { // 欠落した日付を列挙するテスト std::set<TDate> date_set = { TDate( 2016, 2, 25 ), TDate( 2016, 2, 27 ), TDate( 2016, 3, 1 ), TDate( 2016, 3, 2 ), TDate( 2016, 3, 3 ), TDate( 2016, 3, 6 ), TDate( 2016, 3, 7 ), TDate( 2016, 3, 9 ), TDate( 2016, 3, 10 ) }; auto it = date_set.begin(); TDate BeforeDate = *it; while( ++it != date_set.end() ) { TDate CurrentDate = *it; while( ++BeforeDate < CurrentDate ) { Memo->Lines->Add( BeforeDate ); } BeforeDate = CurrentDate; } } |
出力結果:
2016/02/26
2016/02/28
2016/02/29
2016/03/04
2016/03/05
2016/03/08
なおTDateはTDateTimeのtypedefなので、TDateTimeでも同様に++演算子で1日ずつ値が進む。
1 2 3 4 5 6 7 8 9 |
void __fastcall TForm1::Button1Click(TObject *Sender) { TDateTime dt( 2018, 11, 30, 14, 35, 21, 000 ); Memo->Lines->Add( dt.DateTimeString() ); ++dt; Memo->Lines->Add( dt.DateTimeString() ); ++dt; Memo->Lines->Add( dt.DateTimeString() ); } |
出力結果:
2018/11/30 14:35:21
2018/12/01 14:35:21
2018/12/02 14:35:21
Vcl/FireMonkey共通。
C++Bulider10.2.3 / Windows10で確認。