高精度日期和时间类






4.80/5 (16投票s)
2000年1月18日

291984

2318
一个高分辨率时间类,用于替代不使用MFC的COleDateTime。
概述
CHighTime
和 CHighTimeSpan
是两个用于替代 COleDateTime
和 COleDateTimeSpan
的类。它不使用 `double` 来存储日期,而是使用 64 位整数来存储日期和时间。其范围为 +/-29000 年,最小时间跨度为 0.1 微秒。
背景
众所周知,浮点数在小值方面的精度不是很好。我的经验表明,COleDateTime(Span)
无法正确处理 1 秒的时间和跨度。有时,我会得到:(2sec-1sec) != 1sec
... 这不是我想要的!
其次,COleDateTime
的分辨率只有 1 秒,而我需要更高的精度。CHighTime(Span)
的精度可达 0.1 微秒。我选择这个精度是因为内核中的 FILETIME
和 KeQuerySystemTime
函数使用此分辨率。奇怪的是,它们在 1601 年 1 月 1 日的时间为零。但我遵循该约定以方便集成。
最后,我需要在一个内核驱动程序中计算时间,而那里不允许使用浮点运算。在驱动程序中使用它之前,需要进行一些更改。所有 MFC 的使用也必须删除。我已经开始着手,但尚未完成。在一些尚未实现的小部分内容完成后,也应该可以在非 MFC 项目中使用这些类……见下文。
使用方法
使用 CHighTime(Span)
非常简单,类似于 COleDateTime(Span)
。在需要的地方包含 *CHighTime.h* 并创建一个 CHighTime
实例。有一些不同的构造函数。既有使用单独的日期/时间部分的构造函数,也有使用 COleDateTime
或 SYSTEMTIME
或 FILETIME
作为参数的构造函数。输出格式字符串与 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
来在驱动程序中使用这些类。
请随时向我发送有关这些类的任何建议。
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。