Формат методические импульс::дата-время-объект согласно RFC 3339
Я хочу использовать библиотеку date_time
в boost для представления времени в моем приложении. Это приложение будет генерировать каналы Atom, которые, в свою очередь, требуют временных меток в формате, указанном в RFC 3339, например "1990-12-31T23:59:60Z" или "1990-12-31T15:59:60-08:00".
Итак, как мне форматировать время в соответствии с этим RFC?
Я читал документацию по вводу/выводу даты и времени весь день, и я, кажется, не могу найти, как поставить Z в конце, когда мне нужно оно. Кроме того, RFC поддерживает необязательную дробную секунду, но только одну ее цифру (например. "1990-12-31T23: 59: 60.5 Z") (*). Я тоже не могу понять, как это сделать.
Я всегда мог бы написать свою собственную процедуру форматирования, которая считывает различные необходимые поля, но мне кажется, что это работает против зерна библиотеки date_time
.
Есть ли опыт написания форматтеров для этой библиотеки? Или я делаю что-то не так?
(*): Мне кажется, что ABNF дал в RFC допускает только однозначные дробные секунды, но примеры в том же RFC имеют двухзначные дробные секунды. Что ты хочешь этим сказать?
1 ответ:
ABNF из RFC говорит, что должна быть хотя бы одна цифра после точки, нет определенного максимума.
Нет никакой реальной необходимости в Z, вы можете использовать 00:00 вместо этого, и это возможно с фасетами
В некоторых редких случаях date_time будет генерировать "Z". Смотрите снимок кода из boost (local_date_time.ГЭС), что предполагает следующее:
std::string zone_name(bool as_offset=false) const { if(zone_ == boost::shared_ptr()) { if(as_offset) { return std::string("Z"); } else { return std::string("Coordinated Universal Time"); } ...
Есть аналогичное if в функции zone_abbrev...
И пример использования это
slimak@daradei:~/store/kodowanie/moje/test$ cat boost_date_time.cpp #include "boost/date_time.hpp" #include "boost/date_time/local_time/local_time.hpp" using namespace boost::posix_time; using namespace boost::local_time; int main() { local_date_time t = local_sec_clock::local_time(time_zone_ptr()); local_time_facet* lf(new local_time_facet("%Y-%m-%dT%H:%M:%S%F%Q")); std::cout.imbue(std::locale(std::cout.getloc(), lf)); std::cout << t << std::endl; return 0; } slimak@daradei:~/store/kodowanie/moje/test$ g++ boost_date_time.cpp && ./a.out 2009-01-30T12:15:56Z slimak@daradei:~/store/kodowanie/moje/test$