C++在unixtime中获取当前年份的开始

C++在unixtime中获取当前年份的开始

问题描述:

我正在寻找一种方法来检索当前年份的开始,作为unix时间戳。C++在unixtime中获取当前年份的开始

例如,如果我们在2017-10-16,unix时间戳是1523318400.我必须检索1483228800(2017-01-01)。当然,它也必须在未来的几年中发挥作用。

+0

[计算](https://www.unixtimestamp.com/)相当简单。所有必要的提示都在链接上。 – user0042

+0

我需要用C++来计算它 – Yehonal

+0

获取当前年份。然后用'year =当前年份,月份= 1,日期= 1,小时= 0,分钟= 0,秒= 0'创建一个时间。 – Barmar

有一些函数可以从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。这将是如此简单:

#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。你可以找到Unix的时间戳2017-10-16有:

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 

你也可以使用这个库t o找到当年:

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