2015-02-11 7 views
0

Этот код преобразует временную метку поставщика в формате hex (radix16) в Unix-время. Я знаю из документов Java, что SimpleDateFormat месяц с нулевым значением (Jan=0), однако при преобразовании с временной метки Unix в человекообразный формат с использованием строки формата ни месяц, ни день, ни время не верны (см. Результаты в комментарии ближе к концу).SimpleDateFormat - день, месяц, время неверно.

Ожидаемое:

Yr 2010 Mo 1 Da 4 Time 13513407 (03:45:13:407). 

Результаты:

HR:20100205_032123239. 

месяца является 02 вместо 01 (как и ожидалось), но день 05 вместо 04. Час (03) верен, но нет mins, secs и millis.

Я включил значение «текст» прохода, используемое для тестирования в комментариях.

public static long parseUnsignedHex(String text) { 
    // text = "07DA010400CE32BF" 
    long bsUnixTs = 0; 
    if (text.length() == 16) { 
     String bsYr = text.substring(1, 4); 
     String bsMo = text.substring(5,6); 
     String bsDa = text.substring(7,8); 
     String bsTime = text.substring(9,16); 
     try { 
      long bsYrL = Long.decode("0x" + bsYr); 
      long bsMoL = Long.decode("0x" + bsMo); 
      long bsDaL = Long.decode("0x" + bsDa); 
      long bsTimeL = Long.decode("0x" + bsTime); 
      Calendar bsCal = Calendar.getInstance(); 
      bsCal.set((int)bsYrL, (int)bsMoL, (int)bsDaL); 
      bsCal.setTimeInMillis(bsCal.getTimeInMillis() + bsTimeL); 
      bsUnixTs = bsCal.getTimeInMillis(); 
      System.out.printf("Yr %d Mo %d Da %d Time %d%n", bsYrL, bsMoL, bsDaL, bsTimeL); 
     } catch (NumberFormatException e) { 
      e.printStackTrace(); 
     } catch (Throwable e){ 
      e.printStackTrace(); 
     } 
    } 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmssSSS"); 
    // convert unix into yyyyMMdd_HHmmssSSS Human Readable (HR) format 
    String[][] arTimeString = new String[1][2]; 
    for(int i=0; i<arTimeString.length; i++){ 
     arTimeString[i][0] = Long.toString(bsUnixTs); 
     arTimeString[i][1] = sdf.format(bsUnixTs); 
     try { 
       System.out.format("Unix:" + arTimeString[i][0] + " HR:" + arTimeString[i][1]); 
       System.out.println(); 
       // result: 
       // SimpleDateFormat - month is zero-based 
       //     the day of month may be incremented because the time is 03:45:13:407 
       // Yr 2010 Mo 1 Da 4 Time 13513407 
       // Unix:1265358083239 HR:20100205_032123239 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
    return bsUnixTs; 
} 
+1

* «SimpleDateFormat основан на нулевом значении month (Jan = 0) "* - Я думаю, вы обнаружите, что относится к' Calendar' ... – MadProgrammer

+0

'Calendar # set' НЕ сбрасывает значения в часах, минутах или миллисекундах, когда вы добавляете 'bsTimeL', добавляете ли вы дополнительное время с момента создания« Календаря », не устанавливая время ... – MadProgrammer

ответ

1

В принципе, изменение ...

Calendar bsCal = Calendar.getInstance(); 
bsCal.set((int)bsYrL, (int)bsMoL, (int)bsDaL); 
bsCal.setTimeInMillis(bsCal.getTimeInMillis() + bsTimeL); 

Для

Calendar bsCal = Calendar.getInstance(); 
bsCal.set((int) bsYrL, (int) bsMoL - 1, (int) bsDaL, 0, 0); 
bsCal.set(Calendar.SECOND, 0); 
bsCal.set(Calendar.MILLISECOND, 0); 

Это приведет к выходу

Yr 2010 Mo 1 Da 4 Time 13513407 
Unix:1262537113407 HR:20100104_034513407 

Calendar использует 0 месяцев на основе, не SimpleDateFormat, а также, при использовании Calendar#set это будет влиять только те поля, которые поставляют, оставив hour, minute и second и millisconds неизменным с момента Calendar был создан (что снимок этого времени/значение даты)

Так что ваш исходный код делал, это захват моментальной копии текущей даты и времени, сброс значений года, месяца и дня, добавление дополнительного времени к времени CURRENT ...

+0

Да, после спящего режима, и до того, как я увидел ваш ответ, я также попробовал' \t 'bsCal .set ((int) bsYrL, (int) bsMoL, (int) bsDaL, 0,0,0); ', однако, мои миллисы все еще неправильны, поэтому я буду использовать вашу технику. Thx @MadProgrammer – robWDC

Смежные вопросы