1

对于我的项目,我需要在 Simulink 中计算 TOW(每周时间)。我知道这可以通过将UTC时间转换为GPS时间来实现。

我在 Matlab 中编写了一个简单的 m 文件,它在 Matlab 中为我执行如下操作:

date_gps_int = 10000*y + 100*m + d
date_gps_str = int2str(date_gps_int)
date_gps_str_to_serial = datenum(date_gps_str,'yyyymmdd')
date_str_format = datestr(date_gps_str_to_serial,'dd-mmmm-yyyy')
Num_Days = daysact('06-jan-1980',date_str_format)
Num_Weeks = Num_Days/7
TOW = Num_Weeks - 1024

我的第一个意图是在 simulink 中使用它作为一个函数。但显然因为 'datenum' 和 'datestr' 这是不可能的,因为 simulink 不处理字符串。

现在我想知道是否有人可以帮助我解决这个问题。有没有办法在不使用那些预定义函数的情况下从 Matlab 中的 UTC 日期计算 TOW?

我还尝试编写一个算法来计算自“1980 年 1 月 6 日”以来的天数,然后通过将其除以 7 来计算周数。但由于我对闰年计算不是很熟悉,而且我真的不知道公式对于这些类型的计算,我的结果与真实的 TOW 不同。

如果有人可以帮助我,我将不胜感激。

4

1 回答 1

1

Matlab 处理了三种时间格式:格式化日期字符串 -datestr输出内容 -、串行日期 - 双精度标量、datenum输出内容 - 和日期向量(参见 参考资料datevec)。转换函数与这三个一起工作,将单个变量(年、月等)转换为日期的最方便的方法是构建一个日期向量[yyyy mm dd HH MM SS]

date_gps_str_to_serial = datenum([y m d 0 0 0]); % midnight on day y-m-d
date_Jan_6_1980 = datenum([1980 01 06 0 0 0]);   % midnight on Jan 6th, 1980
Num_Days = date_gps_str_to_serial - date_Jan_6_1980;

现在,当心闰秒...

GPS 时间是根据自 1980 年 1 月 6 日以来经过的时间计算得出的。取自那天以来经过的秒数,由卫星的原子钟测量,除以 (24*3600) 得到天数,余数为一天中的时间(从午夜开始的秒数)。

但是,有时,国际地球自转和参考系统服务会决定将一天的时间延长一秒钟,以适应地球自转的减慢。它可能每年发生两次,分别在 6 月 30 日或 12 月 31 日。GPS 时间的计算是错误的,因为它没有考虑到某些日子持续 86401 秒(因此除以 24*3600 不起作用)并且每次发生这种情况时都会相对于 UTC 提前 1 秒。自 1980 年 1 月 6 日以来已经有 18 天这样的日子,所以应该从 GPS 时间中减去18 秒来找到 UTC 时间。下一次可能添加闰秒是 2019 年 6 月。

于 2018-12-11T11:04:29.437 回答