You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

安卓开发:如何根据EditText的日期时间值创建Calendar实例?

解决从日期时间EditText创建Calendar实例的问题

嘿,这事儿其实挺简单的,我给你一步步拆解怎么做,分两种适配场景来给你示例:

方法一:兼容Android API 26以下(用SimpleDateFormat)

这种方式适配性广,适合大部分存量项目:

  1. 先获取两个EditText里的文本内容:
// 获取日期EditText的字符串
String dateText = yourDateEditText.getText().toString().trim();
// 获取时间EditText的字符串
String timeText = yourTimeEditText.getText().toString().trim();
  1. 创建对应格式的日期时间解析器,重点注意:格式要和你日期选择器输出的格式完全匹配
    • 你给的日期是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();
}
  1. 合并日期和时间到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

火山引擎 最新活动