見出し画像

Notes C API探訪: TIMEDATE型をラップする

前回、TIME型の代替となるクラスを定義しましたが、一部TimeDateクラスに依存しています。TimeDateクラスは、Notes C APIの TIMEDATE 型のラップクラスです。今回はこのTimeDateクラスをご紹介します。

// nxpp/include/nxpp/nxpp_timedate.hpp

#ifndef NXPP_TIMEDATE_HPP
#define NXPP_TIMEDATE_HPP

// ...

namespace nxpp {

// ... class Time定義

/**
* @brief 日時クラス
*/
class TimeDate
{
 TIMEDATE value_;

public:
 /**
  * @brief デフォルトコンストラクタ
  */
 TimeDate() : value_(getConstant<TIMEDATE_MINIMUM>()) {}

 /**
  * @brief コピーコンストラクタ
  * @param td TIMEDATE型のデータ
  */
 TimeDate(const TIMEDATE &td) : value_(td) {}

 /**
  * @brief ムーブコンストラクタ
  * @param td TIMEDATE型のデータ
  */
 TimeDate(TIMEDATE &&td) : value_(std::move(td)) {}

 /**
  * @brief TIMEDATE型にキャスト
  */
 operator TIMEDATE() const { return value_; }

 /**
  * @brief 現在の日時を指定したUTCオフセットの時間に変換する
  * @param offsetSeconds UTCオフセット秒(夏時間込み)
  * @param isDaylightTime 夏時間の有無
  * @return TIMEDATE型のデータ
  */
 TIMEDATE toTimeZone(int offsetSeconds, bool isDaylightTime) const {
   TIME time;
   time.GM = value_;
   time.zone = Time::offsetSecondsToZone(offsetSeconds, isDaylightTime);
   time.dst = isDaylightTime ? TRUE : FALSE;
   if (TimeGMToLocalZone(&time) != FALSE) {
     return getConstant<TIMEDATE_WILDCARD>();
   }
   if (TimeLocalToGM(&time) != FALSE) {
     return getConstant<TIMEDATE_WILDCARD>();
   }
   return time.GM;
 }

 /**
  * @brief 日時定数の取得
  * @tparam T 取得する定数の設定値
  * @return 指定した日時定数
  */
 template <WORD T>
 static TIMEDATE getConstant() {
   TIMEDATE td;
   TimeConstant(T, &td);
   return td;
 }

 /**
  * @brief 現在の日時を取得
  * @return 現在の日時
  */
 static TIMEDATE getCurrent() {
   TIMEDATE td;
   OSCurrentTIMEDATE(&td);
   return td;
 }
};

// ...

} // namespace nxpp

#endif // NXPP_TIMEDATE_HPP

toTimeZoneメソッドは、現在の日時を、特定のタイムゾーンの時間に変換します。オフセット時間には、夏時間があれば含んだ時間を設定し、含めているかどうかは isDaylightTime で設定します。設定した内容でNotes C APIのTimeGMToLocalZone関数を呼びだし、現地時間に変換してパースします。あとは、パースした内容をTime::GMに戻すため、TimeLocalToGM関数を呼びだし、できあがったNotes時間を返します。

まとめ

今回ご紹介したTimeDateクラスは、現時点では最低限の仕様で、これからもラップできる関数があれば、TimeDateクラスに取り込んで拡張していきます。

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