我是 flutter 的新手,在我的项目中,我使用 google ml kit 扫描护照 MRZ 行并解析数据。
当用户生日为 23-04-2000 时,我面临问题,在这种情况下,机读区将为 000423。
我试图转换为 dd-MM-yyyy 格式面临问题。
请帮忙:)
我尝试使用以下代码
String convertMrzDate(String dateStr) {
String year = dateStr.substring(0, 2);
String month = dateStr.substring(2, 4);
String day = dateStr.substring(4, 6);
int currentYear = DateTime.now().year;
int currentTwoDigitYear = currentYear % 100;
int twoDigitYear = int.parse(year);
int century = (currentYear ~/ 100) * 100;
int centuryAdjustedYear;
if (twoDigitYear <= currentTwoDigitYear) {
centuryAdjustedYear = century + twoDigitYear;
} else {
centuryAdjustedYear = century - 100 + twoDigitYear;
}
String formattedDate = '$centuryAdjustedYear-$month-$day';
return formattedDate;
}
它正在为生日工作,但到期日期得到错误的数据。
我的 Java 代码
public static String convertMrzDate(String dateStr) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd", Locale.ENGLISH);
Date d1 = sdf.parse(dateStr);
sdf.applyPattern("yyyy-MM-dd");
return sdf.format(d1);
}
我使用 plugin:intl 在下面的 dart 代码中进行了尝试 但出现错误
尝试从位置 6 的 000423 读取 MM
String convertMrzDate(String dateStr) {
final inputFormat = DateFormat('yyMMdd', 'en_US');
final outputFormat = DateFormat('yyyy-MM-dd');
final date = inputFormat.parse(dateStr);
final formattedDate = outputFormat.format(date);
return formattedDate;
}
如果大于,则使用add x,这应该可以修复大部分年份的错误,检查不依赖于一年中的
YY--
部分,因此您不能确定只锁定该字符串。
DateTime? mzt_parse_date(String date, String check) {
final cut_year = 69; // Same as MySQL
final exp_date = date.replaceAll('<', '0');
final check_nums = [7, 3, 1, 7, 3, 1];
final date_chars = exp_date.split('');
assert(date_chars.length == check_nums.length);
var sum = 0;
for (var i = 0; i < date_chars.length; i++) {
sum += int.parse(date_chars[i]) * check_nums[i];
}
if (sum % 10 == int.parse(check)) {
final year = int.parse(exp_date.substring(0, 2));
return DateTime(
year + ((year < cut_year) ? 2000 : 1900),
int.parse(exp_date.substring(2, 4)),
int.parse(exp_date.substring(4, 6)),
);
}
}
要获得
dd-mm-yyyy
for 你可以做与你在这一行中所做的相同的事情,但是是后缀词。
String formattedDate = '$centuryAdjustedYear-$month-$day';
或使用
Datetime
类型。
String date_to_ddmmyyyy(DateTime date) {
return '${date.day}-${date.month}-${date.year}';
}
你目前做的:
if (twoDigitYear <= currentTwoDigitYear) { centuryAdjustedYear = century + twoDigitYear; } else { centuryAdjustedYear = century - 100 + twoDigitYear; }
所以未来的任何一年都将被视为来自 1900 年代。这不适用于到期日期,通常是在不久的将来。
您应该改用 DateFormat
package:intl
使用的 -80/+20 规则。如果你想重新使用DateFormat
的现有逻辑(我建议你这样做;逻辑不是微不足道的),只需重新格式化你原来的String
以包含分隔符,然后你就可以使用DateFormat.parse
直接:
import 'package:intl/intl.dart';
String convertMrzDate(String dateStr) {
String year = dateStr.substring(0, 2);
String month = dateStr.substring(2, 4);
String day = dateStr.substring(4, 6);
var delimited = '$year-$month-$day';
var dateTime = DateFormat('yy-MM-dd').parse(delimited);
return DateFormat('dd-MM-yyyy').format(dateTime);
}
void main() {
print(convertMrzDate('000423')); // Prints: 23-04-2000
print(convertMrzDate('241031')); // Prints: 31-10-2024
print(convertMrzDate('991031')); // Prints: 31-10-1999
}