c++ - 解析日期字符串以从时间戳中删除小时、分钟和秒

标签 c++ date c++-chrono

假设我从网络服务器收到一个要解析的字符串。此字符串包含格式为 YYYY-MM-DD 的日期。 我想要的是将其转换为代表当天开始的时间戳,因此我不需要秒、分钟和小时。

作为一个虚拟示例,我试图提取当天的时间戳,一旦转换为 YYYY-MM-DD 格式。这是代码:

#include <chrono>                                                                                                                                                                                                                                                              
#include <iomanip>                                                                                                                                                                                                                                                             
#include <iostream>                                                                                                                                                                                                                                                            
#include <sstream>
int main()
{
    // Current time at GMT
    std::time_t now = std::time(0);
    std::tm *now_tm = std::gmtime(&now);
    std::ostringstream oss;
    // Extract yyyy-mm-dd = %F
    oss << std::put_time(now_tm, "%F");
    // Use oss to get a date without seconds from
    // current time at gmt
    std::tm tm;
    std::istringstream ss(oss.str());
    ss >> std::get_time(&tm, "%F");
    std::time_t current_date = std::mktime(&tm);
    std::cout << oss.str() << std::endl;
    std::cout << "cd: " << current_date << std::endl;
    return 0;
}

输出是:

2017-10-19
cd: 1908337984324104

提取的时间戳显然是错误的。使用%F格式解析2017-10-19字符串的问题在哪里?

最佳答案

通过使用 Howard Hinnant's, free, open-source, header-only chrono-extension library,您可以在不离开 chrono 类型系统安全的情况下执行此操作.

#include "date/date.h"
#include <iostream>

int
main()
{
    std::istringstream ss{"2017-10-19"};
    date::sys_seconds tp;
    ss >> date::parse("%F", tp);
    std::cout << date::format("%F\n", tp);
    using date::operator<<;
    std::cout << "cd: " << tp.time_since_epoch() << '\n';
}

date::sys_seconds 是一个 std::chrono::time_point,计算 Unix Time 中的 chrono::seconds .您可以使用 %F 直接解析它。您还可以使用相同的格式字符串 (%F) 对其进行格式化,还可以检查 chrono::seconds 的基础计数。该程序输出:

2017-10-19
cd: 1508371200s

关于c++ - 解析日期字符串以从时间戳中删除小时、分钟和秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46827276/

相关文章:

Javascript:将 UTC Date() 对象转换为本地时区

c++ - 转换运算符不适用于 sleep_until

c++ - 使用 VC141 将 high_resolution_clock::time_point 转换为 time_t

c# - 如何向窗口标题栏添加一个额外的按钮,以便它按标准工作?

c++ - OLE:多个 OLE 对象的共享 IStorage?

c++ - 设置和获取数据成员的成员函数操作

javascript - 以 MM/DD/YYYY 格式查找下一个最接近的日期 JavaScript

javascript - 如何禁用超过 3 天的记录的编辑按钮

c++ - QQuickWidget与C++交互

c++ - 是否确保 2 个连续的 std::chrono::steady_clock::now() 不相等?