UTC时间到字符串转换

时间:2012-06-06 19:14:17

标签: matlab datetime time utc

我正在寻找帮助使用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

as 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月日期的建议吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

你不能只是弥补自己的时代。同样datenum会在几天内返回内容。所以你在数学上的亲密关系只是巧合。

原来那个

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

ans =

     1

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

ans =

   367

因此,自从0000年1月1日起,Matlab应该在几天之内回复。(不是拼写错误)

但是,我会仔细查看这个3.02e11号码并找出它的确切含义。我很确定它不是标准的Unix UTC,应该是seconds since January 1, 1970。这太大了。它接近GMT:星期一,1月1日11540 08:53:20 UTC。