开发者

How to use DateTime or FileTime date types in Matlab

I would like to parse/convert DateTime (or FileTime) data type which is int64 and measured in "ticks" which are 100-nanoseconds units, to a datenum or a better date & time format in Matlab.

I must开发者_运维百科 use a counter with a high resolution 64bit as the difference between time stamps can be a couple of microseconds and the "spacing" isn't even.

Using latest Matlab version, the "ticks" variable is read as a string..

Any recommendations?

Thank you for your help


Datenums probably won't represent this effectively. They are doubles, an approximate type, with 1.0 = 1 day; the resolution limit for recent dates is about 10 microseconds. Also, the datenum related functions aren't written for high precision processing, and probably won't work well here.

>> datenum_precision = eps(now)
datenum_precision =
  1.1642e-010
>> millisecond = 1.0/(24*60*60*1000)
millisecond =
  1.1574e-008
>> 

You're probably better off creating your own class that wraps the "ticks" as uint64 and provides methods for converting to human-readable presentation (like datestr()), doing addition and subtraction, parsing the strings you're getting to the uint64 values, and so on. Something with an interface like this.

classdef filetime
    properties
        tick; % An array of uint64 ticks
    end
    methods (Static = true)
        out = parse(str); % Parse strings to @filetime
    end
    methods
        out = filetimestr(obj); % human-readable strings
        out = minus(a,b);
        out = plus(a,b);
        out = sort(obj);
        out = datenum(obj); % maybe a lossy conversion to datenum, for convenience
    end
end

You'll need R2010b to do arithmetic on 64-bit ints; older versions don't support it.

The tricky part would be if you wanted to do plots using the filetimetick objects; the Handle Graphics plots don't support user-defined objects.


You can convert your numbers to MATLAB's serial date with a simple equation:

step = 1e-7; % 100 nanosec
ticks = int64(250000);
timenum = double(ticks)*step/24/60/60;

First, for very large integer values converting to double might loose precision. If this is the case you probably better to stay with your numbers without converting to serial date.

Second, DATESTR/DATETICK functions support precision up to milliseconds. Try:

datestr(timenum,'HH:MM:SS.FFF')

So, think about it and please answer Andrew's comment - what do you need this conversion for?


D is a uint64 value of 100 ns since 01-01-1601, the result must be a datenum. This means days passed since 00-Jan-0000.

step = 100E-9; % 100 nanoseconds
step = step/(24*60*60); %fraction of a day
D = datenum('01-01-1601')+double(D)*step;
%D is now a datenum

Modern version using datetime (matlab >2014b)

%uint64 value of 100 ns since 01-01-1601
step = 100E-9; % 100 nanoseconds
step = step/(24*60*60); %fraction of a day
D = datetime('01-01-1601')+days(double(D)*step);

As mentioned above, both methods lose some of the accuracy that we had. In the case of datetimes this can probably be circumvented. It happens at double(D)*step because D is big for current dates. Many nanoseconds have passed since 1601. By converting D to a more recent offset one could get a more accurate conversion.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜