安卓开发:如何根据EditText的日期时间值创建Calendar实例?
解决从日期时间EditText创建Calendar实例的问题
嘿,这事儿其实挺简单的,我给你一步步拆解怎么做,分两种适配场景来给你示例:
方法一:兼容Android API 26以下(用SimpleDateFormat)
这种方式适配性广,适合大部分存量项目:
- 先获取两个EditText里的文本内容:
// 获取日期EditText的字符串 String dateText = yourDateEditText.getText().toString().trim(); // 获取时间EditText的字符串 String timeText = yourTimeEditText.getText().toString().trim();
- 创建对应格式的日期时间解析器,重点注意:格式要和你日期选择器输出的格式完全匹配:
- 你给的日期是
01/03/2018,如果是「日/月/年」的逻辑,就用"dd/MM/yyyy";如果是「月/日/年」,就得改成"MM/dd/yyyy",别搞混了! - 时间是
12:50,用"HH:mm"适配24小时制;要是你的时间选择器是12小时制带AM/PM标识,就得改成"hh:mm a"
- 你给的日期是
SimpleDateFormat dateFormatter = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()); SimpleDateFormat timeFormatter = new SimpleDateFormat("HH:mm", Locale.getDefault()); Date parsedDate = null; Date parsedTime = null; try { // 解析日期字符串 parsedDate = dateFormatter.parse(dateText); // 解析时间字符串 parsedTime = timeFormatter.parse(timeText); } catch (ParseException e) { e.printStackTrace(); // 这里可以加个用户友好的错误提示,比如:Toast.makeText(this, "日期时间格式有误,请检查", Toast.LENGTH_SHORT).show(); }
- 合并日期和时间到Calendar实例:
Calendar targetCalendar = Calendar.getInstance(); // 设置日期部分 if (parsedDate != null) { targetCalendar.setTime(parsedDate); } // 设置时间部分(时、分,秒可以按需设为0) if (parsedTime != null) { Calendar tempTimeCal = Calendar.getInstance(); tempTimeCal.setTime(parsedTime); targetCalendar.set(Calendar.HOUR_OF_DAY, tempTimeCal.get(Calendar.HOUR_OF_DAY)); targetCalendar.set(Calendar.MINUTE, tempTimeCal.get(Calendar.MINUTE)); targetCalendar.set(Calendar.SECOND, 0); // 不需要保留秒的话就加这行,反之删掉 }
方法二:Android API 26及以上(推荐用Java Time API)
从API 26开始,Android原生支持Java 8的时间API,比SimpleDateFormat更安全、易维护:
// 1. 获取文本内容 String dateText = yourDateEditText.getText().toString().trim(); String timeText = yourTimeEditText.getText().toString().trim(); // 2. 创建格式化器 DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy", Locale.getDefault()); DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm", Locale.getDefault()); // 3. 解析成LocalDate和LocalTime LocalDate localDate = LocalDate.parse(dateText, dateFormatter); LocalTime localTime = LocalTime.parse(timeText, timeFormatter); // 4. 合并成LocalDateTime,再转成Calendar LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime); Calendar targetCalendar = Calendar.getInstance(); targetCalendar.setTime(Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()));
关键提醒
- 格式化器的
pattern必须和EditText里的日期时间格式完全一致,否则会抛出解析异常! - 处理ParseException时,别只打印日志,记得给用户明确的错误反馈,提升体验~
内容的提问来源于stack exchange,提问作者M.Usman




