2016-03-31 17 views
4

yyyy-MM-dd'T'HH:mm:ss.SSSXXXフォーマット文字列をicu :: SimpleDateFormatで使用しました。ICUを使用してISO 8601の日時をオプションの小数第2で解析します

小数点以下桁の日付/時刻文字列では機能しますが、例:

2016-03-31T15:04:32.049Z

2016-03-31T15:04:32.05Z

2016-03-31T15:04:32.3Z

秒未満の文字列を解析しません(例:2016-03-31T15:08:51Z)。エラーコードU_ILLEGAL_ARGUMENT_ERRORが返されます。

他の形式の組み合わせを使用しないようにしました。エラーコードで失敗したものもあれば、ミリ秒を無視したものもあります。

ICUはオプションの分数秒の構文解析もサポートしていますか?

+0

これ[フリー、オープンソース、ヘッダーのみのC++ 11月14日/ 17ライブラリ](HTTPS://howardhinnant.github .io/date/date.html)は、構文文字列 '"%FT%TZ "'でそれを行います。 'std :: chrono :: system_clock :: time_point'を解析するだけです。 –

+0

私は、最終的な解決策が、複数のパーサーを解析しようとすることを含むと予想しています。しかし、私もこれを試してみたときにU_ILLEGAL_ARGUMENT_ERRORを取得しています。だから私は何が間違っているのか分かりません。問題は似ていると思いますので、私はこれに恩恵をかけています。私が使用しているフォーマットはhttps://www.w3.org/TR/NOTE-datetimeです – markt1964

答えて

1

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; 
} 
関連する問題