gpt4 book ai didi

c++ - mktime() 给出的结果与 Howard Hinnant 的日期库(基于 std::chrono)不同

转载 作者:搜寻专家 更新时间:2023-10-31 02:11:48 27 4
gpt4 key购买 nike

我正在使用 Howard Hinnant 的日期 C++ 库 ( https://howardhinnant.github.io/date/date.html ),但我在使用它时遇到了一些困惑。下面是一个程序,我使用这个库打印 2017 年 11 月第三个星期五的年月日。 date::year_month_weekday 类,当与 date::sys_days( ),显示正确的日期(2017 年 11 月 17 日),但是当我使用 std::chrono::system_clock::to_time_t 将其转换为 struct tm 时,这个tm中存储的结果变成了2017年11月16日。我测试了其他情况,似乎struct tm总是从date::year_month_weekday转换而来落后一天。我错过了程序中的某些内容吗?程序如下,编译需要C++ 11。

#include <iostream>
#include <chrono>
#include <sys/time.h>
#include "date.h"

using namespace std;
using namespace std::chrono;
using namespace date;

int main(int argc, char *argv[]) {
date::year y(2017);
date::month m(11);
date::weekday wd((unsigned)5);
date::weekday_indexed wi(wd,3);
date::year_month_weekday dmwd(y, m, wi);
std::cout << date::sys_days(dmwd) << std::endl; //prints 2017-11-17, which is the 3rd Friday of Nov 2017

time_t tt = std::chrono::system_clock::to_time_t(date::sys_days(dmwd));
struct tm tm1;
localtime_r(&tt, &tm1);
std::cout << "tm1.tm_year = " << tm1.tm_year << std::endl;
std::cout << "tm1.tm_mon = " << tm1.tm_mon << std::endl;
std::cout << "tm1.tm_mday = " << tm1.tm_mday << std::endl; //prints 16 instead of 17, one day behind. tm.mday is from 1 to 31.

return 0;
}

这个程序的输出如下

2017-11-17
tm1.tm_year = 117 <-- 117+1900=2017
tm1.tm_mon = 10 <-- tm_mon starts form 0, so 10 means November
tm1.tm_mday = 16 <-- tm_mday starts from 1, so 16 is the 16-th day in a month

最佳答案

Howard Hinnant's date.h轨道 Unix Time出于大多数实际目的,它是 UTC。同样GitHub repository还有一个 timezone library如果您需要处理本地时间或 UTC 以外的任何时区。

是的,正如 Freddie Chopin 在评论中指出的那样,您看到了 localtime_r 的效果考虑到您计算机的本地时区。

您可以将一天中的任何时间添加到 sys_days你要的那个。 sys_daysstd::chrono::time_point , 但带有 days精确。所以一旦你有了 sys_days , 你实际上在 <chrono> 内现在库,而不是日期库:

system_clock::time_point t = date::sys_days(dmwd) + 6h + 53min + 4s + 123us:

关于c++ - mktime() 给出的结果与 Howard Hinnant 的日期库(基于 std::chrono)不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43017997/

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