Как отформатировать объект boost::date_time в соответствии с RFC 3339
-
20-08-2019 - |
Вопрос
Я хочу использовать 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 имеют двузначные дробные секунды.Что имеется в виду?
Решение
ABNF из RFC говорит, что после точки должна быть хотя бы одна цифра, определенного максимума не существует.
В Z нет реальной необходимости, вместо этого вы можете использовать 00:00, и это возможно с помощью фасетов.
В некоторых редких случаях 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...
И пример использования этого
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$