見出し画像

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. テキスト → 日時 (今回)

次回は、以前の記事で紹介したコンバートシミュレーターダイアログのバグ修正と、タイムゾーンを変更してコンバートできるようにしたあたりをご紹介する予定です。

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