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

为何Dart的DateFormat.parse解析13月时会自动滚至次年1月?

Dart DateFormat 宽松解析导致无效日期自动调整的问题

问题原因

Dart的DateFormat.parse()默认采用宽松解析策略,它不会直接对无效的日期分量(比如超出1-12的月份、超出当月天数的日期)抛出异常,而是自动将这些值滚动到合法范围内。

以你的例子来说:

  • 解析09.13时,默认年份是1970年,月份13相当于1970年1月加上13个月,也就是1971年1月,日期保持9号,最终得到1971-01-09。

解决方案:使用严格解析模式

要让无效日期抛出FormatException,改用parseStrict()方法即可,它会严格校验每个日期分量的合法性:

DateFormat format = DateFormat('dd.MM');

try{
  var dateTime = format.parseStrict('09.13');
  print("dateTime = ${dateTime.toString()}");
}on FormatException{
  print("dateTime error");
}

运行这段代码后,就会输出你预期的dateTime error。

额外说明

  • 如果需要更复杂的校验(比如限制日期在某个年份范围内,或者校验当月实际天数),仅靠parseStrict可能不够,这时候可以结合正则表达式或者手动判断日期分量的逻辑。
  • 宽松解析的设计初衷是为了兼容一些不严格的用户输入场景,但在表单校验这类需要严格合法性的场景下,parseStrict是更合适的选择。

内容的提问来源于stack exchange,提问作者Roar Grønmo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:25:23