隨筆-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.aygfsteel.com/bolo
          posted on 2015-05-20 17:08 菠蘿大象 閱讀(4749) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 万荣县| 长寿区| 崇文区| 保定市| 吐鲁番市| 泽州县| 平定县| 永福县| 乌鲁木齐县| 南和县| 周口市| 鄯善县| 抚顺市| 分宜县| 鲁山县| 昌江| 遵化市| 巴彦县| 吕梁市| 崇明县| 天台县| 宝坻区| 孙吴县| 涞水县| 屏山县| 江永县| 鹤庆县| 夏津县| 大丰市| 长武县| 卢氏县| 依安县| 黄平县| 喀喇沁旗| 陇西县| 长兴县| 雷波县| 瓦房店市| 南通市| 濮阳县| 越西县|