2016-08-13 2 views
0

Я искал всюду, но я ничего не мог найти в синтаксическом анализе объекта json времени date в android.Как разобрать время JSON в Java/Android

Я пытаюсь преобразовать этот JSON 2016-08-12T20:07:59.518451 получить ТОЛЬКО время как этот 20:07 и отформатировать его в правильный часовой пояс UTC/GMT +1 час.

Я мог бы сделать это в javascript, но я не смог получить его прямо в Java/Android.

Есть ли метод, который обрабатывает это для меня или мне нужно будет использовать регулярное выражение, чтобы получить правильное время?

EDIT: вот код. expectedArrival - это тот, у кого есть дата/время json, и я хочу только получить время с часовым поясом UTC/GMT +1 час.

public class JSONTaskArrivals extends AsyncTask<String, String,List<ArrivalItem>> { 

    @Override 
    protected List<ArrivalItem> doInBackground(String... params) { 
     //json 
     HttpURLConnection connection = null; 
     BufferedReader reader = null; 

     try { 
      URL url = new URL(params[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 

      InputStream stream = connection.getInputStream(); 
      reader = new BufferedReader(new InputStreamReader(stream)); 
      StringBuffer buffer = new StringBuffer(); 
      String line = ""; 

      while((line = reader.readLine()) != null){ 
       buffer.append(line); 
      } 

      String finalJSON = buffer.toString(); 
      JSONArray parentArray = new JSONArray(finalJSON); 
      List<ArrivalItem> arrivalItems = new ArrayList<>(); 
      int time = 0; 
      for (int i = 0; i < parentArray.length(); i++){ 
       JSONObject finalObject = parentArray.getJSONObject(i); 

       ArrivalItem item = new ArrivalItem(); 
       item.setDestination(finalObject.getString("destinationName")); 
       item.setEstimated(finalObject.getString("expectedArrival")); 
       time = finalObject.getInt("timeToStation")/60; 
       if(time < 1){ 
        item.setLive("Due"); 
       }else{ 
        item.setLive(Integer.toString(time)+" mins"); 
       } 

       arrivalItems.add(item); 
      } 

      return arrivalItems; 


     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } finally { 
      if (connection != null){ 
       connection.disconnect(); 
      } 
      try { 
       if (reader != null){ 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(List<ArrivalItem> result) { 
     super.onPostExecute(result); 
     ArrivalsAdapter adapter = new ArrivalsAdapter(ArrivalsActivity.this, R.layout.arrivals_row, result); 
     lv = (ListView) findViewById(R.id.arrivals_listView); 
     lv.setAdapter(adapter); 
    } 
} 
+0

Вы можете попробовать сделать это вручную (например, если вы находитесь в Индии, добавьте 5 часов 30 минут к времени, которое вы получили, и прирастите соответствующую дату, если оно тоже изменится) –

+0

@HarshitKumar не помогло. Я хочу знать, как получить время от этого объекта времени JSON –

+0

http://stackoverflow.com/questions/2580925/simpledateformat-parsing-date-with-z-literal проверить это и http://stackoverflow.com/ вопросы/6543174/how-can-i-parse-utc-date-time-string-in-something-more-readable – user5599807

ответ

2

Вы должны сделать это:

  1. Это JSON имеет ключ: Вэл с датой, а затем получить дату, (его точно в JSON в качестве строки)
  2. затем разобрать, что Строка как дата.
  3. использовать SimpleDateFormatter и формат реконструированных дат должны быть представлены, как вы хотите/потребность ..
+1

Это правильный ответ, выглядит как формат 'yyyy-MM-ddTHH: mm: ss.fff' – nbokmans

0

Вы можете использовать метод разделения, чтобы разделить дату и время и сохранить его еще две переменные .. Так что теперь у вас есть seprate значения даты и времени.

3

Нет такой вещи, как «дата-время JSON». JSON определяет very few data types.

Строка → Instant → OffsetDateTime → LocalTime

Если входная строка 2016-08-12T20:07:59.518451 представляет момент в UTC, добавьте Z (сокращенно зулу означает UTC).

String input = "2016-08-12T20:07:59.518451" + "Z" ; 

Затем проанализировать как Instant. Класс Instant представляет собой момент на временной шкале в UTC с разрешением nanoseconds. Таким образом, ваш пример ввода с microseconds подходит хорошо.

Instant instant = Instant.parse(input); 

Настройте на желаемое смещение-от-UTC.

ZoneOffset offset = ZoneOffset.ofHours(1); // One hour ahead UTC. 

Оформить заявку на получение OffsetDateTime.

OffsetDateTime odt = instant.atOffset(offset); 

Если вы хотите только время-день из этого OffsetDateTime экстракта LocalTime.

LocalTime lt = odt.toLocalTime(); // Example: 20:39 

Если вы хотите, чтобы другие, чем формат ISO 8601 используется методом toString, используйте DateTimeFormatter объект. Многие примеры найдены, если вы выполняете поиск в Stack Overflow.

Лучше использовать часовой пояс, если он известен, а не просто смещение.Создает объект ZonedDateTime.

ZoneId zoneId = ZoneId.of("Europe/Paris"); 
ZonedDateTime zdt = instant.atZone(zoneId); 
LocalTime lt = zdt.toLocalTime(); 

О java.time

java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют старые неприятные классы времени, такие как java.util.Date, .Calendar, & java.text.SimpleDateFormat.

Проект Joda-Time, теперь в maintenance mode, советует перейти на java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений.

Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport и дополнительно выполнен с возможностью Android в ThreeTenABP.

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time.