MaskedDateField
MaskedDateField 是一个文本输入,让用户以数字形式输入日期,并在字段失去焦点时根据定义的掩码自动格式化输入。掩码指定所需的日期格式,引导输入和显示。该组件支持灵活的解析、验证、本地化和值复原,以实现一致且符合地区特定要求的日期处理。
基础
MaskedDateField 仅专注于 日期 值。如果您需要一个类似的组件用于输入和格式化 时间,请查看 MaskedTimeField。
MaskedDateField 可以在有或没有参数的情况下实例化。您可以定义初始值、标签、占位符,以及值更改的事件监听器。
显示代码
- MaskedDateFieldView.java
掩码规则
MaskedDateField 支持多种全球使用的日期格式,这些格式按日、月和年顺序变化。常见模式包括:
- 日/月/年(在大多数欧洲国家使用)
- 月/日/年(在美国使用)
- 年/月/日(在中国、日本和韩国使用;也是 ISO 标准:
YYYY-MM-DD)
在这些格式中,当地变体包括分隔符的选择(例如 -、/ 或 .),年份是两位数还是四位数,以及单数字的月份或日期是否用前导零填充。
为了处理这些多样性,MaskedDateField 使用格式指示符,每个指示符以 % 开头,后跟表示日期特定部分的字母。这些指示符定义了输入的解析方式以及日期的显示方式。
要以相同的掩码语法格式化或解析字段外的日期,使用 MaskDecorator 工具类。
日期格式指示符
| 格式 | 描述 |
|---|---|
%Y | 年 |
%M | 月 |
%D | 日 |
修饰符
修饰符允许更好地控制日期组件的格式:
| 修饰符 | 描述 |
|---|---|
z | 零填充 |
s | 简短文本表示 |
l | 长文本表示 |
p | 打包数字 |
d | 十进制(默认格式) |
这些可以组合以构建多种日期掩码。
日期格式本地化
MaskedDateField 通过设置适当的区域来适应区域日期格式。这确保日期以符合用户期望的方式显示和解析。
| 区域 | 格式 | 示例 |
|---|---|---|
| 美国 | MM/DD/YYYY | 07/04/2023 |
| 欧洲 | DD/MM/YYYY | 04/07/2023 |
| ISO 标准 | YYYY-MM-DD | 2023-07-04 |
要应用本地化,请使用 setLocale() 方法。它接受一个 java.util.Locale,并自动调整格式和解析:
dateField.setLocale(Locale.FRANCE);
解析逻辑
MaskedDateField 根据定义的日期掩码解析用户输入。它接受完整和简写的数字输入,可以带或不带分隔符,允许灵活输入,同时确保有效日期。
解析行为取决于掩码定义的格式顺序(例如 %Mz/%Dz/%Yz 对于月/日/年)。此格式决定了数字序列的解释方式。
例如,假设今天是 2012年9月15日,以下是不同输入的解释方式:
示例解析场景
| 输入 | YMD (ISO) | MDY (US) | DMY (EU) |
|---|---|---|---|
1 | 单数字始终被解释为当前月份内的日期,因此将解读为 2012 年 9 月 1 日。 | 同 YMD | 同 YMD |
12 | 两位数字始终被解释为当前月份内的日期,因此将解读为 2012 年 9 月 12 日。 | 同 YMD | 同 YMD |
112 | 三位数字被解释为 1 位数字的月份和 2 位数字的日期,因此将解读为 2012 年 1 月 12 日。 | 同 YMD | 三位数字被解释为 1 位数字的日期和 2 位数字的月份,因此将解读为 2012 年 12 月 1 日。 |
1004 | 四位数字被解释为 MMDD,因此将解读为 2012 年 10 月 4 日。 | 同 YMD | 四位数字被解释为 DDMM,因此将解读为 2012 年 4 月 10 日。 |
020304 | 六位数字被解释为 YYMMDD,因此将解读为 2002 年 3 月 4 日。 | 六位数字被解释为 MMDDYY,因此将解读为 2004 年 2 月 3 日。 | 六位数字被解释为 DDMMYY,因此将解读为 2004 年 3 月 2 日。 |
8 digits | 八位数字被解释为 YYYYMMDD。例如,20040612 是 2004 年 6 月 12 日。 | 八位数字被解释为 MMDDYYYY。例如,06122004 是 2004 年 6 月 12 日。 | 八位数字被解释为 DDMMYYYY。例如,06122004 是 2004 年 12 月 6 日。 |
12/6 | 用任何有效分隔符分隔的两个数字被解释为 MM/DD,因此将解读为 2012 年 12 月 6 日。 注意:所有的字符(除了字母和数字)都被视为有效的分隔符。 | 同 YMD | 用任何分隔符分隔的两个数字被解释为 DD/MM,因此将解读为 2012 年 6 月 12 日。 |
3/4/5 | 2012 年 4 月 5 日 | 2005 年 3 月 4 日 | 2005 年 4 月 3 日 |
文本日期解析 25.11
默认情况下,MaskedDateField 仅接受关于日期的数字输入。但是,您可以启用 文本日期解析,允许用户在输入中输入月份和日期名称。此功能对于创建更自然的日期输入非常有用。
要启用文本解析,请使用 setTextualDateParsing() 方法:
dateField.setTextualDateParsing(true);
月份名称替代
启用文本解析后,您可以在掩码中使用特殊修饰符,以接受月份名称而不是数字值:
%Ms- 接受简短月份名称(如 Jan、Feb、Mar 等)%Ml- 接受长月份名称(如 January、February、March 等)
月份名称可以在掩码中的任何位置出现,且该字段仍然会接受数字输入作为回退。
示例
| 掩码 | 输入 | 结果 |
|---|---|---|
%Ms/%Dz/%Yz | Sep/01/25 | 有效 - 解析为 2025 年 9 月 1 日 |
%Ml/%Dz/%Yz | September/01/25 | 有效 - 解析为 2025 年 9 月 1 日 |
%Dz/%Ml/%Yz | 01/September/25 | 有效 - 解析为 2025 年 9 月 1 日 |
%Mz/%Dz/%Yz | 09/01/25 | 有效 - 数字回退仍然有效 |
所有 12 个月在简短(Jan、Feb、Mar、Apr、May、Jun、Jul、Aug、Sep、Oct、Nov、Dec)和长(January、February 等)形式中均受支持。
星期名称装饰
可以在输入中包含星期几名称以增强可读性,但它们仅仅是 装饰性的,在解析过程中会被删除。它们不会影响实际的日期值。
%Ds- 接受简短的星期名称(如 Mon、Tue、Wed 等)%Dl- 接受长的星期名称(如 Monday、Tuesday、Wednesday 等)
使用星期几名称(%Ds 或 %Dl)时,您的掩码 还必须包含 %Dz 或 %Dd 以指定实际的日期数字。如果没有数字日期组件,则输入将无效。
示例
| 掩码 | 输入 | 结果 |
|---|---|---|
%Ds %Mz/%Dz/%Yz | Mon 09/01/25 | 有效 - 星期名称是装饰性的 |
%Dl %Mz/%Dz/%Yz | Monday 09/01/25 | 有效 - 星期名称是装饰性的 |
%Mz/%Dz/%Yz %Ds | 09/01/25 Tue | 有效 - 星期名称在最后 |
%Dl/%Mz/%Yz | Monday/09/25 | 无效 - 缺少 %Dz |
%Mz/%Dl/%Yz | 09/Monday/25 | 无效 - 缺少 %Dz |
所有 7 个星期也以简短(Mon、Tue、Wed、Thu、Fri、Sat、Sun)和长(Monday、Tuesday 等)形式受支持。