【问题标题】:convert Date to time in millisecond in c++?在c ++中以毫秒为单位将日期转换为时间?
【发布时间】:2016-07-02 11:00:03
【问题描述】:

我有一个要求,我必须将日期时间格式的给定字符串转换为纪元的毫秒数。 在 Javascript 中有日期到时间转换 api,但在 c++ 中我找不到任何类似的东西。

输入看起来像“2016-Mar-15 09:23:58.665068”

输出应该以毫秒为单位,例如 14520000785。

我已尝试研究 boost,但仍然无法找到(或理解)该怎么做? 此外,通过谷歌,我发现了另一种方式,即将毫秒转换为日期格式,但不是我需要的,也不是任何有用的帖子。

任何帮助将不胜感激。

【问题讨论】:

  • 你会使用POSIX函数吗?
  • 是的。否则他无法使用 Boost
  • @YSC : 因为我已经在使用 boost,所以想使用 boost libs 提供的 api,但找不到任何这样的 api 或这样做的方法
  • @jblixr : 输入格式不同。

标签: c++ datetime boost posix


【解决方案1】:

仅使用标准库功能:

#include <ctime>
#include <chrono>
#include <iostream>

int main()
{
    std::tm tm = {};
    const char* snext = ::strptime("2016-Mar-15 09:23:58.665068", "%Y-%b-%d %H:%M:%S", &tm);
    auto time_point = std::chrono::system_clock::from_time_t(std::mktime(&tm));
    long long  duration_ms = time_point.time_since_epoch() / std::chrono::milliseconds(1) + std::atof(snext) * 1000.0f;
    std::cout << duration_ms << std::endl;
}

打印:1458033838665

请参阅 std::chrono::system_clock::nowstd::chrono::milliseconds

【讨论】:

  • 我的要求是以毫秒为单位获取字符串格式('2016-Mar-15 09:23:58.665068')的给定日期的时间,而不是从纪元开始的当前时间。我相信你的代码会从纪元到现在提供时间。
  • 我很好奇为什么我们的结果不匹配。他们应该对吗?
  • @sehe 他们现在这样做了。
  • 等等。您必须手动考虑小数秒吗?这不是很优雅。它当然有效。 system_clock 的epoch 是否保证为19700101? ISTR 没有指定,至少不是所有(常用)计时时钟
  • @sehe 我在 POSIX 函数中没有发现解析小数秒的任何内容,所以是的:必须手动解析它。这就是为什么 Boost 解决方案更好的原因。我不确定时代是否指定为 1970-01-01T00:00:00+00:00(我会说是),但我的解决方案并不依赖于它,所以谁在乎呢?跨度>
【解决方案2】:

最直接的方法就是把它拼出来:

auto pt = boost::lexical_cast<ptime>("2016-Mar-15 09:23:58.665068");
std::cout << (pt - ptime { {1970,0,0}, {} }).total_milliseconds();

Live On Coliru

#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/posix_time/posix_time_io.hpp>
#include <boost/date_time.hpp>
#include <sstream>

int main() {
    using boost::posix_time::ptime;

    ptime pt;
    { 
        std::istringstream iss("2016-Mar-15 09:23:58.665068");
        auto* f = new boost::posix_time::time_input_facet("%Y-%b-%d %H:%M:%S%f");

        std::locale loc(std::locale(""), f);
        iss.imbue(loc);
        iss >> pt;
    }

    std::cout << pt << " " << (pt - ptime{{1970,1,1},{}}).total_milliseconds();
}

打印

2016-Mar-15 09:23:58.665068 1458033838665

当然,在辅助函数中提取解析。保留区域设置以供重复使用等。

【讨论】:

  • 当我使用你给定的代码时,它给了我以下错误:2016-Mar-16 13:41:07.123639 Day of month value is out of range 1..31
  • 您必须满足输入格式 - 显然短月份名称不是默认值(至少在我们的系统上不是)。已添加a live sample
  • 阿汉!!我正要发布相同的。 :) 非常感谢您的解决方案。
猜你喜欢
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
相关资源
最近更新 更多