C ++在unixtime中获得本年度的开始

时间:2017-10-16 19:21:56

标签: c++ date unix-timestamp

我正在寻找一种方法来检索当前年份的开头作为unix时间戳。

例如,如果我们在2017-10-16,则unix时间戳为1523318400.我必须检索1483228800(2017-01-01)。当然,它也必须适用于未来几年。

2 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分: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年(第一次_t值)和2100之间存在多年,这不是100年规则的闰年。

闰年的数量很奇怪,因为虽然2012年是闰年,但它是2013年开始计算的第一年。