Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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
.net 比较datenum和18位时间戳_.net_Matlab_Datetime_Timestamp_Data Conversion - Fatal编程技术网

.net 比较datenum和18位时间戳

.net 比较datenum和18位时间戳,.net,matlab,datetime,timestamp,data-conversion,.net,Matlab,Datetime,Timestamp,Data Conversion,我打了两次,我想在几秒钟内知道它们的区别。两个时间戳都很接近 5-9-2012 17:42:01 小时内(7小时) 从信号1,我们有一个18位的时间戳(6.348246372197819e+17)。时间戳从0.0001年1月1日开始以100纳秒为单位计数。我猜是.NET times tamp(如果有人知道时间戳的具体名称,那就太好了)。(要从戳记查看timestr:) 从信号2我们有一个16位的时间戳(735117.446046926)。(我从MatlabDateNum中猜出序列日期号)。如果我

我打了两次,我想在几秒钟内知道它们的区别。两个时间戳都很接近

5-9-2012 17:42:01

小时内(7小时)

从信号1,我们有一个18位的时间戳(6.348246372197819e+17)。时间戳从0.0001年1月1日开始以100纳秒为单位计数。我猜是.NET times tamp(如果有人知道时间戳的具体名称,那就太好了)。(要从戳记查看timestr:)

从信号2我们有一个16位的时间戳(735117.446046926)。(我从MatlabDateNum中猜出序列日期号)。如果我没有弄错的话,Datenum是从0.JAN.0000开始的分数天

时间戳1可以通过乘以10^-7(100Ns分辨率)轻松转换为秒

时间戳2乘以24*3600进行转换,对吗?(哪个分辨率有datenum[10ms?]?相乘后,序列日期号是一个浮点数:63514147338.4544)

现在,问题是时间戳不会同时开始计数。我也没有关于18位时间戳(闰秒等)的信息。我试图通过从18位信号(顶部显示的日期)创建已知日期字符串的datenum时间戳来获得差异。然后我在秒级上减去了两者。差异为21427199.0218048

计算:

test=datenum('5-9-2012 17:42:01')% use date of 18 digit for datenum
test=test*24*3600                % convert to seconds
test-timestamp_18digits*10^(-7) 
现在的问题是,如果我将其添加到信号2 datenum时间戳中,并减去信号1 18digit*10^-7时间戳,我会得到10281617.4543686秒的巨大差异,而它应该是7小时+几秒

计算: `

有人提示我犯的错误吗

我已经试过很多了。感谢您的帮助。 先谢谢你

p、 我不能很快回答。请耐心点

TL;博士,因为我下面说得很详细。。。 现在,解释

我将分别处理每个日期时间的转换,并且以一种尽可能保持精度的方式,即使您不一定需要它,因为您正在处理两个日期时间之间以小时为单位的差异

这个 我马上注意到的一件事是,您的日期时间号码(
6.348246372197819e+17
)大大大于(
2^53
,或略大于
9e15
)。并非该值以上的每个整数都可以精确表示,因此,一旦开始存储大于双精度变量中的整数,您将开始看到由于舍入到最接近的可表示浮点数而导致的严重精度损失

由于您正在将数字转换为,这使我相信您正在将其存储为之前的其他内容(如默认内容),而其他内容则不起作用。您希望确保从一开始就将其定义为
int64
,如下所示:

TS_signal1 = int64(634824637219781900);
现在,比较.NET和(正如您所指出的)的一个关键问题是,它们都测量了不同参考时间点的不同数量:分别是
1-JAN-0001
以来的滴答声(以100纳秒为单位)和
0-JAN-0000
以来的小数天。我们需要考虑这个差异来比较这两个数字。一种方法是首先将时间添加到.NET datetime中,因为MATLAB datetime有一个较旧的参考时间,并且它对该时间的测量值要大得多

那么,我们应该增加多少时间?乍一看,只需减去参考时间(
1-JAN-0001
减去
0-JAN-0000
),我们建议将.NET datetime加上1年零1天,这样它就表示
0-JAN-0000
的刻度数。这很接近,但不完全正确。由于
0000
从技术上讲是闰年,因此它有额外的一天,因此实际上您必须在.NET datetime中添加1年2天的额外刻度。我们可以通过数学来实现这一点,或者我们可以使用该类和它的一些方法使其快速简单:

ticks1 = System.DateTime(TS_signal1).AddYears(1).AddDays(2).Ticks;
现在我们有了关于
0-JAN-0000
的刻度数。我们可以将其转换为秒以继续计算。但是,转换为秒需要将其更改为浮点表示(即,
double
),这将导致精度损失,因为我们的数字仍然很大。最好以刻度为单位继续计算

MATLAB MATLAB datetime是一个浮点值,表示为序列日期编号(
735117.446046926
),用于测量自
0-JAN-0000
以来经过的天数(分数)。为了与.NET datetime进行比较,我们需要将其转换为滴答声,因此我们应该按
24*3600*1e7
(即小时/天乘以秒/小时乘以滴答声/秒,滴答声为100纳秒)对其进行缩放。但这里有个问题。如果我们一次应用所有这些缩放,我们将再次使用一个太大而无法处理的整数覆盖
double
变量,从而导致精度损失。但我们不想将我们的
double
转换为
int64
,除非我们将其放大到足以得到一个整数值,否则我们可能会舍入分数信息

解决方案非常简单:尽可能多地应用缩放以获得仍然小于
2^53
的大整数,将其转换为
int64
,然后应用其余的缩放:

TS_signal2 = 735117.446046926;
ticks2 = int64(TS_signal2*1e9)*24*36;
把它们放在一起 现在,我们可以计算两个时间点之间的刻度(和秒)差:

dTicks = ticks1 - ticks2;          % Difference in ticks (100 nanoseconds)
dSeconds = double(dTicks)*(1e-7);  % Difference in seconds

dSeconds =
     2.518352378360000e+04
为了确认,我们将其转换为
hh:mm:ss
,并与日期字符串进行比较:

durSec = seconds(dSeconds);  % Convert to a duration...
durSec.Format = 'hh:mm:ss'   % ... and format it

durSec = 
  duration
   06:59:43

System.DateTime(TS_signal1).ToString  % Convert .NET datetime to a string

ans = 
9/5/2012 5:42:01 PM

datetime(TS_signal2, 'ConvertFrom', 'datenum')  % Convert MATLAB datenum to a datetime

ans = 
  datetime
   05-Sep-2012 10:42:18
我们可以看到,这两个时间实际上相差6小时59分43秒。我们本可以将日期时间数字转换为日期字符串,然后提取小时、分钟和秒,并进行一些数学运算以得到答案,但在这个过程中,我们会损失相当多的精度。在计算机中计算事物
TS_signal2 = 735117.446046926;
ticks2 = int64(TS_signal2*1e9)*24*36;
dTicks = ticks1 - ticks2;          % Difference in ticks (100 nanoseconds)
dSeconds = double(dTicks)*(1e-7);  % Difference in seconds

dSeconds =
     2.518352378360000e+04
durSec = seconds(dSeconds);  % Convert to a duration...
durSec.Format = 'hh:mm:ss'   % ... and format it

durSec = 
  duration
   06:59:43

System.DateTime(TS_signal1).ToString  % Convert .NET datetime to a string

ans = 
9/5/2012 5:42:01 PM

datetime(TS_signal2, 'ConvertFrom', 'datenum')  % Convert MATLAB datenum to a datetime

ans = 
  datetime
   05-Sep-2012 10:42:18