Click here to Skip to main content
Licence 
First Posted 17 Jan 2000
Views 187,390
Bookmarked 47 times

High resolution date and time class

By | 24 Jan 2000 | Article
A high resolution time class that is a replacement for COleDateTime that does not use MFC.
  • Download source files - 11 Kb
  • 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 that accuracy of floating point is not so good with small values. My experience says COleDateTime(Span) can not 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) handle 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 do before it is possible to use it in a driver. All MFC use must be also 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. eg. 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.

    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.

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

    Things to improve

    1. 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

    About the Author

    Håkan Still

    Software Developer

    Sweden Sweden

    Member



    Sign Up to vote   Poor Excellent
    Add a reason or comment to your vote: x
    Votes of 3 or less require a comment

    Comments and Discussions

     
    You must Sign In to use this message board. (secure sign-in)
     
    Search this forum  
     FAQ
        Noise  Layout  Per page   
      Refresh
    GeneralClasses are not to be sold for profit Pinmemberchunkeungyu8:57 20 May '10  
    GeneralRace condition in the const CHighTime& operator=(const time_t& timeSrc) method PinmemberMember 3211553:17 4 Feb '09  
    QuestionVS 2005 or VS 2008 Version Anyone? PinmemberPaul Kissel22:20 10 Sep '08  
    AnswerRe: VS 2005 or VS 2008 Version Anyone? Pinmembercoder1234567890:40 6 Oct '08  
    GeneralRe: VS 2005 or VS 2008 Version Anyone? PinmemberKim Moung Soo20:25 5 Mar '10  
    GeneralGet total Milliseconds Pinmembermsurni19:28 13 Dec '07  
    GeneralMistake with milli/micro/nano Pinmemberabcdenis23:02 11 Jan '07  
    GeneralActual resolution much lower... PinmemberRobert Bielik2:00 9 Jun '06  
    GeneralRe: Actual resolution much lower... Pinmemberfvds_sub5:29 26 Oct '06  
    GeneralWEIRD: CHighTimeSpan::Format() does not take 1 arguments Pinmemberkd7osk9:11 21 Feb '06  
    QuestionIssue with subtraction bug? PinmemberDavid White4:47 23 Dec '05  
    Generalambiguous call PinmemberEMTA416:46 14 Oct '05  
    Hello,
    please, could You help me. Ive tried tu use your great and usefull class in MFC MS V 2003.NET. I recieved following message:
     
    error C2668: 'abs' : ambiguous call to overloaded function
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\math.h(584): could be 'long double abs(long double)'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\math.h(536): or 'float abs(float)'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\math.h(530): or 'double abs(double)'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\math.h(528): or 'long abs(long)'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\stdlib.h(265): or 'int abs(int)'
    while trying to match the argument list '(UINT)'
     
    The problem was found in the part:
    iPos = szParse.Find(_T("%s"), 0);
    if (iPos >= 0) {
    szTemp.Format(_T("%01d"),abs(tmHighTimeTemp.nMilli)); // hd+++
    szParse.Replace(_T("%s"),szTemp);
    }
    iPos = szParse.Find(_T("%#s"), 0);
    for Milli, Micro and Nanoseconds.
    How could I repair it?
    Thank You very much.
    Emta

    GeneralRe: ambiguous call Pinmembercraig.miller14:00 30 Jan '06  
    GeneralRe: ambiguous call Pinmemberkd7osk11:35 20 Feb '06  
    GeneralHightime for Visual C++ .NET 2003 Pinmemberabudiman25017221:38 25 Sep '05  
    Generalwhy not just use CTime? its a 64bit Integer Pinmemberm00m0013:57 24 Aug '05  
    GeneralRe: why not just use CTime? its a 64bit Integer PinmemberSteve Mayfield14:16 24 Aug '05  
    Generalgetting started PinsussAnonymous0:20 2 Feb '05  
    GeneralA bug in CHighTime::GetYear() when a year is negative Pinmemberholevel619:59 29 Feb '04  
    QuestionWhats about CFileTime? Pinmemberosy20:51 2 Feb '04  
    AnswerRe: Whats about CFileTime? PinmemberPierre Couderc4:42 10 Nov '05  
    AnswerRe: Whats about CFileTime? Pinmemberhulvey14:13 27 Jan '06  
    GeneralYou do good work! Pinmemberdevwat16:42 24 Jan '04  
    GeneralGeneral questin on .inl files Pinmemberdswigger5:09 11 Jan '04  
    QuestionUpgrades ??? PinmemberJoeHeaton0:14 25 Jul '03  

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

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

    Permalink | Advertise | Privacy | Mobile
    Web02 | 2.5.120529.1 | Last Updated 25 Jan 2000
    Article Copyright 2000 by Håkan Still
    Everything else Copyright © CodeProject, 1999-2012
    Terms of Use
    Layout: fixed | fluid