Java中如何将日期与时分格式字符串分别转换为Date对象
Java 指定格式字符串转换为 Date 对象的实现方案
核心实现思路
转换时需要严格匹配输入字符串的内容特征,同时注意两个输入本身的信息完整性缺陷:
- 输入
"2021-05-9"仅包含年月日信息,解析后需要补充默认时分秒才能转换为完整时间点的Date对象 - 输入
"23:59:00"仅包含时分秒信息,不存在有效日期基准,必须指定业务认可的基准日期(如当前日期、同业务关联的固定日期),拼接后才能转换为有实际意义的Date对象
推荐实现(Java 8+ 官方标准)
优先使用java.time包下的新时间API,该API线程安全、解析规则严谨,是当前Java处理时间的标准方案:
import java.time.LocalDate; import java.time.LocalTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Date; public class StringToDateTest { // 适配无前置零的日期格式,自动兼容个位数/两位数的月、日 private static final DateTimeFormatter DATE_PARSER = DateTimeFormatter.ofPattern("yyyy-M-d"); // 适配24小时制的时分秒格式 private static final DateTimeFormatter TIME_PARSER = DateTimeFormatter.ofPattern("HH:mm:ss"); public static void main(String[] args) { String dayInput = "2021-05-9"; String timeInput = "23:59:00"; // 1. 转换日期字符串:解析年月日,取当日0点作为完整时间点,再转Date LocalDate parsedDay = LocalDate.parse(dayInput, DATE_PARSER); Date dayResult = Date.from( parsedDay.atStartOfDay(ZoneId.systemDefault()).toInstant() ); // 2. 转换时间字符串:以刚才解析到的2021-05-9作为基准日期,绑定解析到的时分秒后转Date // 可根据业务需求替换基准日期为任意指定日期 LocalTime parsedTime = LocalTime.parse(timeInput, TIME_PARSER); Date timeResult = Date.from( parsedDay.atTime(parsedTime).atZone(ZoneId.systemDefault()).toInstant() ); } }
实现注意点
- 时区选择:示例使用系统默认时区做转换,如果需要固定时区(如东八区、UTC),替换
ZoneId.systemDefault()为对应时区常量即可,避免跨环境运行的时间偏差 - 无特殊需求的场景,可直接保留
LocalDate/LocalDateTime类型做业务处理,无需强制转换为旧版java.util.Date对象
兼容旧Java版本的实现
如果项目仍在使用Java 8之前的版本,可使用SimpleDateFormat做解析,注意该类线程不安全,禁止作为静态全局对象复用,每次使用需新建实例:
import java.text.SimpleDateFormat; import java.util.Date; public class LegacyStringToDateTest { public static void main(String[] args) throws Exception { String dayInput = "2021-05-9"; String timeInput = "23:59:00"; // 转换日期字符串 SimpleDateFormat dayParser = new SimpleDateFormat("yyyy-M-d"); Date dayResult = dayParser.parse(dayInput); // 转换时间字符串:拼接基准日期为"2021-05-9"后解析完整时间 SimpleDateFormat timeParser = new SimpleDateFormat("yyyy-M-d HH:mm:ss"); Date timeResult = timeParser.parse(dayInput + " " + timeInput); } }
内容的提问来源于stack exchange,提问作者Andre Proenza
相关产品推荐
相关产品推荐

