toIso8601String 方法

字符串 toIso8601String()

返回ISO-8601完整精度的扩展格式表示。

格式为 UTC 时间时为 yyyy-MM-ddTHH:mm:ss.mmmuuuZ,对于本地/非UTC 时间为 yyyy-MM-ddTHH:mm:ss.mmmuuu(不跟随着"Z"),其中

  • yyyy 是表示年份的四位数字(可能为负),如果年份在 -9999 到 9999 范围内,否则为带符号的六位数字年份。
  • MM 是月份,范围在 01 到 12 之间,
  • dd 是月份中的天数,范围在 01 到 31 之间,
  • HH 是小时的范围在 00 到 23 之间,
  • mm 是分钟,范围在 00 到 59 之间,
  • ss 是秒,范围在 00 到 59(不包括闰秒),
  • mmm 是毫秒,范围在 000 到 999 之间,而且
  • uuu 是微秒,范围在 001 到 999。如果 微秒 等于 0,则该部分被省略。

结果字符串可以使用 parse 进行解析。

final moonLanding = DateTime.utc(1969, 7, 20, 20, 18, 04);
final isoDate = moonLanding.toIso8601String();
print(isoDate); // 1969-07-20T20:18:04.000Z

实现

String toIso8601String() {
  String y =
      (year >= -9999 && year <= 9999) ? _fourDigits(year) : _sixDigits(year);
  String m = _twoDigits(month);
  String d = _twoDigits(day);
  String h = _twoDigits(hour);
  String min = _twoDigits(minute);
  String sec = _twoDigits(second);
  String ms = _threeDigits(millisecond);
  String us = microsecond == 0 ? "" : _threeDigits(microsecond);
  if (isUtc) {
    return "$y-$m-${d}T$h:$min:$sec.$ms${us}Z";
  } else {
    return "$y-$m-${d}T$h:$min:$sec.$ms$us";
  }
}