Flutter解析全大写月份缩写日期字符串27-JAN-2022报错问题
Flutter 解析全大写月份缩写字符串为DateTime的方案
问题根因
使用intl包的DateFormat按dd-MMM-yyyy格式解析27-JAN-2022这类日期时抛出Trying to read MMM from 27-JAN-2022 at position 3错误,是因为MMM格式符默认匹配对应语言环境下首字母大写、其余小写的标准月份缩写(如Jan、Feb),无法直接识别全大写的JAN、FEB这类格式。
可行解决方案
方案1:预处理日期字符串后按标准格式解析
先把字符串中的月份字段转换为首字母大写的标准格式,再调用常规解析逻辑,适配多语言场景兼容性更好:
import 'package:intl/intl.dart'; /// 解析dd-MMM-yyyy格式、月份为全大写缩写的日期字符串 DateTime parseDateWithAllCapsMonth(String rawDate) { final segments = rawDate.split('-'); if (segments.length != 3) { throw FormatException('日期格式不符合预期: $rawDate'); } // 转换月份为首字母大写格式 final normalizedMonth = segments[1][0].toUpperCase() + segments[1].substring(1).toLowerCase(); final normalizedDate = '${segments[0]}-$normalizedMonth-${segments[2]}'; return DateFormat('dd-MMM-yyyy').parse(normalizedDate); } // 调用示例 void main() { const testDate = '27-JAN-2022'; final dateTime = parseDateWithAllCapsMonth(testDate); print(dateTime); // 输出: 2022-01-27 00:00:00.000 }
方案2:自定义月份映射直接解析
不需要引入intl依赖,适合数据源固定返回英文全大写月份缩写的场景,解析性能更高:
/// 无依赖解析dd-全大写英文月份缩写-yyyy格式的日期 DateTime parseAllCapsEnMonthDate(String rawDate) { const upperMonthToNumber = { 'JAN': 1, 'FEB': 2, 'MAR': 3, 'APR': 4, 'MAY': 5, 'JUN': 6, 'JUL': 7, 'AUG': 8, 'SEP': 9, 'OCT': 10, 'NOV': 11, 'DEC': 12 }; final segments = rawDate.split('-'); if (segments.length != 3 || !upperMonthToNumber.containsKey(segments[1])) { throw FormatException('日期格式不符合预期: $rawDate'); } return DateTime( int.parse(segments[2]), upperMonthToNumber[segments[1]]!, int.parse(segments[0]) ); }
注意事项
- 如果项目使用非英文locale解析日期,方案1的月份转码逻辑需要对应调整为目标语言的标准月份缩写格式
- 方案2仅适配英文月份缩写,若数据源返回其他语言的全大写月份,需要同步更新映射表
内容的提问来源于stack exchange,提问作者Cordelia
相关产品推荐
相关产品推荐

