見出し画像

Notes C API探訪: TIMEDATE(データ型)その1

TIMEDATE型は、Notes/Dominoにおける日時データ型です。実体は4バイトの符号なし整数2つの配列です。おもしろいのは、データベースの「レプリカID」はTIMEDATE型そのもので、文書の「ユニバーサル文書ID(略称UNID)」はTIMEDATE型2つで構成されていることです。

#include <global.h>
typedef struct tagTIMEDATE {
 DWORD Innards[2];
} TIMEDATE;

TIMEDATEの精度は10msです。これはコンバート関数によって証明されます。TIMEDATE型はバイナリーデータなので、これを他の日時関数に適用するためには、TIME構造体を介してTimeGMToLocal関数で各日時パートに分割する必要があります。

#include <misc.h>
typedef struct {
	int year;					/* 1-32767 */
	int month;					/* 1-12 */
	int day;					/* 1-31 */
	int weekday;				/* 1-7, Sunday is 1 */
	int hour;					/* 0-23 */
	int minute;					/* 0-59 */
	int second;					/* 0-59 */
	int hundredth;				/* 0-99 */
	int dst;					/* FALSE or TRUE */
	int zone;					/* Typically -12 to +12, but can include minutes. If this is the  */
								/* case, the two digit minutes are first, followed by the hour.   */
								/* E.g., GMT-04:30 would be 3004, while GMT+05:30 would be -3005. */
	TIMEDATE GM;
} TIME;

BOOL LNPUBLIC TimeGMToLocal (TIME far *Time);

この中で、hundredthというのは、1秒以下の単位が10msにあたります。5なら50ms、77なら770msということになります。また、zoneは時差を示していますが、日本の時差は通常+9:00となるところを、zoneは-9を返してきます。また、注釈にもあるように時差が分刻みになる場合は分が上位2桁、時が下位2桁になるケースもあります。

例えば、TIMEDATE型のデータをQtライブラリのQDateTimeオブジェクトに置き換えたい場合は以下のようにします(時差計算は簡易版です)。

TIME time;
time.GM = timeDateValue;
if (TimeGMToLocal(&time) == FALSE) {
  QDate qDate(time.year, time.month, time.day);
  QTime qTime(time.hour, time.minute, time.second, time.hundredth * 10);
  QDateTime qDateTime(qDate, qTime, Qt::offsetFromUTC, (time.zone + time.dst) * -3600);
}

なかなか恐ろしいのは、TimeGMToLocal関数は成功時にFALSEを返し、失敗時にTRUEを返すので注意が必要です。

逆に他の日時データからTIMEDATE型のデータに変換する場合は、TimeLocalToGM関数を使います。

#include <misc.h>
BOOL LNPUBLIC TimeLocalToGM (TIME far *Time);

例えば、QtライブラリのQDateTimeオブジェクトからTIMEDATE型のデータに置き換えたい場合は以下のようにします(時差計算は簡易版です)。

QDate qDate = qDateTime.date();
QTime qTime = qDateTime.time();
TIME time;
time.year = qDate.year();
time.month = qDate.month();
time.day = qDate.day();
time.hour = qTime.hour();
time.minute = qTime.minute();
time.second = qTime.second();
time.hundredth = qTime.msec() / 10;
QTimeZone timeZone = qDateTime.timeZone();
time.dst = qDateTime.isDaylightTime() ? 1 : 0;
time.zone = timeZone.offsetFromUtc(qDateTime) / -3600 + time.dst;
if (TimeLocalToGM(&time) == FALSE) { // 成功時FALSE
  // 成功時処理
}

レプリカID、UNIDについてはまた別の機会に探訪します。

注意: コードの利用においてチブル・システムズは一切の責任を負いません。自己責任でご利用をお願いいたします。

この記事が気に入ったらサポートをしてみませんか?