문제

나는 사용하고 싶다 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 자리 분수 초를 갖는 것 같습니다. 그게 무슨 의미 일까?

도움이 되었습니까?

해결책

  1. RFC의 ABNF는 DOT 후에 최소 1 자리가 있어야한다고 말하면 최대 값이 정의되지 않습니다.

  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 함수에서 비슷한 경우 ...

그리고 이것의 예제 사용

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$

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top