![見出し画像](https://assets.st-note.com/production/uploads/images/61850230/rectangle_large_type_2_44a0a4bfafe87af21dac39272d3ce8a0.png?width=1200)
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クラスに取り込んで拡張していきます。