跳至主要内容

MaskedDateField

在 ChatGPT 中打开
阴影 dwc-datefield 24.10
Java API

MaskedDateField 是一个文本输入框,允许用户以数字形式输入日期,并在字段失去焦点时根据定义的掩码自动格式化输入。掩码指定了预期的日期格式,引导输入和显示。该组件支持灵活的解析、验证、本地化和值恢复,以实现一致的区域特定日期处理。

寻找时间输入吗?

MaskedDateField 专注于 日期 值。如果您需要一个类似的组件用于输入和格式化 时间 ,请查看 MaskedTimeField。

MaskedDateField 可以在有或没有参数的情况下实例化。您可以定义初始值、标签、占位符以及值更改的事件监听器。

掩码规则​

MaskedDateField 支持多种全球使用的日期格式,这些格式因日、月、年的顺序而异。常见的模式包括:

  • 日/月/年(在大多数欧洲国家使用)
  • 月/日/年(在美国使用)
  • 年/月/日(在中国、日本和韩国使用;也是 ISO 标准:YYYY-MM-DD)

在这些格式中,本地变体包括分隔符的选择(如 -、/ 或 .),年份是两位数还是四位数,以及单数字月份或日期是否用前导零填充。

为了处理这种多样性,MaskedDateField 使用格式指示符,每个指示符以 % 开头,后面跟着一个表示日期特定部分的字母。这些指示符定义了输入的解析方式及日期的显示方式。

以编程方式应用掩码

要在字段外使用相同的掩码语法格式化或解析日期,请使用 MaskDecorator 工具类。

日期格式指示符​

格式描述
%Y年
%M月
%D日

修饰符​

修饰符允许对日期的组件格式进行更细致的控制:

修饰符描述
z零填充
s短文本表示
l长文本表示
p紧凑数字
d十进制(默认格式)

这些修饰符可以组合起来构建各种日期掩码。

日期格式本地化​

MaskedDateField 通过设置适当的区域设置来适应区域日期格式。这确保日期以符合用户期望的方式显示和解析。

区域格式示例
美国MM/DD/YYYY07/04/2023
欧洲DD/MM/YYYY04/07/2023
ISO 标准YYYY-MM-DD2023-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.10​

默认情况下,MaskedDateField 仅接受数字输入日期。但是,您可以启用 文本日期解析 以允许用户在输入中输入月份和日期名称。此功能对于创建更自然的日期输入非常有用。

要启用文本解析,请使用 setTextualDateParsing() 方法:

dateField.setTextualDateParsing(true);

月份名称替换​

当启用文本解析时,您可以在掩码中使用特殊修饰符以接受月份名称而不是数字值:

  • %Ms - 接受短月份名称(如 Jan、Feb、Mar 等)
  • %Ml - 接受长月份名称(如 January、February、March 等)

月份名称可以在掩码的任何位置出现,字段仍将接受数字输入作为后备。

示例​

掩码输入结果
%Ms/%Dz/%YzSep/01/25有效 - 解析为 2025 年 9 月 1 日
%Ml/%Dz/%YzSeptember/01/25有效 - 解析为 2025 年 9 月 1 日
%Dz/%Ml/%Yz01/September/25有效 - 解析为 2025 年 9 月 1 日
%Mz/%Dz/%Yz09/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/%YzMon 09/01/25有效 - 星期名称是装饰性
%Dl %Mz/%Dz/%YzMonday 09/01/25有效 - 星期名称是装饰性
%Mz/%Dz/%Yz %Ds09/01/25 Tue有效 - 星期名称在末尾
%Dl/%Mz/%YzMonday/09/25无效 - 缺少 %Dz
%Mz/%Dl/%Yz09/Monday/25无效 - 缺少 %Dz

所有 7 个星期几都在短(Mon、Tue、Wed、Thu、Fri、Sat、Sun)和长(Monday、Tuesday 等)形式中得到支持。

附加解析规则​

文本日期解析包括几个有用的功能:

  • 不区分大小写: 输入如 MONDAY 09/01/25、monday 09/01/25 或 Monday 09/01/25 都以相同的方式工作。
  • 区域感知: 月份和日期名称必须与字段配置的区域匹配。例如,在法语环境中,使用 septembre 而不是 September。除非区域设置为英语,否则不会识别英语名称。
    • 法语区域:septembre/01/25 被识别为 September
    • 德语区域:Montag 09/01/25 被识别为 Monday

设置最小/最大约束​

您可以使用 setMin() 和 setMax() 方法在 MaskedDateField 中限制允许的日期范围:

dateField.setMin(LocalDate.of(2020, 1, 1));
dateField.setMax(LocalDate.of(2030, 12, 31));

这两个方法接受 java.time.LocalDate 类型的值。超出定义范围的输入将被视为无效。

恢复值​

MaskedDateField 包含一个恢复功能,可以将字段的值重置为预定义或原始状态。这对于还原用户输入或重置为默认日期非常有用。

dateField.setRestoreValue(LocalDate.of(2025, 1, 1));
dateField.restoreValue();

恢复值的方式​

  • 通过编程, 通过调用 restoreValue()
  • 通过键盘, 通过按 ESC(这是默认恢复键,除非被事件监听器重写)

您可以使用 setRestoreValue() 设置要恢复的值,传递一个 LocalDate 实例。

验证模式​

您可以使用正则表达式通过 setPattern() 方法应用客户端验证规则:

dateField.setPattern("^\\d{2}/\\d{2}/\\d{4}$");

该模式确保只有符合 MM/DD/YYYY 格式(两个数字、斜杠、两个数字、斜杠、四个数字)的值被视为有效。

正则表达式格式

模式必须遵循 JavaScript RegExp 语法,具体请参见 这里。

输入处理的注意事项

该字段尝试根据当前掩码解析和格式化数值日期输入。但是,用户仍然可以手动输入不符合预期格式的值。如果输入在语法上有效,但在语义上不正确或无法解析(例如 99/99/9999),则可能通过模式检查,但无法通过逻辑验证。 即使设置了正则表达式模式,您也应始终在应用逻辑中验证输入值,以确保日期既格式正确又有意义。

日期选择器​

MaskedDateField 包含内置的日历选择器,允许用户以可视化方式选择日期,而不是键入。这增强了对于技术能力较低的用户的可用性,或者在需要精确输入时。

访问选择器​

您可以使用 getPicker() 访问日期选择器:

DatePicker picker = dateField.getPicker();

显示/隐藏选择器图标​

使用 setIconVisible() 显示或隐藏字段旁边的日历图标:

picker.setIconVisible(true); // 显示图标

自动打开行为​

您可以配置选择器在用户与字段交互时自动打开(例如,点击、按 Enter 或箭头键):

picker.setAutoOpen(true);
强制通过选择器选择

为了确保用户只能通过日历选择器选择日期(而不能手动输入),请结合以下两个设置:

dateField.getPicker().setAutoOpen(true); // 用户交互时打开选择器
dateField.setAllowCustomValue(false); // 禁用手动文本输入

这种设置确保所有日期输入都通过选择器用户界面提供,这在您希望严格控制格式并消除手动输入解析问题时非常有用。

手动打开日历​

要通过编程方式打开日历:

picker.open();

或者使用别名:

picker.show(); // 同于 open()

在日历中显示周数​

选择器可以选择性地在日历视图中显示周数:

picker.setShowWeeks(true);

MaskedDateFieldSpinner​

MaskedDateFieldSpinner 在 MaskedDateField 的基础上扩展,添加了旋转控制,允许用户使用箭头键或 UI 按钮递增或递减日期。它提供了更引导的交互方式,特别适用于桌面风格的应用程序。

主要特性​

  • 交互式日期递进: 使用箭头键或旋转按钮递增或递减日期值。

  • 可自定义的步长单位: 选择要修改的日期部分,使用 setSpinField():

    spinner.setSpinField(MaskedDateFieldSpinner.SpinField.MONTH);

    选项包括 DAY、WEEK、MONTH 和 YEAR。

  • 最小/最大边界: 继承了对使用 setMin() 和 setMax() 的最小和最大允许日期的支持。

  • 格式化输出: 完全兼容来自 MaskedDateField 的掩码和本地化设置。

示例:配置每周递进​

MaskedDateFieldSpinner spinner = new MaskedDateFieldSpinner();
spinner.setSpinField(MaskedDateFieldSpinner.SpinField.WEEK);

这使得每次旋转步骤都会将日期前进或后退一周。

样式​

Loading...

继续学习