隨筆-67  評(píng)論-522  文章-0  trackbacks-0
              在數(shù)字電視領(lǐng)域,時(shí)間使用的是MJD(修正儒略日),而不是Java中的UTC(協(xié)調(diào)世界時(shí)),而工作中又需要將機(jī)頂盒端的MJD日期轉(zhuǎn)化為UTC日期,本篇是大象關(guān)于轉(zhuǎn)換的一點(diǎn)記錄。
              業(yè)務(wù)場(chǎng)景是這樣的,機(jī)頂盒通過TCP協(xié)議發(fā)送過來一串?dāng)?shù)據(jù)流,其中有一些其它數(shù)據(jù),這個(gè)不管,在這其中有5個(gè)字節(jié)的日期(MJD)和時(shí)間(BCD),日期占2字節(jié)(年月日),時(shí)間是3字節(jié)(時(shí)、分、秒,每一個(gè)占1字節(jié))。
              接收這些數(shù)據(jù)用的是byte[]數(shù)組,因此主要工作就是要將這些字節(jié)數(shù)據(jù)轉(zhuǎn)換成整形數(shù)據(jù)再進(jìn)行處理,由于Javaint類型占4個(gè)字節(jié),而MJD日期是用2字節(jié)表示,也就是說,要將2字節(jié)的byte[]轉(zhuǎn)換成16位的int值,所以要先寫一個(gè)轉(zhuǎn)換方法。
              /**
               * 將長(zhǎng)度為2byte數(shù)組轉(zhuǎn)換為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是長(zhǎng)度2的數(shù)組,b[0]是高位,所以要將它左移8位,變成高8位,然后再與低8位的b[1]相加就是轉(zhuǎn)換后的MJD值。處理BCD時(shí)間就簡(jiǎn)單了,每1個(gè)字節(jié)分別對(duì)應(yīng)時(shí)分秒。比如:
              int h = data[offset++];
              int mi = data[offset++];
              int s = data[offset++];
              offset是偏移量,有了這些數(shù)據(jù),接下來就可以轉(zhuǎn)換成UTC時(shí)間了,MJD轉(zhuǎn)年月日公式是現(xiàn)成的,請(qǐng)自行搜索。
              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();

              }

              本文為菠蘿大象原創(chuàng),如要轉(zhuǎn)載請(qǐng)注明出處。http://www.aygfsteel.com/bolo
          posted on 2015-05-20 17:08 菠蘿大象 閱讀(4756) 評(píng)論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 怀集县| 望江县| 科尔| 叙永县| 宁武县| 武邑县| 连平县| 衡南县| 阳高县| 安塞县| 大安市| 济宁市| 四子王旗| 宁陕县| 西贡区| 萍乡市| 遂川县| 普兰店市| 东丰县| 库伦旗| 天祝| 叙永县| 大田县| 通化县| 哈尔滨市| 岳西县| 江津市| 湖口县| 军事| 闽侯县| 工布江达县| 原平市| 南川市| 佛教| 宁乡县| 耿马| 北川| 江华| 图们市| 富裕县| 苏州市|