我是靠谱客的博主 怡然飞机,最近开发中收集的这篇文章主要介绍C++ 时间,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

精确到秒的 std::time

为了获得系统当前时间,目前 C++ 标准库里面给出的方法是 std::time,它返回的结构体是 std::time_t。这个方法很方便很通用,但它有一些局限:

它是精确到秒的。如果您需要更高精度的时间,比如说您需要精确到毫秒,那么它不合适。
它表示从 Epoch (1970年1月1日00:00:00)到现在所经过的秒数。最初 std::time_t 的定义是 32 位的,因此它的时间最多能表示到 2038年1月19日 03:14:07 (GMT时间),再过 1 秒,std::time 的返回就会变成 1901年12月13日 20:45:52 (GMT时间)。这就是著名的 Year 2038 problem。话说 2038 年好像看起来也不太遥远了。
在某些系统上(比如说我现在正在使用的Windows 7 64位),std::time_t 的定义变成了 64 位。这样就暂时给这个函数从死刑改判成死缓了。std::time_t 的定义从 32 位改为 64 位只是延长了它所表示的时间范围,但并没有改变它的精度,依然是精确到秒。
下面给出示范程序:

// GetSystemTime.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <ctime>
#include <iostream>


#define BUF_SIZE 26

int _tmain(void)
{
    TCHAR buf[BUF_SIZE] = { 0 };
    errno_t err;
    std::time_t cur_time;

    /* Obtain current time as seconds elapsed since the Epoch. */
    cur_time = std::time(nullptr);

    if (cur_time == ((time_t)-1))
    {
        fprintf_s(stderr, "Failure to compute the current time.n");
        goto EXIT;
    }

    /* Convert to local time format. */
    err = _tctime_s(buf, BUF_SIZE, &cur_time);
    if (err != 0)
    {
        _tprintf_s(_T("Invalid Arguments for _wctime_s. Error Code: %dn"), err);
        goto EXIT;
    }

    _tprintf_s(_T("The local time is %sn"), buf);

EXIT:
    return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
执行结果: 这里写图片描述


精确到毫秒的 GetSystemTime / GetLocalTime

Windows SDK 中有两个精确到毫秒的获取当前时间的函数:

GetSystemTime:获取 UTC 时间。
GetLocalTime:获取当地时间。
这两个函数的返回都是:SYSTEMTIME 
这个结构体占用了 16 个字节,它的定义如下:

typedef struct _SYSTEMTIME {
  WORD wYear;
  WORD wMonth;
  WORD wDayOfWeek;
  WORD wDay;
  WORD wHour;
  WORD wMinute;
  WORD wSecond;
  WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
1
2
3
4
5
6
7
8
9
10
其中 wYear 表示的范围是:从 1601 到 30827。范围很广了,应该能用到天荒地老了。:-)

示范程序:

// GetSystemTime.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <Windows.h>

int _tmain(void)
{
    SYSTEMTIME utc_time = { 0 };
    SYSTEMTIME local_time = { 0 };

    GetSystemTime(&utc_time);
    GetLocalTime(&local_time);

    _tprintf(_T("The UTC time is t: %02d:%02d:%02d.%03dn"), utc_time.wHour, utc_time.wMinute, utc_time.wSecond, utc_time.wMilliseconds);
    _tprintf(_T("The local time ist: %02d:%02d:%02d.%03dn"), local_time.wHour, local_time.wMinute, local_time.wSecond, local_time.wMilliseconds);

    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
运行结果: 

这里写图片描述


精确到 100 纳秒的 GetSystemTimeAsFileTime

究竟能不能达到 100 纳秒的精确度呢?在 Windows SDK 中有一个结构体:FILETIME,它可以记录精度达到 100ns 的时间。用哪个函数得到这个值呢?可以用 GetSystemTimeAsFileTime。

但是,不要高兴得太早,虽然 FILETIME 能够达到如此高的精度,但是这个函数我连试都懒得试。为什么呢?因为 Windows 系统并不是一个实时操作系统(Windows Embedded Compact 2013 是一个实时系统),其时钟精度一般认为是 15 ~ 16 毫秒。

Windows Sysinternals 给我们提供了一个查看你使用的 Windows 系统的时钟分辨率的小工具:ClockRes v2.0。把它下载下来在控制台中执行,结果如下: 


看到了吧。死心了吧。

所以说,用 GetSystemTime / GetLocalTime 就已经很好了。

如果要获得真正毫秒级甚至更高精度的当前系统时间,必须跟 CPU 打交道,别无它法。
--------------------- 
作者:YapingXin 
来源:CSDN 
原文:https://blog.csdn.net/yapingxin/article/details/49466223 

https://blog.csdn.net/yapingxin/article/details/49466223
版权声明:本文为博主原创文章,转载请附上博文链接!

最后

以上就是怡然飞机为你收集整理的C++ 时间的全部内容,希望文章能够帮你解决C++ 时间所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部