如何为JSON返回的字符串格式时间添加5小时?现有Java代码执行失败
解决Java时间增加5小时的问题
我来帮你一步步排查问题并搞定这个时间调整的需求!
首先,你的代码存在两个关键问题:
- 格式化字符串不匹配:你的输入时间格式是
"2019-07-19 12:10:56"(用-分隔日期),但你创建SimpleDateFormat时用的是"yyyy/MM/dd HH:mm:ss"(用/分隔),这会直接导致解析失败,根本得不到正确的Date对象。 - Date对象不可变,修改方式错误:你修改了
formatter内部的Calendar,但并没有把修改后的时间同步到已有的date1——因为Date是不可变对象,一旦创建就无法修改,必须通过Calendar生成新的Date。
方案1:修正你原有的SimpleDateFormat写法
如果你坚持用旧的日期API,可以这样调整代码:
String time = message_object.get("date").toString(); // 注意这里的格式要和输入字符串完全匹配! SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Date date1 = formatter.parse(time); // 创建Calendar实例并设置为解析后的时间 Calendar calendar = Calendar.getInstance(); calendar.setTime(date1); // 添加5小时,推荐用HOUR_OF_DAY避免12小时制的坑 calendar.add(Calendar.HOUR_OF_DAY, 5); // 获取修改后的时间对象 Date updatedDate = calendar.getTime(); // 转成字符串输出(如果需要) String updatedTime = formatter.format(updatedDate); Log.i("UpdatedTime", updatedTime); } catch (ParseException e) { // 处理解析失败的情况,比如输入格式错误 e.printStackTrace(); }
方案2:推荐使用Java 8+的新时间API(更安全可靠)
SimpleDateFormat是线程不安全的,而且API设计比较繁琐,Java 8之后推出的java.time包(JSR-310)更简洁直观,还能避免很多旧API的坑:
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; String time = message_object.get("date").toString(); // 定义匹配输入格式的格式化器 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 解析成LocalDateTime对象 LocalDateTime dateTime = LocalDateTime.parse(time, formatter); // 直接添加5小时,返回一个新的不可变对象 LocalDateTime updatedDateTime = dateTime.plusHours(5); // 转成字符串输出 String updatedTime = updatedDateTime.format(formatter); Log.i("UpdatedTime", updatedTime);
这个新API逻辑清晰,线程安全,还能减少异常处理的麻烦,推荐优先使用。
内容的提问来源于stack exchange,提问作者Syed Arsalan Hussain
相关产品推荐
相关产品推荐

