Android中SimpleDateFormat日期校验失效及格式转换问题咨询
解决日期校验与格式转换问题
嘿,我来帮你搞定这两个问题!
一、修复错误日期解析的问题
你遇到的问题是因为SimpleDateFormat默认处于宽松模式(lenient),它会自动“修正”那些不符合格式的输入,比如把111/10/2013转换成合理的日期(相当于累加天数后的合法日期),而不是直接抛出异常。另外,它也不会主动过滤包含非数字字符的输入,所以得从两方面入手解决:
1. 先做正则校验过滤非法字符
先通过正则表达式确保输入是dd/MM/yyyy的纯数字+斜杠格式,避免包含字母或其他无效字符:
String inputDate = date.getText().toString(); // 正则匹配:两位数字/两位数字/四位数字 if (!inputDate.matches("^\\d{2}/\\d{2}/\\d{4}$")) { Toast.makeText(MainActivity.this, "Date format is wrong.", Toast.LENGTH_LONG).show(); return; }
2. 关闭SimpleDateFormat的宽松模式
在创建SimpleDateFormat后,调用setLenient(false),让它严格校验日期的合法性,比如月份不能超过12,日期不能超过当月的最大天数:
try { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); // 关闭宽松模式,严格校验日期 sdf.setLenient(false); Date d = sdf.parse(inputDate); // 到这里说明日期格式完全正确,可以继续后续操作 } catch (ParseException ex) { Toast.makeText(MainActivity.this, "Date format is wrong.", Toast.LENGTH_LONG).show(); return; }
把这两步结合起来,就能彻底拦截像111/10/2013、11/109/2013或者带字符的错误输入啦。
二、将日期转换为带月份名称的格式
如果已经得到了合法的Date对象,想要转换成类似10 August 2015(完整月份名)或者10 Aug 2015(缩写月份名)的格式,只需要再创建一个SimpleDateFormat,指定对应的格式字符串即可:
1. 完整月份名称格式(如10 August 2015)
// 注意指定Locale,避免因系统语言不同显示不同的月份名 SimpleDateFormat fullMonthFormat = new SimpleDateFormat("dd MMMM yyyy", Locale.ENGLISH); String fullMonthDate = fullMonthFormat.format(d);
2. 缩写月份名称格式(如10 Aug 2015)
SimpleDateFormat shortMonthFormat = new SimpleDateFormat("dd MMM yyyy", Locale.ENGLISH); String shortMonthDate = shortMonthFormat.format(d);
如果需要显示中文月份名称(比如“10 八月 2015”),只需要把Locale.ENGLISH换成Locale.CHINA或者Locale.SIMPLIFIED_CHINESE就行。
内容的提问来源于stack exchange,提问作者dongerpep
相关产品推荐
相关产品推荐

