整齐地解析"MMddyy"格式的日期以及飞镖中的其他格式



我猜这是不可能解析日期在" mm "格式:

void main() {
String strcandidate = "031623";
String format = "MMddyy";
var originalFormat = DateFormat(format).parse(strcandidate);
}

输出:

Uncaught Error: FormatException: Trying to read dd from 031623 at position 6

在解析"MM-dd-yy"格式的日期时,以下代码可以正常工作格式。

void main() {
String strcandidate = "03-16-23";
String format = "MM-dd-yy";
var originalFormat = DateFormat(format).parse(strcandidate);
}

在问题中,输入日期字符串可以是任意格式,例如['yyyy-MM-dd', 'MMM'-yyyy, 'MM/dd/yy']。我在循环中解析这些格式的输入字符串,如下所示。

dateFormatsList = ['yyyy-MM-dd', 'MMM'-yyyy, 'MM/dd/yy'];
for (String format in dateFormatsList ) {
try {
originalFormat = DateFormat(format).parse(strcandidate);
dateFound = true;
} catch (e) {}
}

dateFormatsList中添加'MMddyy'是行不通的。但是正则表达式可以用来解析这种格式。但是,如果使用parse方法解析所有格式,并使用正则表达式解析另外一种格式,那么代码就不那么整洁,而且混乱。

为了编写尽可能多的整洁高效的代码,如果你愿意,你可以分享你的见解,关于任何可能性,使其高效和干净,同时结合'MMddyy'格式。Tysm !

参见如何将日期/时间字符串转换为Dart中的DateTime对象?了解如何将各种日期/时间字符串解析为DateTime对象。

如果需要混合使用,可以提供统一的接口。您可以使用List<DateTime Function(String)>:

,而不是使用List<String>作为格式列表。
import 'package:intl/intl.dart';
/// Parses a [DateTime] from [dateTimeString] using a [RegExp].
///
/// [re] must have named groups with names `year`, `month`, and `day`.
DateTime parseDateFromRegExp(RegExp re, String dateTimeString) {
var match = re.firstMatch(dateTimeString);
if (match == null) {
throw FormatException('Failed to parse: $dateTimeString');
}
var year = match.namedGroup('year');
var month = match.namedGroup('month');
var day = match.namedGroup('day');
if (year == null || month == null || day == null) {
throw ArgumentError('Regular expression is malformed');
}
// In case we're parsing a two-digit year format, instead of
// parsing the strings ourselves, reparse it with [DateFormat] so that it can
// apply its -80/+20 rule.
//
// [DateFormat.parse] doesn't work without separators, which is why we
// can't use directly on the original string.  See:
// https://github.com/dart-lang/intl/issues/210
return DateFormat('yy-MM-dd').parse('$year-$month-$day');
}
typedef DateParser = DateTime Function(String);
DateParser dateParserFromRegExp(String rePattern) =>
(string) => parseDateFromRegExp(RegExp(rePattern), string);
var parserList = [
DateFormat('yyyy-MM-dd').parse,
DateFormat('MMM-yyyy').parse,
DateFormat('MM/dd/yy').parse,
dateParserFromRegExp(
r'^(?<month>d{2})(?<day>d{2})(?<year>d{4})$',
)
];
void main() {
var strcandidate = '12311776';
DateTime? originalFormat;
for (var tryParse in parserList) {
try {
originalFormat = tryParse(strcandidate);
break;
} on Exception {
// Try the next format.
}
}
print(originalFormat);
}

我认为这有点黑客,但如何使用正则表达式(RegExp)来解析日期分隔符,然后将其替换为"?

void main() {
String strcandidate = "031623";
String strYear = strcandidate.substring(4);
//Taken 20 as the year like 2023 as year is in 2 digits
String _newDateTime = '20' + strYear + strcandidate.substring(0, 4);
var _originalFormat = DateTime.parse(_newDateTime);
print(_originalFormat);
}

将intl添加到yaml中,然后编写以下代码:

import 'package:intl/intl.dart';
void main() {
var strcandidate = DateTime(2023, 3, 16);
String format = "MMddyy";
var originalFormat = DateFormat(format).format(strcandidate);
print(originalFormat);
}

最新更新