유닉스 타임 스탬프로 현재 연도의 시작을 검색하는 방법을 찾고 있습니다.C++ 유닉스 시간에이 현재 연도 시작하기
예를 들어 우리가 2017-10-16에있는 경우 유닉스 타임 스탬프는 1523318400입니다. 대신 1483228800 (2017-01-01)을 검색해야합니다. 그리고 그것은 물론 다음 해에도 작동해야합니다.
유닉스 타임 스탬프로 현재 연도의 시작을 검색하는 방법을 찾고 있습니다.C++ 유닉스 시간에이 현재 연도 시작하기
예를 들어 우리가 2017-10-16에있는 경우 유닉스 타임 스탬프는 1523318400입니다. 대신 1483228800 (2017-01-01)을 검색해야합니다. 그리고 그것은 물론 다음 해에도 작동해야합니다.
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 년은 처음으로 계산되기 시작한 윤년의 수는 이상합니다.
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
[계산] (https://www.unixtimestamp.com/)은 매우 쉽습니다. 필요한 모든 힌트가 링크에 있습니다. – user0042
나는 그것을 C++로 계산할 필요가있다 – Yehonal
현재 년도 가져 오기. 그런 다음 '년 = 현재 연도, 월 = 1, 일 = 1, 시간 = 0, 분 = 0, 초 = 0'으로 시간을 만듭니다. – Barmar