如何将TS流中的mjdutc时间转换成标准utc时间

/

软硬件环境

  • ubuntu 16.04 64bit

前言

在EIT表中,有一个字段start_time来描述节目开始的时间,它是一个总共40bit的数值,包含以MJD和UTC表示的时间及日期。其中前16bit表示MJD日期,其余24bit按4bit BCD编码,表示6个数字。如下图所示

本文就来将它转换成标准UTC时间。

什么是MJD

百度百科的解释

儒略日(Julian day,JD)是指由公元前4713年1月1日,协调世界时中午12时开始所经过的天数,多为天文学家采用,用以作为天文学的单一历法,把不同历法的年表统一起来。如果计算相隔若干年的两个日期之间间隔的天数,利用儒略日就比较方便。

什么是UTC

协调世界时(英:Coordinated Universal Time ,法:Temps Universel Coordonné),又称世界统一时间,世界标准时间,国际协调时间。英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。

转换成UTC

以下是C语言的转换实现代码

  1. //这里的p_byte就是start_time时间
  2. struct tm tm;
  3. double mjd;
  4. int k = 0;
  5. memset(&tm, 0, sizeof(tm));
  6. mjd = (p_byte[0] << 8) | p_byte[1];
  7. tm.tm_year = (int) ((mjd - 15078.2) / 365.25);
  8. tm.tm_mon = (int) (((mjd - 14956.1) - (int) (tm.tm_year * 365.25)) / 30.6001);
  9. tm.tm_mday = (int) mjd - 14956 - (int) (tm.tm_year * 365.25) - (int) (tm.tm_mon * 30.6001);
  10. if ((tm.tm_mon == 14) || (tm.tm_mon == 15))
  11. k = 1;
  12. tm.tm_year += k;
  13. tm.tm_mon = tm.tm_mon - 2 - k * 12;
  14. /*
  15. * bcd码转化成int
  16. * */
  17. tm.tm_sec = p_byte[4]-(p_byte[4] >> 4)*6;
  18. tm.tm_min = p_byte[3]-(p_byte[3] >> 4)*6;
  19. tm.tm_hour = (p_byte[2]-(p_byte[2] >> 4)*6) + 8;
  20. p_tot->i_utc_time = mktime(&tm);

备注

如果是要计算北京时间,则需要在上述转换之后的基础上再加上8个小时,因为北京是处于东八区。

转载请注明作者和出处,并添加本页链接。
原文链接: http://xugaoxiang.com/post/66

给我留言