I have datetime parser and datetime array parser.
datetime_ = qi::eps[at_c<0>(qi::_val) = type::datetime] >>
dt_string[at_c<1>(qi::_val) = qi::_1];
dt_string = (/*qi::lit("d") >>*/ qi::int_ >> "-" >> qi::int_ >> "-" >> qi::int_ >> "T" >>
qi::int_ >> ":" >> qi::int_ >> ":" >> qi::int_ >> -("." >> qi::int_))
[qi::_val = construct<datetime>(qi::_1, qi::_2, qi::_3,
qi::_4, qi::_5, qi::_6)];
dt_array_ = qi::eps[at_c<0>(qi::_val) = type::datetime_array] >>
dt_array_lit[at_c<1>(qi::_val) = qi::_1];
dt_array_lit = "[" >> +(dt_string % ',') >> ']';
Array parser works as expected, but single date literal parser gives parse error at 4th position ("2010-09-23...."). I think it's because there is also number parser defined and it fails when it finds "-" after number.
number %= qi::attr(type::number) >> qi::double_;
But number array parser also exists and it doesn't conflict with datetime array parser.
number_array_ = qi::eps[at_c<0>(qi::_val) = type::number_array] >>
number_array_lit[at_c<1>(qi::_val) = qi::_1];
number_array_lit = "[" >> +(qi::double_ % ',') >> ']';
Now i use workaround, prefix "d" before datetime literal. You can see it commented in the first snippet. But if possible I would like just UTC datetime literal to be parsed properly in all contexts.