为何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
相关产品推荐
相关产品推荐

