Android中比较两个时间值问题:判断开始时间是否早于结束时间
问题原因及解决方法
问题根源
你用的HH是24小时制的小时格式,它完全不识别AM/PM标记。不管输入是02:00 AM还是02:00 PM,HH都会把小时解析成02,导致两个Date对象的时间部分完全一致,date1.before(date2)自然返回false。
你尝试的HH:mm k、HH:mm a、HH:mm aa都犯了同一个错误:HH是24小时制格式,和AM/PM标记不兼容,解析时会直接忽略AM/PM的信息,最终两个时间被解析成同一个时刻。
正确解决方案
把格式符换成h:mm a:
h:12小时制的小时(1-12)a:专门识别上午/下午的标记(AM/PM)
修正后的代码如下:
public static boolean checkTimings(String startTime, String endTime) { String pattern = "h:mm a"; SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.US); try { Date date1 = sdf.parse(startTime); Date date2 = sdf.parse(endTime); Log.e("date 1 ", date1.toString()); Log.e("date 2 ", date2.toString()); if (date1.before(date2)) { System.out.println("time1 is before time2"); return true; } else { System.out.println("time1 is after time2"); return false; } } catch (ParseException e) { e.printStackTrace(); } return false; }
额外优化建议
SimpleDateFormat是线程不安全的类,多线程场景下容易出问题。如果你的项目用的是Java 8及以上版本,更推荐用java.time包下的新API,更安全且逻辑更清晰:
import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.Locale; public static boolean checkTimings(String startTime, String endTime) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("h:mm a", Locale.US); try { LocalTime time1 = LocalTime.parse(startTime, formatter); LocalTime time2 = LocalTime.parse(endTime, formatter); return time1.isBefore(time2); } catch (Exception e) { e.printStackTrace(); return false; } }
内容的提问来源于stack exchange,提问作者Manikandan Balakrishnan
相关产品推荐
相关产品推荐

