使用标准日期格式存储,如ISO 8601格式'YYYY-MM-DD HH:MM:SS',读取时统一转换为DateTime对象,避免字符串解析错误。在Java中使用SimpleDateFormat时设置lenient=false;在SQL查询中用STR_TO_DATE或TO_DATE函数转换。
方法一:统一日期格式存储
在数据库中统一使用DATETIME或TIMESTAMP类型存储日期,不要存字符串。插入时用DATE_FORMAT函数确保格式一致:INSERT INTO table (date_col) VALUES (DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'));
方法二:读取时显式转换
查询时用数据库函数转换:SELECT STR_TO_DATE(date_str, '%Y-%m-%d %H:%i:%s') FROM table; 在应用层用try-catch捕获解析异常,默认当前日期。
方法三:Java代码处理
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf.setLenient(false); try { Date date = sdf.parse(dateStr); } catch (ParseException e) { log.error("日期解析失败:" + dateStr); }
方法四:Python处理
from datetime import datetime; try: dt = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S') except ValueError: print('日期格式错误'); dt = datetime.now();
方法五:MySQL预防
ALTER TABLE table MODIFY date_col DATETIME; 查询用:SELECT DATE(date_col) FROM table WHERE date_col IS NOT NULL;
FAQ
Q: 为什么数据库日期存字符串容易出错?
A: 不同系统日期格式不同,如MM/DD vs DD/MM,导致解析失败。
Q: 如何批量修复已有错误日期?
A: 用UPDATE table SET date_col = STR_TO_DATE(date_col, '%Y-%m-%d') WHERE date_col REGEXP '^[0-9]{4}-[0-9]{2}-[0-9]{2}';
Q: 前端日期怎么传到后端?
A: 统一用ISO格式传输,如2023-10-01T12:00:00Z。
Q: Oracle日期异常怎么处理?
A: 用TO_DATE(date_str, 'YYYY-MM-DD HH24:MI:SS')并加异常处理。