如何解析从服务器收到的时间并设置为Android中的本地时间

时间:2018-04-04 09:38:23

标签: android android-recyclerview timezone android-volley

我正在使用Volley从Api获取数据。我正在以此格式2018-04-04T08:41:21.265185Z收到时间和日期。我想以RecyclerView格式将时间设置为本地时间格式8:41 PM
这是转换时间的代码

 SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
                            dateFormat.setTimeZone(TimeZone.getDefault());
                            try {
                                Date date=dateFormat.parse(bookingTime);
                                TimeZone zone=TimeZone.getDefault();
                                dateFormat.setTimeZone(zone);
                                finalTime=dateFormat.format(date);
                            } catch (ParseException e) {
                                e.printStackTrace();
                            }  

这是用于将转换时间设置为ReyclerView

的代码
JsonArrayRequest request = new JsonArrayRequest(Request.Method.GET, url, null, new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    try {

                        for (int i = 0; i < response.length(); i++) {
                            JSONObject object = response.getJSONObject(i);
                            final CurrentEntry entry = new CurrentEntry();
                            String id = object.getString("myid");
                            String Time=object.getString("time");
                            SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
                            dateFormat.setTimeZone(TimeZone.getDefault());
                            try {
                                Date date=dateFormat.parse(Time);
                                TimeZone zone=TimeZone.getDefault();
                                dateFormat.setTimeZone(zone);
                                finalTime=dateFormat.format(date);
                            } catch (ParseException e) {
                                e.printStackTrace();
                            }
                            JsonObjectRequest foodie_request = new JsonObjectRequest(Request.Method.GET, myurl, null, new Response.Listener<JSONObject>() {
                                @Override
                                public void onResponse(JSONObject response) {
                                    try {
                                        String fname = response.getString("fname");
                                        String lname = response.getString("lname");
                                        entry.setName(first_name + "\t" + last_name);
                                       // progressDialog.dismiss();
                                        adapter.notifyDataSetChanged();
                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                    }

                                }
                            }, new Response.ErrorListener() {
                                @Override
                                public void onErrorResponse(VolleyError error) {

                                }
                            }) 
                            };
                            AppController.getInstance().addToRequestQueue(foodie_request, foodie_data_req);
                            String no = object.getString("no");
                            String ptime = object.getString("pt");
                            entry.setP(people);
                            entry.setT(finalTime);
                            current.add(entry);

                                adapter = new CurrentStatusAdapter(current, getActivity().getApplicationContext());
                                recyclerView.setAdapter(adapter);
                        }  

如何转换和设置此时间?

2 个答案:

答案 0 :(得分:1)

我认为您的dateTime 2018-04-04T08:41:21.265185Z缺少TIMEZONE Z

格式 - yyyy-MM-dd'T'HH:mm:ss.SSSZ

输出 - 2001-07-04T12:08:56.235-0700

样本 -

try {
    DateFormat f = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ");
    Date d = f.parse("2018-04-04T08:41:21.265185");
    DateFormat date = new SimpleDateFormat("MM/dd/yyyy");
    DateFormat time = new SimpleDateFormat("hh:mm a");
    System.out.println("Date: " + date.format(d));
    System.out.println("Time: " + time.format(d));
} catch (Exception e) {
    e.printStackTrace();
}

参考 - See Examples SimpleDateFormat in this link

答案 1 :(得分:1)

java.time

    DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH);
    String bookingTimeString = "2018-04-04T08:41:21.265185Z";
    Instant bookingTime = Instant.parse(bookingTimeString);
    String finalTime = bookingTime.atZone(ZoneId.systemDefault()).format(timeFormatter);
    System.out.println(finalTime);

在我在欧洲/哥本哈根时区的电脑上打印出来:

  

上午10:41

所以时间已根据您的要求转换为我当地的时间。

我使用的是现代Java日期和时间API java.time。即使在Android上,即使java.time仅内置在新的Android设备上,也可以考虑丢掉过时的,臭名昭着的SimpleDateFormat和朋友。现代API使用起来非常好,并且在旧设备上也能很好地工作,详见下文。

来自Instant的{​​{1}}类解析您收到的字符串,而不使用任何明确的格式化程序。这是因为字符串是ISO 8601格式,现代类解析为默认格式的标准格式。鉴于Stack Overflow上关于日期时间格式模式字符串问题的问题数量,这似乎是一个相当大的优势。

问题:我可以在Android上使用java.time吗?

是的,java.time适用于较旧和较新的Android设备。它只需要至少Java 6

  • 在Java 8及更高版本和新的Android设备上,内置了现代API。
  • 在Java 6和7中获取ThreeTen Backport,新类的后端端口(适用于JSR 310的ThreeTen;请参阅底部的链接)。
  • On(较旧)Android使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保使用子包从java.time导入日期和时间类。

链接