如何在Java / Android中解析JSON日期时间

时间:2016-08-13 17:30:18

标签: java android json

我到处寻找,但我找不到任何关于在an​​droid中解析日期时间json对象的事情。

我正在尝试将此JSON 2016-08-12T20:07:59.518451转换为时间20:07,并将其格式化为正确的时区UTC / GMT +1小时。

我可以在javascript中完成,但我无法在Java / Android中正确使用它。

是否有一种方法可以为我处理此问题,还是需要使用正则表达式来获取正确的时间?

编辑:这是代码。 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);
    }
}

3 个答案:

答案 0 :(得分:3)

没有“JSON日期时间”。 JSON定义了very few data types

String→Instant→OffsetDateTime→LocalTime

如果输入字符串2016-08-12T20:07:59.518451表示UTC时刻,请附加Z(Zulu的缩写,表示UTC)。

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

然后解析为InstantInstant类代表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

如果您需要toString方法使用的ISO 8601格式以外的其他格式,请使用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和&amp; java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。

答案 1 :(得分:2)

你应该这样做:

  1. 那个json有一个键:val和日期,然后得到日期,(肯定在json中作为字符串)
  2. 然后将该字符串解析为Date。
  3. 使用SimpleDateFormatter并将重建日期格式化为您想要/需要的日期..

答案 2 :(得分:0)

您可以使用split方法分割日期和时间,并将其另外存储为两个变量.. 所以现在你有了日期和时间的分离值。