DateFormat.parse 无法解析看起来正常的日期/时间

DateFormat.parse fails to parse dates/times that look fine

提问人:Alpit Panchal 提问时间:11/10/2023 最后编辑:jamesdlinAlpit Panchal 更新时间:11/11/2023 访问量:71

问:

我在将字符串转换为 时遇到了问题。它以前有效,但现在我遇到了这个问题。TimeOfDay

try {
    final format = DateFormat.jm(); //"6:00 AM"
    TimeOfDay day = TimeOfDay.fromDateTime(format.parse("6:00"));
} catch(ex) {
    PLPrint(name: "CheckTest",value: "${ex.toString()}");
}

我已经尝试了解析字符串的格式:

1:6:00 - FormatException:尝试从 6:00 到 5 点读取

2:上午 6:00 - FormatException:尝试从早上 6:00 到 5 点阅读

3:6:00:00 - FormatException:尝试从 6:00:00 到 5 读取

4:上午 6:00:00 - FormatException:尝试从上午 6:00:00 到 5 点阅读

5:16:00 - FormatException:尝试从 16:00 到 6 点读取

6:16:00:00 - FormatException:尝试从 16:00:00 读取 6

我已经尝试了几乎所有格式,但仍然遇到格式问题。

Flutter 飞镖 datetime timeofday

评论

0赞 Aks 11/10/2023
我尝试使用 format('6:00 AM') -> TimeOfDay day = TimeOfDay.fromDateTime(format.parse('6:00 AM')) 运行您的代码;-->它正在工作,结果是:“TimeOfDay(06:00)”
0赞 jamesdlin 11/11/2023
@Aks 您可能使用的是 intl 0.18.0 或更早版本。

答:

0赞 jamesdlin 11/11/2023 #1

骨架使用依赖于区域设置的格式,因此可能会有所不同。在默认语言环境(我认为默认为美国英语语言环境)中,该格式包括一个 AM/PM 标记,截至 2023 年,该标记现在用 Unicode 不间断空格(特别是 U+202F)分隔:DateFormatjm

import 'package:intl/intl.dart';

void main() {
  var format = DateFormat.jm();
  var s1 = format.format(DateTime(2023, 1, 1, 6));
  var s2 = "6:00 AM";

  print(s1);       // Prints: 6:00 AM
  print(s1 == s2); // Prints: false

  print(s1.runes); // Prints: (54, 58, 48, 48, 8239, 65, 77)
  print(s2.runes); // Prints: (54, 58, 48, 48, 32, 65, 77)
}

如果要接受其他类型的空格,请使用 DateFormat.parseLoose 而不是:jmDateFormat.parse

如果被 接受,则返回结果。如果没有,请尝试解析它,但接受大写或小写,允许缺少分隔符并替换或补充空格,并在允许空格的地方允许任意数量的空格。请注意,这不允许尾随字符,方式允许。inputStringparseStrictparse

import 'package:intl/intl.dart';

void main() {
  var format = DateFormat.jm();
  print(format.parseLoose("6:00 AM")); // Prints: 1970-01-01 06:00:00.000
}

从经验测试来看,使用 non-break 空格的更改似乎已被 0.18.1 所接受,因此您也可以考虑回滚到 0.18.0 作为另一种解决方法。package:intl

另请参阅 https://github.com/dart-lang/i18n/issues/743