- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 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_days
是 std::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/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
C++20 计时类型/值之间有什么区别 month{7}和 months{7} ?有两个如此相似的名字是不是很困惑? 最佳答案 是的,同时拥有 month 可能会令人困惑。和 months第一次遇到这
在我的项目中,在我升级到 VS2015 之前,它编译得很好。现在我收到 10 个与 std::chrono::timepoint 有关的错误。这些都是错误:https://gyazo.com/0d3c
在 Linux 上运行(uname 说:) Linux 2.6.32-431.29.2.el6.x86_64 #1 SMP Sun Jul 27 15:55:46 EDT 2014 x86_64 x8
下面的代码不打印epoch。 typedef std::chrono::high_resolution_clock Clock; typedef std::chrono::milliseconds M
我有这个测试代码: #include #include #include namespace chrono = std::chrono; int main() { struct time
我正在使用 jmeter 和 maven 进行性能测试 (REST)。 在我的 pom 中,我有以下插件: chronos-jmeter-maven-plugin:执行我的 jmx 项目 chrono
我有一个 chrono::format::strftime 的静态数组我的应用程序支持的格式。我想避免在运行时解析它们,所以我定义了一个 lazy_static!将它们解析为 chrono::form
我正在尝试编写一个允许用户指定 chrono::duration 的函数,例如 chrono::seconds 并返回 chrono 的结果::duration::count. 我可以使用以下模板函数
考虑以下代码片段: #include #include int main() { auto result1 = std::chrono::duration_cast(std::chron
考虑下面这段代码 #include #include #include int main() { using std::chrono::system_clock; using std
boost::chrono::steady_clock::time_point 之间有什么区别?和 boost::chrono::time_point ,为什么不能相互转换? 这似乎非常多余。 最佳答
我正在尝试在 mingw64 (GCC v11.2) 中构建我的程序。我有以下结构: 在头文件中: struct Timer { std::chrono::time_point start;
有没有什么优雅的方法可以将 boost chrono time_point 转换为标准库中的等价物? 最佳答案 恐怕你不能保证转换,除非你先验地接受 boost::chrono::steady_clo
以下程序: #include #include #include inline uint64_t now() { return std::chrono::duration_cast
我有一个变量存储为 long 来自 std::chrono::system_clock::time_point.time_since_epoch().count() 的值。我现在想从 long 变量中
extern crate chrono; use chrono::{DateTime, Utc}; use std::time::Duration; pub fn after(start: DateT
我想在几秒钟内使用 chrono 库找出 2 个时钟之间的差异。我尝试了多种方法,以下是其中之一。所有这些都工作正常,直到差异为 59 秒,但之后超时。我真的需要差异的实际值,即使它超过 59 秒 #
我试图计算执行插入排序函数期间耗时。所以我做了如下。附言- 函数运行正常并对所有数字进行排序。编译器-GCC window auto start = chrono::steady_clock:
我有一个年 (int)、月 (int) 和日 (int) 形式的日期,例如,2018、10、12 表示 2018 年 10 月 12 日。 有没有一种方法可以使用带有这些整数的 C++ Chrono
我是一名优秀的程序员,十分优秀!