3

我正在寻找帮助使用 MATLAB 从 UTC 时间到字符串的时间转换。

我正在尝试从 2010 年 10 月末收集的数据文件中提取时间。数据文件说它以 UTC 时间报告,并且该字段是以毫秒为单位的整数字符串值,大约为 3.02e11。我想将其转换为字符串,但遇到了一些麻烦。

我发现这些单位绝对是毫秒,所以我将其转换为天数以与 datenum 格式兼容。

如果数据是在 10 月底(比如 2010 年 10 月 31 日)收集的,那么我可以猜测我可能会得到什么样的数字。我认为 2001 年 1 月 1 日将是一个很好的时期,并计算了我可能得到的数字(以天为单位):

suspectedDate = datenum('October 31, 2010')
suspectedEpoch = datenum('January 1, 2001')

suspectedTimeInDays = suspectedDate - suspectedEpoch

结果为3590

但是,我的实际时间(以天为单位)得出以下代码

actualTime = 3.02e11
actualTimeInDays = 3.02e11/1000/24/3600

作为3495.4

这令人不安,因为差异仅为 94.6——不是一整年。这意味着文件的文档有误,或者时代接近 2001 年 4 月 1 日至 5 日:

calculatedEpoch = suspectedDate - actualTimeInDays
calculatedEpochStr = datestr(calculatedEpoch) 

或者,如果纪元是 2001 年 1 月 1 日,那么文件中的实际日期是从 7 月底开始。

ifEpochIsJanuaryDate = suspectedEpoch + actualTimeInDays
ifEpochIsJanuaryDateStr = datestr(ifEpochIsJanuaryDate) 

这是一种已知的 UTC 格式吗?任何人都可以就如何从 3.02e11 震级数获得 10 月日期提供建议吗?

4

2 回答 2

4

今天的 Unix 时间大约是 13e11,自 1970 年以来以毫秒为单位。

如果你的时间是~3e11,那么它可能是从 2000 年开始的。

>> time_unix = 1339116554872; % example time
>> time_reference = datenum('1970', 'yyyy'); 
>> time_matlab = time_reference + time_unix / 8.64e7;
>> time_matlab_string = datestr(time_matlab, 'yyyymmdd HH:MM:SS.FFF')

    time_matlab_string =

    20120608 00:49:14.872

笔记:

1)如果你的时间是2000年以后,把1970年改成2000年;

2)见matlab的时间定义。

3) 8.64e7 是一天中的毫秒数。

4) Matlab 不应用任何时区偏移,因此结果是相同的 UTC 时间。

5)后向变换示例:

>> matlab_time = now;
>> unix_time = round(8.64e7 * (matlab_time - datenum('1970', 'yyyy')))

unix_time =

             1339118367664
于 2012-06-07T22:06:52.747 回答
2

你不能只是编造你自己的时代。也datenum可以在几天内返回东西。因此,您与做数学的亲密关系只是一个巧合。

结果是

>> datenum('Jan-1-0000')

ans =

     1

>> datenum('Jan-1-0001')

ans =

   367

因此,自 0000 年 1 月 1 日以来,Matlab 应该会在几天内返回东西。(不是错字)

但是,我会仔细查看这个3.02e11数字并找出它的确切含义。我很确定它不是标准的 Unix UTC,它应该是自 January 1, 1970 以来的秒数。它太大了。它接近格林威治标准时间:11540 年 1 月 1 日星期一 08:53:20 UTC。

于 2012-06-07T18:01:36.557 回答