如何在Matlab中使用DateTime或FileTime日期类型

时间:2010-11-01 14:48:24

标签: matlab

我想解析/转换DateTime(或FileTime)数据类型,该数据类型是int64,并以“百分比”(100纳秒单位)测量到datenum或更好的日期&时间格式在Matlab中。

我必须使用高分辨率64位的计数器,因为时间戳之间的差异可能是几微秒,而“间距”则不均匀。

使用最新的Matlab版本,“ticks”变量被读作字符串..

有什么建议吗?

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

Datenums可能不会有效地代表这一点。它们是双打,近似类型,1.0 = 1天;最近日期的分辨率限制约为10微秒。此外,datenum相关函数不是为高精度处理而编写的,在这里可能效果不佳。

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

你可能最好创建自己的类,将“ticks”包装为uint64,并提供转换为人类可读表示的方法(如datestr()),进行加法和减法,解析你得到的字符串到uint64值,依此类推。像这样的界面的东西。

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

你需要R2010b才能对64位整数进行算术运算;旧版本不支持它。

如果您想使用filetimetick对象进行绘图,那么棘手的部分就是如此; Handle Graphics图不支持用户定义的对象。

答案 1 :(得分:0)

您可以使用简单的公式将数字转换为MATLAB的序列日期:

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

首先,对于非常大的整数值,转换为double可能会导致精度松散。如果是这种情况,您可能最好继续使用您的数字而不转换为序列日期。

其次,DATESTR / DATETICK函数支持精度高达毫秒。尝试:

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

所以,请考虑一下,请回答安德鲁的评论 - 你需要这个转换什么?

答案 2 :(得分:0)

D是自01-01-1601以来100 ns的uint64值,结果必须是datenum。这意味着自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

使用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);

如上所述,这两种方法都失去了一些准确性。在日期时间的情况下,这可能被规避。它发生在double(D)*step,因为D对于当前日期很重要。自1601年以来已经过去了许多纳秒。通过将D转换为更新的偏移,可以获得更准确的转换。