C++ 在 unixtime 中获取今年的开始
C++ get start of this current year in unixtime
我正在寻找一种方法来检索当前年份的开始作为 unix 时间戳。
例如,如果我们在 2017-10-16 上,unix 时间戳是 1523318400。我必须检索 1483228800 (2017-01-01)。当然,它也必须在未来几年发挥作用。
您可以使用 Howard Hinnant's free, open-source C++11/14/17 date/time library。就这么简单:
#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};
}
你可以这样使用它:
#include <iostream>
int
main()
{
using date::operator<<;
using namespace std::chrono_literals;
std::cout << start_of_year(date::sys_seconds{1523318400s}) << '\n';
}
这输出:
1514764800s
请注意,这不是您所说的想要的答案。然而它是正确的。您也可以使用此库调试此差异:
std::cout << date::sys_seconds{1523318400s} << '\n';
这输出:
2018-04-10 00:00:00
而不是 2017-10-16
。您可以通过以下方式找到 2017-10-16
的 Unix 时间戳:
using namespace date::literals;
std::cout << date::sys_seconds{date::sys_days{2017_y/10/16}}.time_since_epoch() << '\n';
输出:
1508112000s
并且:
std::cout << start_of_year(date::sys_seconds{1508112000s}).time_since_epoch() << '\n';
将输出:
1483228800s
您还可以使用此库查找当前年份:
date::year
current_year()
{
using namespace date;
using namespace std::chrono;
return year_month_day{floor<days>(system_clock::now())}.year();
}
并且您可以重写(或重载)start_of_year
以采用 date::year
而不是(或除此之外)date::sys_seconds
:
date::sys_seconds
start_of_year(date::year y)
{
using namespace date;
return sys_days{y/jan/1};
}
现在你可以写:
int
main()
{
using date::operator<<;
std::cout << start_of_year(current_year()).time_since_epoch() << '\n';
}
当前输出:
1483228800s
有time_t加减月、日、分、秒数的函数,可用于计算time_t过去的一个点,但是要找到要删除的正确数量的单元看起来很尴尬。 (cpp reference : time_point). I also looked at original C function 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年才开始计算闰年
我正在寻找一种方法来检索当前年份的开始作为 unix 时间戳。
例如,如果我们在 2017-10-16 上,unix 时间戳是 1523318400。我必须检索 1483228800 (2017-01-01)。当然,它也必须在未来几年发挥作用。
您可以使用 Howard Hinnant's free, open-source C++11/14/17 date/time library。就这么简单:
#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};
}
你可以这样使用它:
#include <iostream>
int
main()
{
using date::operator<<;
using namespace std::chrono_literals;
std::cout << start_of_year(date::sys_seconds{1523318400s}) << '\n';
}
这输出:
1514764800s
请注意,这不是您所说的想要的答案。然而它是正确的。您也可以使用此库调试此差异:
std::cout << date::sys_seconds{1523318400s} << '\n';
这输出:
2018-04-10 00:00:00
而不是 2017-10-16
。您可以通过以下方式找到 2017-10-16
的 Unix 时间戳:
using namespace date::literals;
std::cout << date::sys_seconds{date::sys_days{2017_y/10/16}}.time_since_epoch() << '\n';
输出:
1508112000s
并且:
std::cout << start_of_year(date::sys_seconds{1508112000s}).time_since_epoch() << '\n';
将输出:
1483228800s
您还可以使用此库查找当前年份:
date::year
current_year()
{
using namespace date;
using namespace std::chrono;
return year_month_day{floor<days>(system_clock::now())}.year();
}
并且您可以重写(或重载)start_of_year
以采用 date::year
而不是(或除此之外)date::sys_seconds
:
date::sys_seconds
start_of_year(date::year y)
{
using namespace date;
return sys_days{y/jan/1};
}
现在你可以写:
int
main()
{
using date::operator<<;
std::cout << start_of_year(current_year()).time_since_epoch() << '\n';
}
当前输出:
1483228800s
有time_t加减月、日、分、秒数的函数,可用于计算time_t过去的一个点,但是要找到要删除的正确数量的单元看起来很尴尬。 (cpp reference : time_point). I also looked at original C function 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年才开始计算闰年