You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:49:08