我想在 dart 中無法決議“MMddyy”格式的日期。
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) {}
}
添加“MMddyy”dateFormatsList是行不通的。但正則運算式可用于決議這種格式。但是,如果所有格式都使用parse方法決議,而另一種格式使用正則運算式決議,那么代碼就不是那么整潔和混亂。
為了撰寫盡可能多的簡潔高效的代碼,如果您愿意,您可以分享您的見解,了解在合并 'MMddyy' 格式的同時使其高效和干凈的任何可能性。太棒了!
uj5u.com熱心網友回復:
我認為這有點 hacky 但是使用正則運算式(RegExp)來決議日期分隔符然后用“”替換它呢?
uj5u.com熱心網友回復:
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);
}
uj5u.com熱心網友回復:
請參閱如何在 Dart 中將日期/時間字串轉換為 DateTime 物件?了解如何將各種日期/時間字串決議為DateTime物件。
如果你需要混合方法,你可以提供一個統一的介面。List<String>您可以使用 a ,而不是使用 a作為格式串列List<DateTime Function(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 yearString = match.namedGroup('year');
var monthString = match.namedGroup('month');
var dayString = match.namedGroup('day');
if (yearString == null || monthString == null || dayString == null) {
throw ArgumentError('Regular expression is malformed');
}
var year = int.parse(yearString);
var month = int.parse(monthString);
var day = int.parse(dayString);
if (year > 0 && year < 100) {
year = 1900;
}
return DateTime(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{2})$',
)
];
void main() {
var strcandidate = '123199';
DateTime? originalFormat;
for (var tryParse in parserList) {
try {
originalFormat = tryParse(strcandidate);
break;
} on Exception {
// Try the next format.
}
}
print(originalFormat);
}
uj5u.com熱心網友回復:
請參閱如何在 Dart 中將日期/時間字串轉換為 DateTime 物件?了解如何將各種日期/時間字串決議為DateTime物件。
如果你需要混合方法,你可以提供一個統一的介面。List<String>您可以使用 a ,而不是使用 a作為格式串列List<DateTime Function(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);
}
uj5u.com熱心網友回復:
將 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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/469396.html
上一篇:替換python中字串的日期部分
