随笔-67  评论-522  文章-0  trackbacks-0
    在数字电视领域,时间使用的是MJD(修正儒略日),而不是Java中的UTC(协调世界时),而工作中又需要将机顶盒端的MJD日期转化为UTC日期,本篇是大象关于转换的一点记录。
    业务场景是这样的,机顶盒通过TCP协议发送过来一串数据流,其中有一些其它数据,这个不管,在这其中有5个字节的日期(MJD)和时间(BCD),日期占2字节(年月日),时间是3字节(时、分、秒,每一个占1字节)。
    接收这些数据用的是byte[]数组,因此主要工作就是要将这些字节数据转换成整形数据再进行处理,由于Javaint类型占4个字节,而MJD日期是用2字节表示,也就是说,要将2字节的byte[]转换成16位的int值,所以要先写一个转换方法。
    /**
     * 将长度为2byte数组转换为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
posted on 2015-05-20 17:08 菠萝大象 阅读(3917) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: