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();