Как отформатировать boost :: date_time-object согласно RFC 3339 - PullRequest
4 голосов
/ 29 января 2009

Я хочу использовать библиотеку 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.5Z») (*). Кажется, я тоже не могу понять, как это сделать.

Я всегда мог написать свою собственную процедуру форматирования, которая считывает различные необходимые поля, но мне кажется, что она работает против структуры date_time библиотеки.

Есть ли у вас опыт написания средств форматирования для этой библиотеки? Или я делаю не то?

(*): Мне кажется, что ABNF, указанный в RFC, допускает дробные секунды только с одной цифрой, но примеры в том же RFC имеют дробные секунды с двумя цифрами. Что это должно означать?

1 Ответ

5 голосов
/ 30 января 2009
  1. ABNF из RFC говорит, что после точки должна быть хотя бы одна цифра, не определено максимальное значение.

  2. Нет реальной необходимости в Z, вместо этого вы можете использовать 00:00, и это возможно с фасетами

  3. В некоторых редких случаях date_time генерирует "Z". Посмотрите снимок кода от boost (local_date_time.hpp), который показывает, что это ниже:


    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");
        }
    ...

Похоже, если в функции zone_abbrev ...

И пример использования этого

</p> <pre><code>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$

...