将长整型数组中的时间戳转换为标准日期格式
解决Android中时间戳转MM/DD/YYYY日期格式的问题
看起来你在处理API返回的毫秒级时间戳、转换为图表可用的日期格式时遇到了卡点,我来帮你梳理下可行的解决方案,顺便分析下你之前代码没生效的可能原因~
先明确核心问题
你拿到的时间戳是毫秒级(比如1523912075000),需要把它转换成MM/DD/YYYY格式的字符串。之前代码没生效,大概率是没正确处理时间戳的类型转换,或者没把格式化后的日期替换到数据集合里。
方案一:兼容全Android版本的SimpleDateFormat实现
如果你的App需要兼容API 26以下的设备,用SimpleDateFormat是最稳妥的选择,代码示例如下:
public void onResponse(String response){ Log.d(TAG, "Response: " + response); try { JSONObject jsonObject = new JSONObject(response); JSONArray jsonArray = jsonObject.getJSONArray("your_data_array"); // 替换成你API返回的数组键名 // 定义目标日期格式,注意dd是月份中的天数(不要写成DD,DD是年中的天数) SimpleDateFormat dateFormatter = new SimpleDateFormat("MM/dd/yyyy", Locale.US); List<String> formattedDateList = new ArrayList<>(); List<Double> valueList = new ArrayList<>(); // 存储对应的数值,用于图表 for (int i = 0; i < jsonArray.length(); i++) { JSONObject dataItem = jsonArray.getJSONObject(i); // 1. 取出毫秒级时间戳(必须转成long类型,不能用String) long timestamp = dataItem.getLong("timestamp_key"); // 替换成你API里的时间戳键名 // 2. 把时间戳转成Date对象,直接传入毫秒值即可 Date date = new Date(timestamp); // 3. 格式化为MM/DD/YYYY字符串 String formattedDate = dateFormatter.format(date); formattedDateList.add(formattedDate); // 同时取出对应的数值(根据你的API数据类型调整,比如int/float) double value = dataItem.getDouble("value_key"); // 替换成你API里的数值键名 valueList.add(value); } // 现在formattedDateList就是你需要的日期格式,直接传给图表组件即可 Log.d(TAG, "格式化后的日期列表: " + formattedDateList.toString()); } catch (JSONException e) { e.printStackTrace(); Log.e(TAG, "JSON解析错误: " + e.getMessage()); } }
方案二:API 26+推荐的DateTimeFormatter实现
如果你的App最低兼容版本是API 26及以上,更推荐用Java 8引入的java.time包下的类,线程更安全:
public void onResponse(String response){ Log.d(TAG, "Response: " + response); try { JSONObject jsonObject = new JSONObject(response); JSONArray jsonArray = jsonObject.getJSONArray("your_data_array"); DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy", Locale.US); List<String> formattedDateList = new ArrayList<>(); List<Double> valueList = new ArrayList<>(); for (int i = 0; i < jsonArray.length(); i++) { JSONObject dataItem = jsonArray.getJSONObject(i); long timestamp = dataItem.getLong("timestamp_key"); // 从毫秒时间戳转成LocalDate对象 LocalDate localDate = Instant.ofEpochMilli(timestamp) .atZone(ZoneId.systemDefault()) .toLocalDate(); // 格式化为目标字符串 String formattedDate = localDate.format(dateFormatter); formattedDateList.add(formattedDate); double value = dataItem.getDouble("value_key"); valueList.add(value); } Log.d(TAG, "格式化后的日期列表: " + formattedDateList.toString()); } catch (JSONException e) { e.printStackTrace(); Log.e(TAG, "JSON解析错误: " + e.getMessage()); } }
你之前代码没生效的可能原因
- 时间戳类型错误:把时间戳当成String取出,没有转成long类型,导致无法正确转换为Date
- 时间戳单位错误:如果API返回的是秒级时间戳(比如
1523912075),需要乘以1000再转Date:new Date(timestamp * 1000) - 格式字符串写错:用了
MM/DD/YYYY,其中DD是年中的天数,正确的月份天数应该是小写的dd - 没有存储格式化结果:转换后没有把新的日期字符串存到列表里,还是用了原来的时间戳数据
额外提示:图表库直接处理时间戳
如果你用的是MPAndroidChart这类图表库,也可以直接给X轴设置格式化器,不用提前转换整个数组:
XAxis xAxis = chart.getXAxis(); xAxis.setValueFormatter(new ValueFormatter() { private final SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy", Locale.US); @Override public String getFormattedValue(float value) { long timestamp = (long) value; return formatter.format(new Date(timestamp)); } });
内容的提问来源于stack exchange,提问作者nyjxrb30
相关产品推荐
相关产品推荐

