2017-10-16 4 views
1

유닉스 타임 스탬프로 현재 연도의 시작을 검색하는 방법을 찾고 있습니다.C++ 유닉스 시간에이 현재 연도 시작하기

예를 들어 우리가 2017-10-16에있는 경우 유닉스 타임 스탬프는 1523318400입니다. 대신 1483228800 (2017-01-01)을 검색해야합니다. 그리고 그것은 물론 다음 해에도 작동해야합니다.

+0

[계산] (https://www.unixtimestamp.com/)은 매우 쉽습니다. 필요한 모든 힌트가 링크에 있습니다. – user0042

+0

나는 그것을 C++로 계산할 필요가있다 – Yehonal

+0

현재 년도 가져 오기. 그런 다음 '년 = 현재 연도, 월 = 1, 일 = 1, 시간 = 0, 분 = 0, 초 = 0'으로 시간을 만듭니다. – Barmar

답변

1

time_t에서 월, 일, 분 및 초를 더하거나 뺄 수있는 함수가 있습니다.이 함수는 과거의 한 점에 대한 time_t를 계산하는 데 사용할 수 있지만 올바른 점을 찾기가 매우 어려워 보입니다 제거 할 단위 수. (cpp reference : time_point). 나는 또한 원래의 C 함수 mktime을 보았다. 그러나 time_t와 struct tm *을 만드는 동안 문제는 올바르게 시간대 올바른 버전을 생성합니다.

그래서 내 솔루션은 다음과 같습니다.

int getYear(time_t now) 
{ 
    struct tm * tnow = std::gmtime(&now); 
    return tnow->tm_year + 1900; 
} 

std::time_t calculateYear(int currentYear) 
{ 
    int epochYear = currentYear - 1970; 
    int leapYears = (epochYear + 1)/4; 
    time_t result = epochYear * 24 * 60 * 60 * 365; 
    result += leapYears * 24 * 60 * 60; 
    return result; 
} 

이 코드는 1970 년 (최초 time_t 값)과 2100 년 사이의 몇 년 동안 좋으며 100 년 규칙의 윤년이 아닙니다.

2012 년이 윤년 인 반면 2013 년은 처음으로 계산되기 시작한 윤년의 수는 이상합니다.

1

Howard Hinnant's free, open-source C++11/14/17 date/time library을 사용할 수 있습니다. 이 당신이 원한다고 대답은 아니라고

1514764800s 

참고 :

#include <iostream> 

int 
main() 
{ 
    using date::operator<<; 
    using namespace std::chrono_literals; 
    std::cout << start_of_year(date::sys_seconds{1523318400s}) << '\n'; 
} 

이 출력 :

#include "date/date.h" 

date::sys_seconds 
start_of_year(date::sys_seconds t) 
{ 
    using namespace date; 
    return sys_days{year_month_day{floor<days>(t)}.year()/jan/1}; 
} 

당신이처럼 사용할 수 있습니다 : 그것은이처럼 간단 할 것 . 그러나 그것은 맞습니다. 당신은뿐만 아니라이 라이브러리와 함께 이러한 차이를 디버깅 할 수 있습니다 :

std::cout << date::sys_seconds{1523318400s} << '\n'; 

이 출력 :

2018-04-10 00:00:00 

대신 2017-10-16.

1508112000s 

과 : 출력

using namespace date::literals; 
std::cout << date::sys_seconds{date::sys_days{2017_y/10/16}}.time_since_epoch() << '\n'; 

: 당신과 함께 2017-10-16의 유닉스 타임 스탬프를 찾을 수 있습니다

std::cout << start_of_year(date::sys_seconds{1508112000s}).time_since_epoch() << '\n'; 

출력됩니다 : 당신은 또한 수

1483228800s 

이 라이브러리를 사용하십시오. 지금

date::sys_seconds 
start_of_year(date::year y) 
{ 
    using namespace date; 
    return sys_days{y/jan/1}; 
} 

그리고 당신이 쓸 수 있습니다 : (또는 첨가에) date::sys_seconds

date::year 
current_year() 
{ 
    using namespace date; 
    using namespace std::chrono; 
    return year_month_day{floor<days>(system_clock::now())}.year(); 
} 

그리고 당신은 대신 date::year를 취할 start_of_year를 다시 작성 (또는 과부하) 수 : ㅇ 현재 연도를 찾을

int 
main() 
{ 
    using date::operator<<; 
    std::cout << start_of_year(current_year()).time_since_epoch() << '\n'; 
} 

현재 출력한다 :

,672,132 10