Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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++;11以毫秒为单位的实际系统时间_C++_Date_C++11_Time_Chrono - Fatal编程技术网

C++ C++;11以毫秒为单位的实际系统时间

C++ C++;11以毫秒为单位的实际系统时间,c++,date,c++11,time,chrono,C++,Date,C++11,Time,Chrono,我在获取实际系统时间(毫秒)时遇到问题。我找到的唯一一个好方法是在Windows.h,但我不能使用它。我应该使用std::chrono。我该怎么做 我花了很多时间在谷歌上搜索,但我只找到了第二精度的例子 我试着得到这样的字符串: [2014-11-25 22:15:38:449] std::chrono提供实用程序来表示时间点或两个时间点之间经过的持续时间。它允许您获取有关这些时间间隔的信息 它不提供任何日历信息。不幸的是,在这个时候,C++中没有工具。代码>boost::date\u tim

我在获取实际系统时间(毫秒)时遇到问题。我找到的唯一一个好方法是在
Windows.h
,但我不能使用它。我应该使用
std::chrono
。我该怎么做

我花了很多时间在谷歌上搜索,但我只找到了第二精度的例子

我试着得到这样的字符串:

[2014-11-25 22:15:38:449]

std::chrono
提供实用程序来表示时间点或两个时间点之间经过的持续时间。它允许您获取有关这些时间间隔的信息

它不提供任何日历信息。不幸的是,在这个时候,C++中没有工具。代码>boost::date\u time在这里可能会有所帮助。

使用以下代码:

#包括
#包括
#包括
模板
无效打印时间(tm t,持续时间分数){
使用名称空间std::chrono;
标准::printf(“[%04u-%02u-%02u%02u:%02u:%02u.%03u]\n”,t.tm\U年份+1900,
t、 周一+1,周日,小时,分钟,秒,
静态_-cast(分数/毫秒(1));
//VS2013的库有一个bug,可能需要您替换它
//“分数/毫秒(1)”和
//“持续时间(分数)。计数()”
}
int main(){
使用名称空间std;
使用名称空间std::chrono;
系统时钟::时间点现在=系统时钟::现在();
系统时钟::持续时间tp=now.time_自_epoch()起;
tp-=持续时间(tp);
时间=系统时钟::到时间(现在);
打印时间(*gmtime(&tt),tp);
打印时间(*本地时间(&tt),tp);
}
需要记住的一点是,计时器返回亚毫秒面值的值这一事实并不一定表明计时器具有亚毫秒分辨率。我认为Windows在VS2015中的实现可能最终会得到修复,但迄今为止,他们用于支持chrono实现的计时器对操作系统设置非常敏感,显示的分辨率不同,默认设置为16毫秒

此外,上面的代码假设UTC和您的本地时区都没有从
std::chrono::system_clock
的历元偏移分数秒值



使用Howard的日期函数来避免ctime的示例:

这个答案仍然使用了一些C API,但只在函数中使用,所以您可以忽略它:

template<typename T>
void print_time(std::chrono::time_point<T> time) {
    using namespace std;
    using namespace std::chrono;

    time_t curr_time = T::to_time_t(time);
    char sRep[100];
    strftime(sRep,sizeof(sRep),"%Y-%m-%d %H:%M:%S",localtime(&curr_time));

    typename T::duration since_epoch = time.time_since_epoch();
    seconds s = duration_cast<seconds>(since_epoch);
    since_epoch -= s;
    milliseconds milli = duration_cast<milliseconds>(since_epoch);

    cout << '[' << sRep << ":" << milli.count() << "]\n";
}
模板
无效打印时间(标准::计时::时间\u点时间){
使用名称空间std;
使用名称空间std::chrono;
time\u t curr\u time=t::to\u time\u t(时间);
char-sRep[100];
strftime(sRep,sizeof(sRep),%Y-%m-%d%H:%m:%S),localtime(&curr_-time));
typename T::duration since_epoch=time.time_since_epoch();
秒s=持续时间(从新纪元开始);
自_epoch-=s;
毫秒毫秒=持续时间\u投射(自\u纪元起);

有没有人注意到时间是以秒为单位的,而不是以秒为单位的

auto now = system_clock::now();
time_t secs = system_clock::to_time_t(now);
now {_MyDur={_MyRep=15107091978759765 } }
secs = 1510709198
所以当你在毫秒上加上

auto tse = now.time_since_epoch();
auto now_ms = duration_cast<milliseconds>(tse);
auto now_s = duration_cast<seconds>(tse);
auto jst_ms = now_ms - now_s;
DWORD msecs = jst_ms.count();
msecs = 875

没有用毫秒打印日期的标准方法。使用
std::chrono
我想你所能做的就是自己转换
时间点。你需要使用特定于平台的调用来获得毫秒精度。@ThomasMatthews我很确定,如果系统允许,chrono可以达到几微秒的精度ws-it。例如,尝试运行以下代码:您只需要从tp中减去秒数,因为它以秒为单位转换持续时间,而不管持续时间有多少。仅
seconds s s=duration\u cast(tp);tp-=s;
没错,其他值仅在“调试”代码中用于显示完整的持续时间。如果您不想在C API中跋涉,可以这样做:?我正在做一个类似这样的工作,并看到“如果std::time_t的精度较低,则该值是四舍五入还是截断是由实现定义的”。这意味着我们不知道是否可以只添加毫秒,因为to_time_t()的秒数可能再高一点。我说得对吗?@JayMiller是的,没错。我不确定大多数实现都做什么。你可能想继续使用Howard的日期函数来替换
to_time_t()<代码> >。如果我没有错,代码> >在Windows上不可用,因为<代码> STFTIME/<代码>是C++标准的一部分(在<代码> cTime/Cuff>)中,我怀疑它在Windows中可用。
auto tse = now.time_since_epoch();
auto now_ms = duration_cast<milliseconds>(tse);
auto now_s = duration_cast<seconds>(tse);
auto jst_ms = now_ms - now_s;
DWORD msecs = jst_ms.count();
msecs = 875
now_s {_MyRep=1510709197 }