gpt4 book ai didi

c++ - 找出n个月前的确切日期和时间?

转载 作者:行者123 更新时间:2023-11-30 03:35:35 25 4
gpt4 key购买 nike

我正在使用 HowardHinnant date我项目中的库。我想获得 n 个月前的确切日期时间。

例如:“2016-12-17 18:21:26”是当前日期时间,我想知道 13 个月前的日期时间。它应该输出“2015-11-17 18:21:26”。

/*
* This function will return the current date in year_month_day format
*/

auto currentDate() {
auto currentTime = std::chrono::system_clock::now();
date::year_month_day currentDate = date::floor<date::days>(currentTime);
return currentDate;
}



/*
* This function will find the date before (n) months
*/

template <typename T>
auto oldDate(T monthsNum) {
auto currentDate = currentDate();
auto yearCurrentDate = (int)currentDate.year();
auto monthCurrentDate = currentDate.month();
auto dayCurrentDate = currentDate.day();
auto yearNum = monthsNum/12;
auto yearEndDate = yearCurrentDate - yearNum;
auto monthNum = monthsNum%12;
auto monthEndDate = monthCurrentDate;
while(monthNum) {
monthEndDate--;
}
if(monthEndDate > monthCurrentDate) {
yearEndDate--;
}
date::year_month_day endDate = date::year{yearEndDate}/monthEndDate;
return endDate;
}

我的函数 oldDate() 将返回 n 个月前的日期。但我没时间。

最佳答案

而不是 currentDate() , 创建一个 currentTime返回 sys_seconds (精确到秒的时间):

auto
currentTime()
{
using namespace std::chrono;
return date::floor<seconds>(system_clock::now());
}

现在oldDate可以调用currentTime而不是 currentDate并以这种方式了解和保存一天中的时间。

oldDate应将 date::months 作为参数这是 std::chrono::duration精确到几个月。它可能是这样的(稍后描述):

auto
oldDate(date::months monthsNum)
{
using namespace date;
auto time = currentTime();
auto sd = floor<days>(time);
auto time_of_day = time - sd;
auto ymd = year_month_day{sd} - monthsNum;
if (!ymd.ok())
ymd = ymd.year()/ymd.month()/last;
return sys_days{ymd} + time_of_day;
}

using namespace date很方便,否则你会得到 date::到处都是。

  • 首先从currentTime()获取时间.这是 std::chrono::time_point<system_clock, seconds> ,或自 1970-01-01 UTC 以来的秒数。

  • 然后使用 floor<days>() 将此秒数截断为天数.这是 std::chrono::time_point<system_clock, days> .

  • 可以想到sd作为一天中第一个时刻的时间点(UTC)。所以如果你减去 sd来自 time你得到一个std::chrono::duration代表一天中的时间。精度将是 common_type您要减去的两个精度中的一个 ( seconds)。

  • 要进行月份运算,需要切换sd的类型来自 sys_days (a time_point ) 到 year_month_day (日历类型)。一旦你输入 year_month_day , 你可以减去 monthsNum从中产生另一个year_month_day (存储在上面的ymd中)。

  • 您可以使用 .ok() 检查这是否导致了有效日期.如果它是无效日期,则意味着您溢出了 year_month_day 的天数字段.我在评论中看到,如果发生这种情况,您需要该月的最后一天。所以只需提取 yearmonth并使用 last重置 ymd到该年该月的最后一天。

  • 最后转换 ymd回到sys_days (time_pointdays 精度)并添加 time_of_day回到它。

结果是sys_seconds (time_pointseconds 精度)。

我刚刚用这个驱动程序运行了这个:

int
main()
{
using namespace date;
std::cout << currentTime() << '\n';
std::cout << oldDate(months{13}) << '\n';
}

输出是:

2016-12-17 15:57:52
2015-11-17 15:57:52

Convenience link to documentation.

关于c++ - 找出n个月前的确切日期和时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41198796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com