ICUのdocumentationを通って、パターン指定にオプション部分を入力する方法が見つかりませんでした。
ただし、この問題はアプリケーションレベルでさまざまな方法で解決できます。そのような方法の一つ(簡略化)を以下のように、複数の日時パーサを使用している:
#include <iostream>
#include <vector>
#include "unicode/datefmt.h"
#include "unicode/smpdtfmt.h"
int main() {
UErrorCode err(U_ZERO_ERROR);
UnicodeString patternWithMilliseconds("yyyy-MM-dd'T'hh:mm:ss.SSSXXX");
UnicodeString patternPlane("yyyy-MM-dd'T'hh:mm:ssX");
// init ICU parsers
std::vector<SimpleDateFormat*> parsers = {
new SimpleDateFormat(patternWithMilliseconds, err),
new SimpleDateFormat(patternPlane, err)
};
// get dates to convert
std::vector<UnicodeString> dates = {
UnicodeString("2016-03-31T15:04:32.049Z"),
UnicodeString("2017-10-30T15:05:33Z"),
};
SimpleDateFormat resultFormatter(patternWithMilliseconds, err);
for(const auto& date : dates) {
UDate parsedDate;
UnicodeString result;
std::string resultConverted;
for(const auto& parser : parsers) {
err = U_ZERO_ERROR;
parsedDate = parser->parse(date, err);
if (err <= 0) break;
}
resultFormatter.format(parsedDate, result);
result.toUTF8String(resultConverted);
std::cout << resultConverted << std::endl;
}
for(auto& parser : parsers) {
delete parser;
}
return 0;
}
これ[フリー、オープンソース、ヘッダーのみのC++ 11月14日/ 17ライブラリ](HTTPS://howardhinnant.github .io/date/date.html)は、構文文字列 '"%FT%TZ "'でそれを行います。 'std :: chrono :: system_clock :: time_point'を解析するだけです。 –
私は、最終的な解決策が、複数のパーサーを解析しようとすることを含むと予想しています。しかし、私もこれを試してみたときにU_ILLEGAL_ARGUMENT_ERRORを取得しています。だから私は何が間違っているのか分かりません。問題は似ていると思いますので、私はこれに恩恵をかけています。私が使用しているフォーマットはhttps://www.w3.org/TR/NOTE-datetimeです – markt1964