1

我正在尝试解析看起来像这样的日期字符串Feb0920221500(月、月中的日、年、小时、分钟)。但是当我使用MMMddyyyyHmm模式时,我总是得到一个FormatException. 此外intl'sDateFormat无法解析它之前格式化的日期:

import 'package:intl/intl.dart';

void main() {
  final dateFormat = DateFormat("MMMddyyyyHmm");
  final dateString = dateFormat.format(DateTime.now());
  print(dateString);
  final date = dateFormat.parse(dateString);
  print(date);
}

输出:

Feb0920221511
Uncaught Error: FormatException: Trying to read yyyy from Feb0920221511 at position 13

我究竟做错了什么?

4

1 回答 1

2

您遇到了这个问题:https ://github.com/dart-lang/intl/issues/210

TL / DR:如果我正确理解包维护者,这两种方法都不是完全可逆的。

尝试引入空格或点等字段分隔符作为解决方法:

  final dateFormat = DateFormat("MMM dd yyyy H mm");
  final dateString = dateFormat.format(DateTime.now());
  print(dateString);
  print(dateFormat.parseStdaterict(dateString));

如果给定日期字符串的格式无法更改,您仍然可以使用这样的 hack 使其工作。只要确保优雅地处理错误。

import 'package:intl/intl.dart';

Future<void> main() async {
  final parsedDate = 'Feb0920221511'.parseToDate();
  print(parsedDate.toIso8601String());
}

extension CustomDateParser on String {
  DateTime parseToDate() {
    try {
      final month = substring(0, 3);
      final day = substring(3, 5);
      final year = substring(5, 9);
      final hour = substring(9, 11);
      final minute = substring(11, 13);

      final paddedDateString = '$month $day $year $hour $minute';
      final dateFormat = DateFormat('MMM dd yyyy H mm');
      return dateFormat.parse(paddedDateString);
    } catch (e) {
      // handle error
      print(e);
      rethrow;
    }
  }
}
于 2022-02-09T11:40:49.057 回答