【问题标题】:Changing Date from JSON object before showing it on the screen在屏幕上显示之前从 JSON 对象更改日期
【发布时间】:2018-02-21 15:00:20
【问题描述】:

我有一个应用程序,它从JSON 文件中获取数据,("name","date","picture_url") 并在RecyclerView 上显示它,但是...日期是用 unix 编写的,所以我需要获取每个“日期”JSON 对象并将其值更改为正确的日期格式,然后再将其显示到屏幕上。

所以我写了类似的东西:

long dv = Long.valueOf(o.getString("date"))*1000;
Date df = new java.util.Date(dv);
String vv = new SimpleDateFormat("yyyy-MM").format(df);
o.getString("date").equals(vv);

在这个:

StringRequest stringRequest = new StringRequest(
            Request.Method.GET,
            URL_DATA,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    progressDialog.dismiss();
                            try {
                        JSONArray array = new JSONArray(response);

                        for(int i=0; i<array.length(); i++) {
                            JSONObject o = array.getJSONObject(i);
                            ListItem item = new ListItem(
                                    o.getString("name"),
                                    o.getString("date"),
                                    o.getString("picture_url"
                                    )
                            );
                            long dv = Long.valueOf(o.getString("date"))*1000;
                            Date df = new java.util.Date(dv);
                            String vv = new SimpleDateFormat("yyyy-MM").format(df);
                            o.getString("date").equals(vv);
                            listItems.add(item);
                        }
                        adapter = new MyAdapter(listItems, getApplicationContext());
                        recyclerView.setAdapter(adapter);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                }
            }
    );

但它不起作用。 SDK 没有显示任何错误,并且我提出了新的想法。 那么我如何才能在将“日期”显示到应用程序屏幕之前对其进行更改?

【问题讨论】:

  • 您收到的日期格式是什么?
  • 你在哪里把格式化的日期放回列表项?
  • 你能显示你从 api 得到的日期的响应吗?
  • 我想你可能误解了equals 方法的使用。它没有分配任何东西。
  • SimpleDateFormat 类早已过时并且出了名的麻烦。考虑将ThreeTenABP 添加到您的Android 项目中,以便您可以使用java.time, the modern Java date and time API 来代替。使用起来感觉好多了。

标签: java android json android-recyclerview


【解决方案1】:

要使用新的字符串表示修改原始的JSONObject,您应该使用put 方法:

    long dv = Long.valueOf(o.getString("date"));
    YearMonth ym = YearMonth.from(
            Instant.ofEpochSecond(dv).atZone(ZoneId.systemDefault()));
    o.put("date", ym.toString());

同时,这个 sn-p 演示了另一个变化:使用现代 Java 日期和时间 API java.time,而不是 DateSimpleDateFormat。这种改变对于工作来说不是必需的,但我推荐它。您使用的日期时间类早已过时,尤其是SimpleDateFormat 是出了名的麻烦。请注意,使用现代 API,您不需要显式格式化程序来获取像 2017-07 这样的字符串,因为 YearMonth.toString 会生成这样的字符串。此外,API 以秒为单位直接从 Unix 时间转换,因此您的读者不必想知道为什么要乘以 1000。

问题:我可以在我的 Java 版本中使用 java.time 吗?

是的,java.time 在 Android 设备上运行良好。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及新的 Android 设备上(据我所知,从 API 级别 26 开始)新的 API 是内置的。
  • 在 Java 6 和 7 中,获得 ThreeTen Backport,即新类的后向端口(JSR 310 的 ThreeTen,现代 API 首次被描述的地方)。
  • 在(较旧的)Android 上,使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。确保从包 org.threeten.bp 和子包中导入日期和时间类。

链接

【讨论】:

    【解决方案2】:

    使用这个方法:

    private static String getDate(long time) {
            Calendar cal = Calendar.getInstance(Locale.ENGLISH);
            cal.setTimeInMillis(time);
            return DateFormat.format("dd-MM-yyyy", cal).toString();
        }
    

    【讨论】:

    • 如果我需要当前时间就可以了,但是,我已经用 unix 编写了过去的日期(其中有很多不仅仅是一个),所以我需要把它们转换成进入正常日期。
    • bro ,使用这种方法来转换它们,例如 getDate(o.getString("date")) ;将返回带有日期格式的“日期”而不是 unix 时间戳
    【解决方案3】:

    你可以使用这个功能

    public String timestampToFormatedString(long timeStamp,String format ){
    
        Date date = new Date(timeStamp);
        DateFormat formatter = new SimpleDateFormat(format);
        return formatter.format(date);
    }
    

    最后

    String formatedDateString=timestampToFormatedString("dd-MM-yyyy",timeStamp);
    

    【讨论】:

      【解决方案4】:

      首先:你所有的答案都有我可以使用的好方法,但我没有要求方法,因为我有一个合适的方法。还是谢谢你的回答。

      我发现的最简单的解决方案是:

       for (int i = 0; i < array.length(); i++) {
                                  JSONObject o = array.getJSONObject(i);
                                  long dv = Long.valueOf(o.getString("date")) * 1000L;
                                  Date df = new java.util.Date(dv);
                                  String vv = new SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()).format(df);
                                  ListItem item = new ListItem(
                                          o.getString("name")
                                          , vv
                                          , o.getString("picture_url")
      
                                  );
                                  listItems.add(item);
      

      我的一小部分代码被误解了,所以我需要将这段代码放回几行并更改一行。

      【讨论】:

        猜你喜欢
        • 2019-11-20
        • 1970-01-01
        • 2015-06-11
        • 2020-01-08
        • 1970-01-01
        • 2020-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多