文字列から日付/時刻型への変換

[戻る]
えりたまSpecial [E-Mail] 2019/01/13(日) 17:37:49
久しぶりに投稿いたします
[環境:Win7+VC2005 VC++]

Accesssで作成したDBの日付/時刻型のフィールドに任意で作成した日時を格納したいので
すがどうしてもうまく行きません

以下の方法でうまくいかないところアドバイス頂ければ幸いです。

@OleEndTimeを使いたいのでafxdtctl.hをインクルード

#include "afxdtctl.h"

A格納したい日時情報をCString型で取得する

CString Temp;
 
⇒ このTempに文字列で例えば"2018/12/25 11:24:39"というようなデータを格納してお
く

B文字列が格納されているTempをchar型に変換。そのデータをOleDataTime型の変数
OleTimeに格納

COleDateTime OleTime;
char *pChar = new char[Temp.GetLength()+1];
strcpy(pChar, Temp);            
OleTime.ParseDateTime(pChar);
delete [] pChar;

⇒ この時点でOleTimeには年/月/日/時間/分/秒がきちんと格納されています。

  <確認方法>
    CString cc;
    cc.Format("%d %d %d %d %d %d",
            OleTime.GetYear(),
            OleTime.GetMonth(),
            OleTime.GetDay(),
            OleTime.GetHour(),
            OleTime.GetMinute(),
            OleTime.GetSecond());
    AfxMessageBox(cc);

COleDataTime型の変数OleTimeをCTime型の変数TimeDataに代入

CTime TimeData;

TimeData = OleTime;


以上です。このTimeDateのデータをAccessに書き込もうとするのですができません。デ
フォルトの1970/01/01になってしまいます。どこが良くないのでしょうか?

何卒宜しくお願い致します。

なーめ 2019/01/14(月) 02:57:33
>> TimeData = OleTime;

double (DATE) から int (time_t) への型変換が起きてますね

ちゃんとそれぞれの型に格納される時刻値の仕様を確認しましょう

それをふまえたうえで、
(以下は FILETIME 型が64bitという前提に依存してますが...)


time_t OleDateTime2TimeT( COleDateTime& odt )
{
    SYSTEMTIME st;
    FILETIME ft;
    odt.GetAsSystemTime( st );
    SystemTimeToFileTime( &st, &ft );
    return((time_t)(((*(__int64 *)&ft )- 0x019DB22A45262800 ) / 10000000 ));
}

を用意して

TimeData = OleDateTime2TimeT( OleTime );

と使う。
どうでしょうか?

COleDateTime odt;
odt.ParseDateTime(_T("2018/12/25 11:24:39"));
CTime cdt = OleDateTime2TimeT( odt );
AfxMessageBox( odt.Format(_T("%y/%m/%d %H:%M:%D")));
AfxMessageBox( cdt.Format(_T("%y/%m/%d %H:%M:%D")));

なーめ 2019/01/14(月) 03:22:30
↑訂正, なんで S を D にしてしまったんだろう orz
×
AfxMessageBox( odt.Format(_T("%y/%m/%d %H:%M:%D")));
AfxMessageBox( cdt.Format(_T("%y/%m/%d %H:%M:%D")));
〇
AfxMessageBox( odt.Format(_T("%y/%m/%d %H:%M:%S")));
AfxMessageBox( cdt.Format(_T("%y/%m/%d %H:%M:%S")));

えりたまSpecial [E-Mail] 2019/01/14(月) 18:10:33
[[解決]]
To なーめさん

想定通りの結果が得られました!

ただ教えて頂いた内容がいまひとつ理解できていないので頂いたコードを元に勉強させて
頂きます。

どうも時間系の単位がよくわかっておりませんのでまた何かの機会に質問するかもしれま
せん。

アドバイスありがとうございました!!

古いスレッドには追加発言できません。