2017-11-22 23 views
1

ISO 8601은 duration formatP[n]Y[n]M[n]DT[n]H[n]M[n]S으로 선언합니다. 예를 들어, P3Y0.5MT6M은 "3 년 반 월 3 분"을 의미합니다.ISO 8601을 나타냅니다. 현재 날짜에 따라 C++/부스트 길이가 달라집니다.

unixtime/chrono :: duration/whatever로 변환 할 수있는 variousways이 있지만 모든 솔루션에서 평균 월 및 연도를 초 단위로 사용합니다. 표준에 따라 올바르지 않습니다. 대신 01 Feb + P1M01 Mar (+28 일)이어야하며 01 Mar + P1M01 Apr (+31 일)이어야하는 등 날짜에 따라 달라야합니다.

어떤 방법으로 구현할 수 있습니까? 이 모든 윤년과 다른 불쾌한 일들을 다루는 수동 구현보다 더 훌륭한 선택이 있습니까?

답변

1

date/time library that's being standardized for C++20을 사용하는 것이 가장 좋습니다. cleverly named Date library은 사용자가 제안한 조작을 수행 할 수 있습니다. year_month_day 유형은 원하는 방식으로 월별 및 연도 별 추가 작업을 수행 할 수 있습니다.

또한, time_point로 변환은 time_point의 정수형 정밀도 내에서, 올바른 경우 : year_month_day 유형이 포함된다 양력의 관점에서 구현

system_clock::time_point tp = sys_days{sun[5]/may/2016}; 

따라서이 변환은 "평균"또는 무엇이든 상관하지 않습니다. 시스템 클록의 신기원을 얻고 그 신기원에서 주어진 날짜까지의 실제 일 수를 계산합니다. 그레고리력의 모든 특질을 고려합니다. 윤년 포함. 윤년이되어야하지만 그렇지 않은 해를 포함합니다. 이들은 정확하게 계산됩니다.

tp은 따라서 해당 날짜 이전의 정확한 일 수입니다.