我是新来的Flutter,在我的项目我扫描护照MRZ线使用谷歌毫升套件和解析数据。
当用户出生日期为2000年4月23日时,我面临问题,在这种情况下,MRZ将为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;
}
2条答案
按热度按时间guicsvcw1#
您目前正在执行以下操作:
所以未来的任何一年都会被认为是20世纪的。这对到期日不起作用,到期日通常是在不久的将来。
相反,您应该使用类似
DateFormat
frompackage:intl
使用的-80/+20规则。如果你想重用DateFormat
的现有逻辑,只需重新格式化你原来的String
,使其包含分隔符,然后你就可以直接使用DateFormat.parse
了:或者如果你想实现你自己的规则:
6psbrbz92#
使用 add x if greater than,这应该可以修复大多数年份错误,检查不依赖于年份的
YY--
部分,因此您无法确定是否只锁定该字符串。要获得
dd-mm-yyyy
,您可以执行与在这一行中所做的相同的操作,但需要backwords。或者使用
Datetime
类型。