Convert Matlab Datenum to Datetime



-I希望转换Matlab串行时间(datenum,如t_matlab=now)
到c# Datetime(如var t_cs = DateTime.Now.Ticks)。

你知道怎么做吗?

[编辑]我找到了一种方法,但仍然不确定这是否是最好的方法。
[Edit2]修正错误的日期时间,谢谢乔纳斯!

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;

编辑:对jarr的回答感到惊讶,我进一步调查了。原来sharhar_m在问题中给出的示例时间点是错误的(很抱歉之前没有检查)。

综上,问题给出的函数偏差367-281=86天,应更正为

function cstime = datenum2datetime( matlabSerialTime )
cstime = 10^7*60*60*24*(matlabSerialTime - 367);

现在进入细节,如果有人感兴趣:你声称

% {05-Feb-2011 11:19:15} in System。日期时间为634399319550000000

但在MATLAB R2010b

sdt =System.DateTime(634399319550000000); 
[sdt.Day sdt.Month]

返回[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]

得到[634325015550000000 634325044440000000]

时间单位缩放

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

参考时间点差异

以天表示的偏移量b (b/a)告诉你它们的"时间起源"相隔367天;用b的旧值计算,结果是281天。datestr状态的MATLAB文档

"一个连续的日期数字表示整数和小数天数从1月1日到特定日期。000年只是一个参考点和不打算是被解释为真实的年份。"

(即使运行datestr(0,'dd-mm-yyyy HH-MM-SS')显示参考点实际上是0-Jan-0000)。c#的刻度是

" 100纳秒间隔的个数从12:00:00开始午夜,0001年1月1日代表DateTime.MinValue。它不包括滴答的次数都归因于闰秒。"

综上所述,两个系统的"时间起源"相差一个闰年和一天,因此是367天。如果你真的想要处理那么久远的真实日期,你就必须考虑到格里高利历的改革和奥古斯都对8年前儒略历中闰年的错误应用的纠正……但我怀疑这对这里有什么意义;-)。

使用此命令将matlab串行日期号转换为System。DateTime蜱虫:

function datetimeticks = mt2dt(matlabserialtime) 
    datetimeticks = (matlabserialtime - 367)*86400/1e-7;  
end

和一个示例(Matlab):

mdt = datenum('8/6/1901 07:50:13');  
sdt = System.DateTime(mt2dt(mdt));
>> sdt.ToString
ans = 
8/6/1901 07:50:13

来自System的对应转换。DateTime to Matlab serial date number同样简单:

function matlabserialtime = dt2mt(datetimeticks)
    matlabserialtime = double(datetimeticks) * 1e-7/86400 + 367;
end

和一个示例(Matlab):

sdt = System.DateTime.Parse('8/6/1901 07:50:13');
mdt = datenum(dt2mt(sdt.Ticks));
>> datestr(mdt)
ans =
06-Aug-1901 07:50:13

注意,一旦从DateTime ticks转换为Matlab,您将失去DateTimeKind信息。
你可能想要保留它,并在以后与specifickind或DateTime一起使用。

相关内容

  • 没有找到相关文章

最新更新