Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以毫秒为单位将日期转换为时间,单位为c++;?_C++_Datetime_Boost_Posix - Fatal编程技术网

C++ 以毫秒为单位将日期转换为时间,单位为c++;?

C++ 以毫秒为单位将日期转换为时间,单位为c++;?,c++,datetime,boost,posix,C++,Datetime,Boost,Posix,我需要将日期时间格式的给定字符串从历元转换为毫秒。 在JavaScript中有日期到时间的转换API,但是在C++中我找不到任何东西。 输入看起来像“2016-Mar-15 09:23:58.665068” 输出应以毫秒为单位,例如14520000785 我试着研究boost,但仍然找不到(或不明白)该怎么做? 此外,通过谷歌我发现了另一种方法,即将毫秒转换为日期格式,但不是我所需要的,也不是任何有用的帖子 任何帮助都将不胜感激。最简单的方法是将其详细说明: auto pt = boost::l

我需要将日期时间格式的给定字符串从历元转换为毫秒。 在JavaScript中有日期到时间的转换API,但是在C++中我找不到任何东西。 输入看起来像“2016-Mar-15 09:23:58.665068”

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

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


任何帮助都将不胜感激。

最简单的方法是将其详细说明:

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

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

仅使用标准库功能:

#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;
}
#包括
#包括
#包括
int main()
{
std::tm={};
const char*snext=::strtime(“2016-Mar-15 09:23:58.665068”,%Y-%b-%d%H:%M:%S”,&tm);
自动时间点=std::chrono::系统时钟::from_time_t(std::mktime(&tm));
long long duration_ms=时间点时间自_epoch()/std::chrono::毫秒(1)+std::atof(snext)*1000.0f;

你能用POSIX函数吗?是的,否则他不能用Boost@YSC:因为我已经在使用boost,所以我想使用boost libs提供的api,但找不到任何这样的api,也找不到执行@jblixr:input格式可能重复的方法。当我使用您给定的代码时,它给我以下错误:2016-Mar-16 13:41:07.123639月天数值超出范围1..31您必须满足输入格式的要求-显然短月份名称不是默认值(至少在我们的系统上不是)。添加了Ahan!!我正要发布相同的内容。:)非常感谢您的解决方案。我的要求是以字符串格式获取给定日期的时间(毫秒)('2016-Mar-15 09:23:58.665068')不适用于从历元到现在的当前时间。我相信你的代码会给出从历元到现在的时间。我很好奇为什么我们的结果不匹配。它们应该正确吗?@sehe他们现在正确。等等。你必须手动计算分数秒数?这不是很优雅。它当然有效。系统时钟的历元保证是19700101吗?是这些吗未指定,至少不适用于所有(常用)chronoclocks@sehe我在POSIX函数中找不到可以解析分数秒的东西,所以是的:必须手动解析。这就是为什么Boost解决方案更好的原因。我不确定epoch是否指定为1970-01-01T00:00:00+00:00(我认为是),但我的解决方案并不依赖于它,所以谁在乎呢?
2016-Mar-15 09:23:58.665068 1458033838665
#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;
}