Tre*_*key 53 c++ time templates c++11 c++-chrono
我已经创建了一个时间点,但我一直在努力将它打印到终端.
#include <iostream>
#include <chrono>
int main(){
//set time_point to current time
std::chrono::time_point<std::chrono::system_clock,std::chrono::nanoseconds> time_point;
time_point = std::chrono::system_clock::now();
//print the time
//...
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我可以在这里找到打印time_point的唯一文档:http://en.cppreference.com/w/cpp/chrono/time_point
但是,我甚至无法根据我的time_point创建time_t(如示例所示).
std::time_t now_c = std::chrono::system_clock::to_time_t(time_point); //does not compile
Run Code Online (Sandbox Code Playgroud)
错误:
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono: In instantiation of ‘constexpr std::chrono::time_point<_Clock, _Dur>::time_point(const std::chrono::time_point<_Clock, _Dur2>&) [with _Dur2 = std::chrono::duration<long int, std::ratio<1l, 1000000000l> >; _Clock = std::chrono::system_clock; _Dur = std::chrono::duration<long int, std::ratio<1l, 1000000l> >]’:
time.cpp:13:69: required from here
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:540:32: error: no matching function for call to ‘std::chrono::duration<long int, std::ratio<1l, 1000000l> >::duration(std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000000l> > >::duration)’
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:540:32: note: candidates are:
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:247:14: note: template<class _Rep2, class _Period2, class> constexpr std::chrono::duration::duration(const std::chrono::duration<_Rep2, _Period2>&)
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:247:14: note: template argument deduction/substitution failed:
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:243:46: error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:240:23: note: template<class _Rep2, class> constexpr std::chrono::duration::duration(const _Rep2&)
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:240:23: note: template argument deduction/substitution failed:
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:236:27: error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:234:12: note: constexpr std::chrono::duration<_Rep, _Period>::duration(const std::chrono::duration<_Rep, _Period>&) [with _Rep = long int; _Period = std::ratio<1l, 1000000l>]
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:234:12: note: no known conversion for argument 1 from ‘std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000000l> > >::duration {aka std::chrono::duration<long int, std::ratio<1l, 1000000000l> >}’ to ‘const std::chrono::duration<long int, std::ratio<1l, 1000000l> >&’
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:232:12: note: constexpr std::chrono::duration<_Rep, _Period>::duration() [with _Rep = long int; _Period = std::ratio<1l, 1000000l>]
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:232:12: note: candidate expects 0 arguments, 1 provided
Run Code Online (Sandbox Code Playgroud)
HC4*_*ica 51
(在这篇文章中,std::chrono::为了清楚起见,我将省略资格.我相信你知道他们去哪了.)
您的代码示例无法编译的原因是返回类型system_clock::now()与您尝试将其分配给(time_point<system_clock, nanoseconds>)的变量类型不匹配.
记录的返回值system_clock::now()是system_clock::time_point,它是一个typedef time_point<system_clock, system_clock::duration>.system_clock::duration是实现定义的,microseconds并且nanoseconds是常用的.看来你的实现使用了microseconds,所以返回类型system_clock::now()是time_point<system_clock, microseconds>.
time_point具有不同持续时间的s不可隐式地相互转换,因此您会收到编译器错误.
您可以使用明确转换具有不同持续时间的时间点time_point_cast,因此以下内容将在您的系统上进行编译:
time_point<system_clock, nanoseconds> time_point;
time_point = time_point_cast<nanoseconds>(system_clock::now());
Run Code Online (Sandbox Code Playgroud)
请注意,显式模板参数为time_point_cast目标持续时间类型,而不是目标time_point类型.时钟类型必须匹配a time_point_cast,因此指定整个time_point类型(在时钟类型和持续时间类型上模板化)将是多余的.
当然,在您的情况下,由于您只是想要打印时间点,因此不需要它具有任何特定的分辨率,因此您可以声明time_point与system_clock::now()返回的类型相同.一个简单的方法是使用system_clock::time_pointtypedef:
system_clock::time_point time_point;
time_point = system_clock::now(); // no time_point_cast needed
Run Code Online (Sandbox Code Playgroud)
由于这是C++ 11,您还可以使用auto:
auto time_point = system_clock::now();
Run Code Online (Sandbox Code Playgroud)
解决了这个编译错误,转换time_t工作正常:
std::time_t now_c = std::chrono::system_clock::to_time_t(time_point);
Run Code Online (Sandbox Code Playgroud)
现在您可以使用标准方法来显示time_t值,例如std::ctime或std::strftime.(正如Cassio Neri在对你的问题的评论中指出的那样,std::put_timeGCC尚未支持更多的C++ - y 功能).
Mat*_*son 15
此代码段可能会对您有所帮助:
#include <iostream>
#include <chrono>
#include <ctime>
template<typename Clock, typename Duration>
std::ostream &operator<<(std::ostream &stream,
const std::chrono::time_point<Clock, Duration> &time_point) {
const time_t time = Clock::to_time_t(time_point);
#if __GNUC__ > 4 || \
((__GNUC__ == 4) && __GNUC_MINOR__ > 8 && __GNUC_REVISION__ > 1)
// Maybe the put_time will be implemented later?
struct tm tm;
localtime_r(&time, &tm);
return stream << std::put_time(&tm, "%c"); // Print standard date&time
#else
char buffer[26];
ctime_r(&time, buffer);
buffer[24] = '\0'; // Removes the newline that is added
return stream << buffer;
#endif
}
int main() {
std::cout << std::chrono::system_clock::now() << std::endl;
// Wed May 22 14:17:03 2013
}
Run Code Online (Sandbox Code Playgroud)
Sha*_*our 11
这nanoseconds似乎是问题的一部分,看一下文档,我能够让它工作:
#include <iostream>
#include <chrono>
#include <ctime>
int main(){
//set time_point to current time
std::chrono::time_point<std::chrono::system_clock> time_point;
time_point = std::chrono::system_clock::now();
std::time_t ttp = std::chrono::system_clock::to_time_t(time_point);
std::cout << "time: " << std::ctime(&ttp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
虽然看起来std::chrono::microseconds效果还可以:
std::chrono::time_point<std::chrono::system_clock,std::chrono::microseconds> time_point;
Run Code Online (Sandbox Code Playgroud)
How*_*ant 11
更新旧问题的答案:
对于std::chrono::time_point<std::chrono::system_clock, some-duration>现在有,让你更好地控制第三方库.对于基于其他时钟的time_points,仍然没有比获得内部表示并将其打印出来更好的解决方案.
但是,对于system_clock使用此库,这很简单:
#include "date.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono;
std::cout << system_clock::now() << " UTC\n";
}
Run Code Online (Sandbox Code Playgroud)
只为我输出:
2016-07-19 03:21:01.910626 UTC
Run Code Online (Sandbox Code Playgroud)
这是当前的UTC日期和微秒精度的时间.如果您的平台system_clock::time_point具有纳秒精度,它将为您打印出纳秒精度.
对于与time_point<steady_clock>(不是time_point<system_clock>)一起工作的任何人:
#include <chrono>
#include <iostream>
template<std::intmax_t resolution>
std::ostream &operator<<(
std::ostream &stream,
const std::chrono::duration<
std::intmax_t,
std::ratio<std::intmax_t(1), resolution>
> &duration)
{
const std::intmax_t ticks = duration.count();
stream << (ticks / resolution) << '.';
std::intmax_t div = resolution;
std::intmax_t frac = ticks;
for (;;) {
frac %= div;
if (frac == 0) break;
div /= 10;
stream << frac / div;
}
return stream;
}
template<typename Clock, typename Duration>
std::ostream &operator<<(
std::ostream &stream,
const std::chrono::time_point<Clock, Duration> &timepoint)
{
Duration ago = timepoint.time_since_epoch();
return stream << ago;
}
int main(){
// print time_point
std::chrono::time_point<std::chrono::steady_clock> now =
std::chrono::steady_clock::now();
std::cout << now << "\n";
// print duration (such as the difference between 2 time_points)
std::chrono::steady_clock::duration age = now - now;
std::cout << age << "\n";
}
Run Code Online (Sandbox Code Playgroud)
十进制数字格式器不是最有效的,但不需要事先了解小数位数,如果您想resolution被模板化,这是不知道的,除非您可以为ceil(log10(resolution)).
| 归档时间: |
|
| 查看次数: |
60113 次 |
| 最近记录: |