护照 MRZ 2 位数年份代码面临的问题

问题描述 投票:0回答:2

我是 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;
}
flutter dart date-formatting flutter-intl mrz
2个回答
0
投票

如果大于,则使用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}';
}

0
投票

你目前做的:

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
}
© www.soinside.com 2019 - 2024. All rights reserved.