如何在Matlab中使用DateTime或FileTime日期类型
我想解析/转换DateTime(或FileTime)数据类型,即int64,以100纳秒为单位的“滴答”为单位,将其转换为datenum或Matlab中更好的日期和时间格式 我必须使用一个高分辨率的64位计数器,因为时间戳之间的差异可能只有几微秒,而且“间隔”不均匀 使用最新的Matlab版本,“ticks”变量被读取为字符串 有什么建议吗如何在Matlab中使用DateTime或FileTime日期类型,matlab,Matlab,我想解析/转换DateTime(或FileTime)数据类型,即int64,以100纳秒为单位的“滴答”为单位,将其转换为datenum或Matlab中更好的日期和时间格式 我必须使用一个高分辨率的64位计数器,因为时间戳之间的差异可能只有几微秒,而且“间隔”不均匀 使用最新的Matlab版本,“ticks”变量被读取为字符串 有什么建议吗 感谢您的帮助您可以使用一个简单的公式将数字转换为MATLAB的序列日期: step = 1e-7; % 100 nanosec ticks = int64(
感谢您的帮助您可以使用一个简单的公式将数字转换为MATLAB的序列日期:
step = 1e-7; % 100 nanosec
ticks = int64(250000);
timenum = double(ticks)*step/24/60/60;
首先,对于非常大的整数值,转换为双精度可能会降低精度。如果是这样的话,你最好不要转换成序列号,而是继续使用你的号码
其次,DATESTR/DATETICK函数支持高达毫秒的精度。尝试:
datestr(timenum,'HH:MM:SS.FFF')
所以,想一想,请回答Andrew的评论-您需要这种转换做什么?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对象进行绘图;句柄图形打印不支持用户定义的对象。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
使用日期时间的现代版本(matlab>2014b)
如上所述,这两种方法都失去了我们所拥有的一些准确性。在datetimes的情况下,这可能是可以避免的。它发生在
double(D)*步骤
中,因为D对于当前日期来说很大。自1601年以来,许多纳秒已经过去了。通过将D转换为最近的偏移量,可以获得更精确的转换。在Matlab中,这些值需要什么功能和操作?加法/减法、绘图、数据交换等。。。?你从哪里读到了返回字符串的数据?一个文件,db表,win32 API调用,…?最后我想画一个图,其中日期和时间是X轴,一些数据(float32)是Y轴。数据可能高达250000点(可能约20000点)。我不需要加减日期,只需要绘图。我正在从一个文本文件中读取数据,该文件以前是通过向文件中写入一个日期时间变量(非常类似于Unix FileTime)生成的。对于打印,您可以始终使用刻度本身,然后在类中使用toString
方法来设置轴的xticklabel
。@Jonas:这还是有点麻烦。plot函数在内部将uint64值转换为双精度,因此存在舍入误差。可能会在显示中引入错误的点位置或标签等,或使XTick值映射回FILETIME以进行字符串转换变得复杂。如果这些是Win32文件时间,则最近日期的舍入错误大约为16个刻度,这对于OP的用例非常重要。
%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);