2014-10-28 270 views
2

我有一段时间为字符串格式在我的数据。任何人都可以帮助我在Matlab中将此日期转换为毫秒。转换时间为毫秒?

这是一个例子,日期看起来像'00:26:16:926',所以,这是0小时26分16秒和926毫秒。在这次转换之后,我需要的时间只有毫秒,例如1576926毫秒。先谢谢你。

回答

5

为什么不尝试使用datevec代替? datevec被设计用来处理各种时间和日期的字符串,它会解析字符串并为您提供有用的信息。没有必要使用regexp或以任何方式拆分您的字符串。下面是一个简单的例子:

[~,~,~,hours,minutes,seconds] = datevec('00:26:16:926', 'HH:MM:SS:FFF'); 
out = 1000*(3600*hours + 60*minutes + seconds); 

out = 

1576926 

在该格式中,的datevec输出将其分别输出的年,月,日,小时,分钟和秒的元素6矢量。毫秒分辨率将被添加到datevec的输出结果的第六个元素,因此,您只需将第四个元素转换为第六个元素为毫秒并将它们全部加起来,这就是上面所做的。如果你没有指定实际的一天,它只是默认为今年的1月1日......但我们并没有使用日期......我们只是想要时间!


datevec的优点在于它可以接受多个字符串,这样,你不只是局限于单一的输入。简单地把所有的字符串成一个单一的单元阵列,然后在下面的方式使用datevec:使用datevec转换和积

times = {'00:26:16:926','00:27:16:926', '00:28:16:926'}; 
[~,~,~,hours,minutes,seconds] = datevec(times, 'HH:MM:SS:FFF'); 
out = 1000*(3600*hours + 60*minutes + seconds); 

out = 

    1576926 
    1636926 
    1696926 
+0

由于像'0:26: 19:926'不会被接受。并不容易:)但是,'datevec'的+1 - 功能很好! – matheburg 2014-10-28 16:38:17

+0

@matheburg - 我想不是,但如果每个字符串遵循相同的格式,那么我不明白为什么我们不能使用它:)感谢upvote顺便说一句! – rayryeng 2014-10-28 16:38:58

+0

我们的答案都非常相似,所以我拼命寻找我的优势; P – matheburg 2014-10-28 16:41:50

1

假设你的日期字符串来以该格式一致,您可以用这样简单的东西:

test = '00:26:16:926'; 
H = str2num(test(1:2)); % hours 
M = str2num(test(4:5)); % minutes 
S = str2num(test(7:8)); % seconds 
MS = str2num(test(10:12)); % milliseconds 
totalMS = MS + 1000*S + 1000*60*M + 1000*60*60*H; 

输出:

1576926.00 
+0

那么,我是否需要使用for循环来将所有字符串日期应用于我的数据? – Ram 2014-10-28 16:31:58

+0

如果您想多次执行此过程,则可以使用循环。但是,最好定义一个函数,它将您的时间字符串作为输入,并将总的ms作为输出,然后在您的单元格数组中使用'cellfun'。 – 2014-10-28 18:02:52

5

一种解决方案可能是:

timeString = '00:26:16:926'; 
cellfun(@(x)str2num(x),regexp(timeString,':','split'))*[3600000;60000;1000;1] 

结果:

1576926 
+1

备注:''regexp(timeString,':','split')'可以在当前版本的Matlab中被'strsplit(timeString,':')替换' – matheburg 2014-10-28 16:25:15

+0

如何将这个应用到我的数据?当我尝试申请时,我得到了一些错误(错误使用str2num(第33行))。这是我做的'timeString = data.ESUTimestamp; cellutun(@(x)str2num(x),regexp(timeString,':','split'))* [3600000; 60000; 1000; 1]' ESUTimestamp是我的数据中的列,它的所有元素与我在问题中给出的示例格式相同。 – Ram 2014-10-28 16:29:11

+0

你确定'data.ESUTimestamp'是纯字符串吗?或者它是一个单元阵列?在这种情况下,您可以尝试如下所示:'yourCellData = data.ESUTimestamp; cellfun(@(timeString)cellfun(@(x)str2num(x),regexp(timeString,':','split'))* [3600000; 60000; 1000; 1],yourCellData) – matheburg 2014-10-28 16:35:03

0

,你可以在一个字符串转换与日期,甚至是矢量

a = ['00:26:16:926' ; '08:42:12:936'] 
datevec(a,'HH:MM:SS:FFF') * [0 0 0 3600e3 60e3 1e3]' 

ans = 

    1576926 
    31332936 
+0

看不出这与我的答案有什么不同,除了巧妙地使用点计算总和产品...更不用说你在解决(我)后将近5个月就回答了这个问题。 – rayryeng 2015-05-14 07:04:19