31 May 2008

(Windows CE) time.t に含まれる時間関数が存在しない…

Windows CE用のVisual C++の標準関数には、time.tに存在する関数群が欠落している…  こんな基本的な関数が欠落してるのでは、既存のC++からの移植が出来ないではないか。 時間の計算は、自分で新規クラスを作ってやれということか?

オープンソースの互換関数「OpenTimeCE」が公開されているが、納品するプログラムにそういうのを使ってよいはずが無い。(ライセンス上問題がある可能性がある)

ということで、仕方なくCTime標準クラスで代用することにする。

CTime tmTime1, tmTime2; CTimeSpan tmSpan; SYSTEMTIME tmSystime; /* コンストラクタを用いた、即値の代入 */ // 年月日・時分秒の代入 tmTime1 = CTime(nYear, nMonth, nDay, nHour, nMinutes, nSecond); // SYSTEMTIME構造体の代入 ::GetLocalTime(&tmSystime); tmTime1 = CTime(tmSystime); /* 現在日時を得る */ tmTime1 = CTime::GetCurrentTime(); /* 時間の加算・減算 */ // CTimeSpan = CTime ± CTime tmSpan = tmT1 - tmT2; // 得られるtmSpan は秒単位 // CTime = CTime ± CTimeSpan tmT2 = tmT1 - CTimeSpan(0, -9, 0, 0); // 9時間差を計算 tmT2 = tmT1 - CTimeSpan(-9*60*60); // 9時間差を計算

ちなみに、デバッグする時に非常に見づらいです。 struct tm は、構造体に年・月… と区分けされてセットされているので、トレース実行時に年・月… と確認しながらトレースできる。 CTimeは、long int の値が一つだけ見えるだけで、年にアクセスするには CTime.GetYear() という関数を呼ぶ必要性がある。 せめて、メンバ変数 CTime.m_Year とかにしてほしかった…

時間関数のメモ

time.h Win32  MFC 
struct tm tm0;
tm0.tm_year = nYear - 1900;
tm0.tm_mon = nMonth -1;
tm0.tm_mday = nDay;
tm0.tm_hour = nHour;
tm0.tm_min = nMinute;
tm0.tm_sec = nSecond;

time_t tm1;
tm1 = mktime(&tm0);
  CTime tm;
tm = CTime(nYear, nMonth, nDay, nHour, nMinute, nSecond);
time_t tm1;
struct tm *ptm0;
ptm0 = localtime(&tm1);

nYear = ptm0->tm_year + 1900;
nMonth = ptm0->tm_mon + 1;
nDay = ptm0->tm_mday;
nHour = ptm0->tm_hour;
nMinute = ptm0->tm_min;
nSecond = ptm0->tm_sec;
SYSTEMTIME tm;
nYear = tm.wYear;
nMonth = tm.wMonth;
nDay = tm.wDay;
nHour = tm.wHour;
nMinute = tm.wMinute;
nSecond = tm.wSecond;

CTime tm;
nYear = tm.GetYear();
nMonth = tm.GetMonth();
nDay = tm.GetDay();
nHour = tm.GetHour();
nMinute = tm.GetMinute();
nSecond = tm.GetSecond();

time_t tm;
time(&tm);

SYSTEMTIME tm;
::GetLocalTime(&tm);

CTime tm;
tm = CTime::GetCurrentTime();

  SYSTEMTIME tm;
::SetLocalTime(&tm); 
 
  TIME_ZONE_INFORMATION tzInfo;
GetTimeZoneInformation(&tzInfo);
nMinutes = tzInfo.Bias;
 

time_t tm1, tm2, tmdiff;

tmdiff = tm1 - tm2;

  CTime tm1, tm2;
CTimeSpan tmdiff;

tmdiff = tm1 - tm2;
time_t tm1, tm2;
// 9時間時差を計算する
tm2 = tm1 + 9*60*60;
  CTime tm1, tm2;
// 9時間時差を計算する
tm2 = tm1 + CTimeSpan(0,9,0,0);
// struct tm -> CTime
CTime tmC;
struct tm tmS;
tmC = CTime(mktime(&tm0));
// SYSTEMTIME -> CTime
SYSTEMTIME tmS;
CTime tmC;
tmC = CTime(&tmS);
// CTime -> struct tm
CTime tmC;
struct tm *ptmS;
ptmS = tmC.GetLocalTm(NULL);
// time_t -> CTime;
CTime tmC;
time64_t tmT;
tmC = CTime(tmT);
// CTime -> SYSTEMTIME
SYSTEMTIME tmS;
CTime tmC;
tmC.GetAsSystemTime(&tmS);
// CTime -> time_t
CTime tmC;
time64_t tmT;
tmT = tmC.GetTime();