用Java实现MJD转UTC

用Java实现MJD转UTC
     在数字电视领域,时间使用的是 MJD (修正儒略日),而不是 Java 中的 UTC (协调世界时),而工作中又需要将机顶盒端的 MJD 日期转化为 UTC 日期,本篇是大象关于转换的一点记录。
     业务场景是这样的,机顶盒通过 TCP 协议发送过来一串数据流,其中有一些其它数据,这个不管,在这其中有 5 个字节的日期( MJD )和时间( BCD ),日期占 2 字节(年月日),时间是 3 字节(时、分、秒,每一个占 1 字节)。
     接收这些数据用的是 byte [] 数组,因此主要工作就是要将这些字节数据转换成整形数据再进行处理,由于 Java int 类型占 4 个字节,而 MJD 日期是用 2 字节表示,也就是说,要将 2 字节的 byte[] 转换成 16 位的 int 值,所以要先写一个转换方法。
     /**
     * 将长度为 2 byte 数组转换为 int
      */
     public static int bytes2ToInt( byte [] b) {
          int value = 0;
          for ( int i = 0; i < 2; i++) {
               int shift = (1 - i) * 8;
               value += (b[i] & 0xFF) << shift;
          }
          return value;
    }

     b 是长度 2 的数组, b[0] 是高位,所以要将它左移 8 位,变成高 8 位,然后再与低 8 位的 b[1] 相加就是转换后的 MJD 值。处理 BCD 时间就简单了,每 1 个字节分别对应时分秒。比如:
     int h = data[offset++];
     int mi = data[offset++];
    int s = data[offset++];
     offset 是偏移量,有了这些数据,接下来就可以转换成 UTC 时间了, MJD 转年月日公式是现成的,请自行搜索。
     public static Date mjd2Date( int mjd, int h, int mi, int s) {
          int y, m, d, k;
        y = ( int ) ((mjd - 15078.2) / 365.25);
        m = ( int ) ((mjd - 14956.1 - ( int ) (y * 365.25)) / 30.6001);
        d = ( int ) (mjd - 14956 - ( int ) (y * 365.25) - ( int ) (m * 30.6001));
          if (m == 14 || m == 15)
               k = 1;
          else
               k = 0;
          y = y + k;
          m = m - 1 - k * 12;
          Calendar c = GregorianCalendar. getInstance ();
          c.set(y + 1900, m - 1, d, h, mi, s);
          return c.getTime();

    }

     本文为菠萝大象原创,如要转载请注明出处。 http://www.blogjava.net/bolo

你可能感兴趣的:(用Java实现MJD转UTC)