2016-07-15 1 views
1

У меня есть дата Json со смещением. Мне нужно преобразовать это в java.convert Json Date with Offset to java date

Edm.DateTime

"/Date(<ticks>["+" | "-" <offset>)/" 

<ticks> = number of milliseconds since midnight Jan 1, 1970 

<offset> = number of minutes to add or subtract 

Используя этот answer скопирована ниже, я в состоянии преобразовать эту дату в Java. Однако это не учитывает компонент смещения. Есть ли более простой способ разрешения смещения.

Date date = new Date(Long.parseLong(jsonDate.replaceAll(".*?(\\d+).*", "$1"))); 

Ниже приведены некоторые даты строковых, что я получаю в формате даты JSON

/Дата (1463667774000 + 0400)/

/Дата (1463667774000-5300)/

Программа и результат ниже

str = "/Date(1463667774000-9000)/"; 
    date = new Date(Long.parseLong(str.replaceAll(".*?(\\d+).*", "$1"))); 
    System.out.println("1st "+ date); 

     1st Thu May 19 19:52:54 IST 2016 

Может ли кто-нибудь помочь?

+0

Можете ли вы опубликовать несколько примеров фактических значений даты, которые у вас есть в вашем JSON? – Mena

+0

@Mena: Я обновил свой вопрос. pls check – mattymanme

ответ

1

Вот пример того, как анализировать ваши пользовательские даты.

// test value 
String[] jsonDates = {"/Date(1463667774000-9000)/","/Date(1463667774000)/", "/Date(1463667774000+0400)/"}; 
//       | preceded by "(" 
//       |  | group 1: timestamp 
//       |  | | optional group 2: "+" or "-" 
//       |  | |  | optional group 3 
//       |  | |  | (within group 2):  
//       |  | |  | minutes 
//       |  | |  |  | followed by ")" 
Pattern p = Pattern.compile("(?<=\\()(\\d+)(([-+])(\\d+))?(?=\\))"); 
for (String jsonDate: jsonDates) { 
    Matcher m = p.matcher(jsonDate); 
    // matching pattern... 
    if (m.find()) { 
     // found: parsing timstamp 
     long timestamp = Long.parseLong(m.group(1)); 
     Integer minutes = null; 
     Boolean addOrSubstract = null; 
     if (m.group(2) != null) { 
      // parsing sign 
      addOrSubstract = "+".equals(m.group(3)); 
      // parsing minutes 
      if (m.group(4) != null) { 
       minutes = Integer.parseInt(m.group(4)); 
      } 
     } 

     // initializing calendar 
     Calendar c = Calendar.getInstance(); 
     c.setTime(new Date(timestamp)); 
     // adding/removing minutes if parsed 
     if (minutes != null) { 
      c.add(
       Calendar.MINUTE, 
       addOrSubstract != null ? 
       (addOrSubstract ? minutes : -minutes) : 0 
      ); 
     } 
     Date date = c.getTime(); 
     System.out.println(date); 
    } 
    // not matched, different format 
    else { 
     // TODO error 
    } 
} 
+0

это не работает для дат в формате json date '/ Date (1463667774000) /'. Я добавил обработку для них в разделе else. Большое спасибо – mattymanme

+0

@mattymanme лучше обрабатывать в шаблоне и использовать условно. Позвольте мне попытаться отредактировать мой ответ – Mena

+0

Спасибо. Это было бы прекрасно. :) – mattymanme