Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Matlab中使用DateTime或FileTime日期类型_Matlab - Fatal编程技术网

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

如何在Matlab中使用DateTime或FileTime日期类型,matlab,Matlab,我想解析/转换DateTime(或FileTime)数据类型,即int64,以100纳秒为单位的“滴答”为单位,将其转换为datenum或Matlab中更好的日期和时间格式 我必须使用一个高分辨率的64位计数器,因为时间戳之间的差异可能只有几微秒,而且“间隔”不均匀 使用最新的Matlab版本,“ticks”变量被读取为字符串 有什么建议吗 感谢您的帮助您可以使用一个简单的公式将数字转换为MATLAB的序列日期: step = 1e-7; % 100 nanosec ticks = int64(

我想解析/转换DateTime(或FileTime)数据类型,即int64,以100纳秒为单位的“滴答”为单位,将其转换为datenum或Matlab中更好的日期和时间格式

我必须使用一个高分辨率的64位计数器,因为时间戳之间的差异可能只有几微秒,而且“间隔”不均匀

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

有什么建议吗


感谢您的帮助

您可以使用一个简单的公式将数字转换为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);