65.9K
CodeProject 正在变化。 阅读更多。
Home

高精度日期和时间类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (16投票s)

2000年1月18日

viewsIcon

291984

downloadIcon

2318

一个高分辨率时间类,用于替代不使用MFC的COleDateTime。

概述

CHighTimeCHighTimeSpan 是两个用于替代 COleDateTimeCOleDateTimeSpan 的类。它不使用 `double` 来存储日期,而是使用 64 位整数来存储日期和时间。其范围为 +/-29000 年,最小时间跨度为 0.1 微秒。

背景

众所周知,浮点数在小值方面的精度不是很好。我的经验表明,COleDateTime(Span) 无法正确处理 1 秒的时间和跨度。有时,我会得到:(2sec-1sec) != 1sec ... 这不是我想要的!

其次,COleDateTime 的分辨率只有 1 秒,而我需要更高的精度。CHighTime(Span) 的精度可达 0.1 微秒。我选择这个精度是因为内核中的 FILETIMEKeQuerySystemTime 函数使用此分辨率。奇怪的是,它们在 1601 年 1 月 1 日的时间为零。但我遵循该约定以方便集成。

最后,我需要在一个内核驱动程序中计算时间,而那里不允许使用浮点运算。在驱动程序中使用它之前,需要进行一些更改。所有 MFC 的使用也必须删除。我已经开始着手,但尚未完成。在一些尚未实现的小部分内容完成后,也应该可以在非 MFC 项目中使用这些类……见下文。

使用方法

使用 CHighTime(Span) 非常简单,类似于 COleDateTime(Span)。在需要的地方包含 *CHighTime.h* 并创建一个 CHighTime 实例。有一些不同的构造函数。既有使用单独的日期/时间部分的构造函数,也有使用 COleDateTimeSYSTEMTIMEFILETIME 作为参数的构造函数。输出格式字符串与 COleDateTime(Span).Format_tcsftime 相同,并增加了毫秒(%s)、微秒(%u)、纳秒(%n) 的附加代码。

CHighTimeSpan 也能够处理“超出范围”的值,例如 30 小时 = > 1 天 + 6 小时

构造函数具有毫秒、微秒、纳秒默认值 0,因此可以直接替换 COleDateTime 而不进行任何更改。

CHighTime PresentTime, SomeTime;
CHighTimeSpan TheLife, OneDay(1,0,0,0);
CString sText;
SYSTEMTIME systime;

PresentTime = CHighTime::GetPresentTime();
SomeTime = CHighTime(1968, 6, 8, 0, 2, 0);
TheLife = PresentTime - SomeTime;
sText = TheLife.Format(
    "I have lived %D days %H hours %M minutes %S seconds %s milliseconds\n"
);
AfxMessageBox(sText);
systime = CHighTime(2000,1,13, 14,07,10, 20, 40, 100);
SomeTime.SetDateTime(2000, 1, 13, 14, 25, 10);
sText.Format("The time now is %s\n", (LPCTSTR)PresentTime.Format("%H:%M:%S:%s"));
sText.Format(
    "The date tomorrow is %s\n",
    (LPCTSTR)(PresentTime+OneDay).Format("%Y:%m:%d")
);

如果要在 MFC 项目中使用该类,请在包含 *hightime.h* 之前,在 *hightime.cpp* 中添加 #include "stdafx.h",如下所示

#include "stdafx.h"
#include "hightime.h"

改进之处

  • 修改使其能够在内核驱动程序中使用这些类。必须删除/更改字符串函数。CHighTime::Format 函数仅用于跟踪。那么为什么几乎什么都不做也要让它工作呢……?可以使用额外的 #define 来在驱动程序中使用这些类。

请随时向我发送有关这些类的任何建议。

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.