rfc 3339에 따라 Howto Format a boost :: date_time-object
-
20-08-2019 - |
문제
나는 사용하고 싶다 date_time
내 응용 프로그램에서 시간을 나타 내기 위해 Boost의 라이브러리. 이 응용 프로그램은 Atom Feeds를 생성하며, 이로 인해 지정된 형식의 시간-스탬프가 의무화됩니다. RFC 3339, 예를 들어 "1990-12-31T23 : 59 : 60Z"또는 "1990-12-31T15 : 59 : 60-08 : 00".
그렇다면이 RFC에 따라 시간을 어떻게 포맷합니까?
나는 그것을 읽고있다 날짜 시간 입력/출력 문서 하루 종일, 그리고 필요할 때 Z를 끝내는 방법을 알 수없는 것 같습니다. 또한, RFC는 선택적 분수 2 차를 지원하지만, 1 자리 (예 : "1990-12-31T23 : 59 : 60.5z"(*). 나는 이것을하는 방법을 찾을 수없는 것 같습니다.
나는 항상 필요한 필드를 읽는 내 자신의 형식 루틴을 쓸 수 있었지만, 그것은 나에게 date_time
도서관.
이 라이브러리에 대한 Formatters를 작성하는 경험이 있습니까? 아니면 내가 틀린 일을하고 있습니까?
(*) : RFC에 주어진 ABNF는 1 자리 분수 초만 허용하지만 동일한 RFC의 예는 2 자리 분수 초를 갖는 것 같습니다. 그게 무슨 의미 일까?
해결책
RFC의 ABNF는 DOT 후에 최소 1 자리가 있어야한다고 말하면 최대 값이 정의되지 않습니다.
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$