-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一起使用。