Click here to Skip to main content
15,868,051 members
Articles / Programming Languages / Objective C

High Resolution Date and Time Class

Rate me:
Please Sign up or sign in to vote.
4.80/5 (17 votes)
24 Jan 2000 280.9K   2.3K   50   77
A high resolution time class that is a replacement for COleDateTime that does not use MFC.

Overview

The CHighTime and CHighTimeSpan are two classes for replacement of COleDateTime and COleDateTimeSpan. Instead of using a double for storing the date, it uses a 64 bit integer to store the date and time. The range is +/-29000 years and the smallest time span is 0.1 microseconds.

Background

As "everybody" knows, accuracy of floating point is not so good with small values. My experience says COleDateTime(Span) cannot handle 1 second time and spans correctly. Sometimes, I would get: (2sec-1sec) != 1sec ... This was not what I wanted!

Secondly, the resolution for COleDateTime is only 1 second and I needed better. CHighTime(Span) handles down to 0.1 microsecond. I choose this because FILETIME and the KeQuerySystemTime function in the kernel use this resolution. One strange thing is that they have zero time at January 1, 1601. But I follow that convention for easy integration.

Finally, I needed to calculate time in a kernel driver and there floating point maths not possible. There are some changes that are needed to be made before it is possible to use it in a driver. All MFC use must also be removed. I have started but haven't finished it. It should also be possible to use the classes in a non MFC project with some small not yet implemented parts... See below.

To Use

Using CHighTime(Span) is quite simple and similar to COleDateTime(Span). Include CHighTime.h where you need it and create an instance of CHighTime. There are some different constructors. Both with separate date/time parts and with COleDateTime or SYSTEMTIME or FILETIME as arguments. The output format string is the same as for COleDateTime(Span).Format and _tcsftime with additional codes for millisec(%s), microsec(%u), nanosec(%n).

CHighTimeSpan is also capable of handling "out of range" values, e.g. 30 hours = > 1 day + 6 hours

The constructors have milli, micro, nano default value 0 so it is possible to replace COleDateTime directly without any changes.

C++
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")
);

If you want to use the class in a MFC project, add #include "stdafx.h" before the include of hightime.h, in the hightime.cpp like this:

C++
#include "stdafx.h"
#include "hightime.h"

Things to Improve

  • Modify so a kerneldriver can use the classes. The string functions must be removed/changed. The only need for the CHighTime::Format function should be for trace. So why make that work for almost nothing....??? A additional #define could be used for using the classes in a driver.

Please feel free to send me any suggestions about these classes.

License

This article has no explicit license attached to it, but may contain usage terms in the article text or the download files themselves. If in doubt, please contact the author via the discussion board below.

A list of licenses authors might use can be found here.


Written By
Software Developer
Sweden Sweden
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralClasses are not to be sold for profit Pin
chunkeungyu20-May-10 8:57
chunkeungyu20-May-10 8:57 
GeneralRace condition in the const CHighTime& operator=(const time_t& timeSrc) method Pin
Orlin Hristoff4-Feb-09 3:17
Orlin Hristoff4-Feb-09 3:17 
GeneralRe: Race condition in the const CHighTime& operator=(const time_t& timeSrc) method Pin
rharding648-Jan-15 15:24
rharding648-Jan-15 15:24 
QuestionVS 2005 or VS 2008 Version Anyone? Pin
Paul Kissel10-Sep-08 22:20
Paul Kissel10-Sep-08 22:20 
AnswerRe: VS 2005 or VS 2008 Version Anyone? Pin
coder1234567896-Oct-08 0:40
coder1234567896-Oct-08 0:40 
GeneralRe: VS 2005 or VS 2008 Version Anyone? Pin
Kim Moung Soo5-Mar-10 20:25
Kim Moung Soo5-Mar-10 20:25 
GeneralGet total Milliseconds Pin
msurni13-Dec-07 19:28
msurni13-Dec-07 19:28 
GeneralMistake with milli/micro/nano Pin
abcdenis11-Jan-07 23:02
abcdenis11-Jan-07 23:02 
GeneralActual resolution much lower... Pin
Robert Bielik9-Jun-06 2:00
Robert Bielik9-Jun-06 2:00 
GeneralRe: Actual resolution much lower... Pin
fvds_sub26-Oct-06 5:29
fvds_sub26-Oct-06 5:29 
GeneralWEIRD: CHighTimeSpan::Format() does not take 1 arguments Pin
kd7osk21-Feb-06 9:11
kd7osk21-Feb-06 9:11 
QuestionIssue with subtraction bug? Pin
David White23-Dec-05 4:47
David White23-Dec-05 4:47 
Generalambiguous call Pin
EMTA4114-Oct-05 6:46
EMTA4114-Oct-05 6:46 
GeneralRe: ambiguous call Pin
craig.miller30-Jan-06 14:00
craig.miller30-Jan-06 14:00 
GeneralRe: ambiguous call Pin
kd7osk20-Feb-06 11:35
kd7osk20-Feb-06 11:35 
GeneralHightime for Visual C++ .NET 2003 Pin
abudiman25017225-Sep-05 21:38
abudiman25017225-Sep-05 21:38 
Generalwhy not just use CTime? its a 64bit Integer Pin
m00m0024-Aug-05 13:57
m00m0024-Aug-05 13:57 
GeneralRe: why not just use CTime? its a 64bit Integer Pin
Steve Mayfield24-Aug-05 14:16
Steve Mayfield24-Aug-05 14:16 
Generalgetting started Pin
Anonymous2-Feb-05 0:20
Anonymous2-Feb-05 0:20 
GeneralA bug in CHighTime::GetYear() when a year is negative Pin
holevel629-Feb-04 19:59
holevel629-Feb-04 19:59 
QuestionWhats about CFileTime? Pin
osy2-Feb-04 20:51
osy2-Feb-04 20:51 
AnswerRe: Whats about CFileTime? Pin
Pierre Couderc10-Nov-05 4:42
Pierre Couderc10-Nov-05 4:42 
AnswerRe: Whats about CFileTime? Pin
hulvey27-Jan-06 14:13
hulvey27-Jan-06 14:13 
GeneralYou do good work! Pin
devwat24-Jan-04 16:42
devwat24-Jan-04 16:42 
GeneralGeneral questin on .inl files Pin
dswigger11-Jan-04 5:09
dswigger11-Jan-04 5:09 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.