c++ builder XE4, 10.2 Tokyo > TDateTime > TDate型は時刻情報も保持するようだ


動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <DateUtils.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TDate procDate1 = StrToDate(L"2016/07/07");
    TDate procDate2 = StrToDateTime(L"2016/07/07 12:30:45");
}
//---------------------------------------------------------------------------

上記にてTDate型としてprocDate1とprocDate2を宣言している。
TDate型なのでTime情報は破棄されると思ったらそうではないようだ。

デバッグでそれぞれのvalueを見ると

  • procDate1: 42558
  • procDate2: 42558.521351667

procDate2 = (TDate)StrToDateTime(L"2016/07/07 12:30:45");という明示的な型変換でも同じ。

Now()の値からIncDay()で1日分を引いた値をTDate型に格納した場合、時刻情報も保持されてしまい、そのTDate型を基準とした日時処理をする時に失敗していた。

TDate型に格納する場合でも、以下に記載したような時刻情報消去が必要になるようだ。
http://qiita.com/7of9/items/ef540fa90615c4dcfb42