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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:45:36