Notes C API探訪: テキストを日時にコンバートする
テキストコンバートシリーズの最後は、テキストから日時への変換です。
コンバートシミュレーターダイアログの記事で以下のようにコードを紹介していました。
void ConvertSimulatorDialog::convertTextToTime() {
nxpp::TextToTimeDateConverter converter;
setIntlFormat(&converter);
setTimeFormat(&converter);
try {
QString text = ui->textToDateTimeLineEdit->text();
TIMEDATE td = converter(toLmbcsQ(text));
ui->textToDateTimeDateTimeEdit->setDateTime(nxpp::qt::fromTIMEDATE(td));
}
// Notesステータスがスローされたらそのエラーメッセージに変換して表示
catch (nxpp::Status &status) {
consoleLog(nxpp::qt::fromStatus(status.error()));
}
// それ以外の例外ならそのメッセージを表示
catch (std::exception &ex) {
std::string what(ex.what());
consoleLog(QString::fromStdString(what));
}
}
コンバーター(nxpp::TextToTimeDateConverter)については後述します。
テキスト入力ウィジェットからテキストを取得し、コンバーターで変換してTIMEDATE型にして、最後にそれをQDateTime型に変換して、日時入力ウィジェットに設定します。
nxpp::TextToTimeDateConverter
では、テキストから日時に変換するコンバーターのコードを見ていきます。
// nxpp/include/nxpp/nxpp_timedate.hpp
// ...
namespace nxpp {
// ...
class TextToTimeDateConverter
: public TimeConverter
{
public:
TextToTimeDateConverter() : TimeConverter() {}
TextToTimeDateConverter(
intl::SettingsPtr iPtr,
TimeFormatPtr tPtr
)
: TimeConverter(iPtr, tPtr)
{}
TIMEDATE operator () (const Lmbcs &lmbcs) const {
char *ptr = const_cast<char*>(lmbcs.c_str());
TIMEDATE td;
Status status = ConvertTextToTIMEDATE(
!intlSettingsPtr_ ? nullptr : intlSettingsPtr_->data(),
!formatPtr_ ? nullptr : formatPtr_->data(),
&ptr,
static_cast<WORD>(lmbcs.length()),
&td
);
if (!status) { throw status; }
return td;
}
};
// ...
} // namespace nxpp
// ...
他のコンバーターと同様、関数オブジェクト仕様です。継承元のTimeConverterは、前回の記事で紹介した nxpp::TimeDateToTextConverter のものと同じです。
まとめ
以下の通り、コンバーター関数のラップシリーズ、これにて完結です。
1. 数値 → テキスト (紹介記事)
2. テキスト → 数値 (紹介記事)
3. 日時 → テキスト (紹介記事)
4. テキスト → 日時 (今回)
次回は、以前の記事で紹介したコンバートシミュレーターダイアログのバグ修正と、タイムゾーンを変更してコンバートできるようにしたあたりをご紹介する予定です。