将Matlab Datenum转换为Datetime

sha*_*r_m 5 c# matlab datetime

- 我希望将Matlab串行时间(datenum,如in t_matlab=now)转换
为c#Datetime(如var t_cs = DateTime.Now.Ticks).

知道怎么做吗?

[编辑]我找到了一种方法,但仍不确定这是否是最佳方式.
[Edit2]修正了错误的DateTimes,感谢Jonas!

function cstime = datenum2datetime( matlabSerialTime )
%Convert matlab serial time (datenum) to .net datenum.
%
%   Example:
%   ntTime = datenum2datetime(now)
%   cstime = datenum2datetime([734539.4717013890 734539.5051388888]);
%
%   See also datenum.

%   using System.DateTime.Parse(string).Ticks to convert to DateTime format.
%   t1 = now; t2 = now+1; matlab_times = [t1 t2];
%   cs_times = [System.DateTime.Parse(datestr(t1)).Ticks ...
%            System.DateTime.Parse(datestr(t2)).Ticks]
%   aver = diff(cs_times)/diff(matlab_times);
%   offver = cs_times(1) - matlab_times(1)*aver;

a = 10^7*60*60*24;
offset = -367*10^7*60*60*24;
cstime = a*matlabSerialTime + offset;
Run Code Online (Sandbox Code Playgroud)

Jon*_*erg 5

编辑:我对jarr的答案感到惊讶,我进一步调查.事实证明,问题中sharhar_m给出的示例时间点是错误的(抱歉没有检查更早).

总之,问题中给出的函数是367-281 = 86天,应该更正为

function cstime = datenum2datetime( matlabSerialTime )
cstime = 10^7*60*60*24*(matlabSerialTime - 367);
Run Code Online (Sandbox Code Playgroud)

现在谈谈细节,万一有人感兴趣:你声称

System.DateTime中的%{05-Feb-2011 11:19:15}是634399319550000000

但是在MATLAB R2010b中

sdt =System.DateTime(634399319550000000); 
[sdt.Day sdt.Month]
Run Code Online (Sandbox Code Playgroud)

返回[2 5],所以你的DateTime值实际上是5月2日,而不是2月5日!! 计算正确的值集

cs_times = [System.DateTime.Parse('05-Feb-2011 11:19:15').Ticks ...
            System.DateTime.Parse('05-Feb-2011 12:07:24').Ticks]
Run Code Online (Sandbox Code Playgroud)

这给了[634325015550000000 634325044440000000].

时间单位缩放

您的因子a是10 ^ 7*60*60*24即MATLAB存储在单元中的日期/时间"天"(以时间为小数天)和C#存储时间"滴答",即数的"10 ^ -7秒" .您可以通过输入精确值来避免一些舍入错误a.

参考时间点的差异

b以天(b/a)表示的偏移量告诉您它们的"时间起源"相隔367天; 你的旧价值b出现了281天.datestr状态的MATLAB文档

"序列日期编号表示从00年1月1日到特定日期的整数和分数天.0000年仅仅是一个参考点,并不打算被解释为真实年份."

(即使跑步datestr(0,'dd-mm-yyyy HH-MM-SS')显示参考点实际上是0-Jan-0000).C#ticks

"号码的自午夜12:00:00,0001年1月1,其表示DateTime.MinValue后已经过的100毫微秒的时间间隔,它不包括归因于闰秒蜱的数目."

总而言之,两个系统之间的"时间起源"相差一闰年和一天,因此为367天.如果你真的想对付真正的日期远远回来,你就必须把公历的改革和奥古斯都修正的闰年在不正确的应用程序儒略历一年8到帐户之前...但我怀疑这感兴趣的是这里;-).