像HH:mm:ss这样格式化持续时间

Jon*_*nas 6 dart flutter

有没有一种很好的方式可以在不处理时区的情况下以hh:mm:ss这样的格式设置Duration?

我尝试了这个:

DateTime durationDate = DateTime.fromMillisecondsSinceEpoch(0);
String duration = DateFormat('hh:mm:ss').format(durationDate);
Run Code Online (Sandbox Code Playgroud)

但我总是要花1个小时,在这种情况下,它会说 01:00:00

当我这样做时:

Duration(milliseconds: 0).toString();
Run Code Online (Sandbox Code Playgroud)

我得到这个: 0:00:00.000000

Ale*_*Pad 28

你可以自己开始创建一种格式,来吧:

String sDuration = "${duration.inHours}:${duration.inMinutes.remainder(60)}:${(duration.inSeconds.remainder(60))}"; 
Run Code Online (Sandbox Code Playgroud)

  • 效果很好,但是你会丢失前导零,如果你想保留它们,只需为每个相关数据(小时、分钟、秒)添加 `.toString().padLeft(2, '0')` (8认同)
  • uration.inMinutes 是总分钟数,例如,如果持续时间为 2 小时,则分钟将为 120 (2认同)

fra*_*k06 21

HH:mm:ss从 a获取的最短、最优雅和可靠的方法Duration是:

format(Duration d) => d.toString().split('.').first.padLeft(8, "0");
Run Code Online (Sandbox Code Playgroud)

用法示例:

main() {
  final d1 = Duration(hours: 17, minutes: 3);
  final d2 = Duration(hours: 9, minutes: 2, seconds: 26);
  final d3 = Duration(milliseconds: 0);
  print(format(d1)); // 17:03:00
  print(format(d2)); // 09:02:26
  print(format(d3)); // 00:00:00
}
Run Code Online (Sandbox Code Playgroud)


Eva*_*Chu 19

只是一个快速的实施。

这将以 [DD]d:[HH]h:[mm]m:[ss]s 格式显示持续时间,如果前导元素为 0,则将忽略该元素。但秒将始终存在。

例如:

1天:2小时:3分:4秒

2h:3m:4s

3米:4秒

4s

0秒

  /// Returns a formatted string for the given Duration [d] to be DD:HH:mm:ss
  /// and ignore if 0.
  static String formatDuration(Duration d) {
    var seconds = d.inSeconds;
    final days = seconds~/Duration.secondsPerDay;
    seconds -= days*Duration.secondsPerDay;
    final hours = seconds~/Duration.secondsPerHour;
    seconds -= hours*Duration.secondsPerHour;
    final minutes = seconds~/Duration.secondsPerMinute;
    seconds -= minutes*Duration.secondsPerMinute;

    final List<String> tokens = [];
    if (days != 0) {
      tokens.add('${days}d');
    }
    if (tokens.isNotEmpty || hours != 0){
      tokens.add('${hours}h');
    }
    if (tokens.isNotEmpty || minutes != 0) {
      tokens.add('${minutes}m');
    }
    tokens.add('${seconds}s');

    return tokens.join(':');
  }
Run Code Online (Sandbox Code Playgroud)


csg*_*000 12

这是另一个版本。在这一点上这是所有偏好,但我喜欢它是干的,不需要函数声明(包装函数显然是可选的),尽管它肯定有点函数链接重。

袖珍的

String formatTime(double time) {
    Duration duration = Duration(milliseconds: time.round());
    return [duration.inHours, duration.inMinutes, duration.inSeconds].map((seg) => seg.remainder(60).toString().padLeft(2, '0')).join(':');
}
Run Code Online (Sandbox Code Playgroud)

格式化版本

String timeFormatter (double time) {
    Duration duration = Duration(milliseconds: time.round());

    return [duration.inHours, duration.inMinutes, duration.inSeconds]
      .map((seg) => seg.remainder(60).toString().padLeft(2, '0'))
      .join(':');
}
Run Code Online (Sandbox Code Playgroud)


die*_*per 10

您可以使用Duration和实现此方法:

      String _printDuration(Duration duration) {
        String twoDigits(int n) {
          if (n >= 10) return "$n";
          return "0$n";
        }

        String twoDigitMinutes = twoDigits(duration.inMinutes.remainder(60));
        String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60));
        return "${twoDigits(duration.inHours)}:$twoDigitMinutes:$twoDigitSeconds";
      }
Run Code Online (Sandbox Code Playgroud)

用法:

 final now = Duration(seconds: 30);
  print("${_printDuration(now)}");
Run Code Online (Sandbox Code Playgroud)

  • 或者只是 `n.toString().padLeft(2, "0")`。 (7认同)
  • 如果你想让它更短:`String TwoDigits(int n) =&gt; n &gt;= 10 ? “$n”:“0$n”;` (3认同)

Dan*_*tin 9

基于@diegoveloper 的回答,我把它变成了一个可扩展的扩展

extension DurationExtensions on Duration {
  /// Converts the duration into a readable string
  /// 05:15
  String toHoursMinutes() {
    String twoDigitMinutes = _toTwoDigits(this.inMinutes.remainder(60));
    return "${_toTwoDigits(this.inHours)}:$twoDigitMinutes";
  }

  /// Converts the duration into a readable string
  /// 05:15:35
  String toHoursMinutesSeconds() {
    String twoDigitMinutes = _toTwoDigits(this.inMinutes.remainder(60));
    String twoDigitSeconds = _toTwoDigits(this.inSeconds.remainder(60));
    return "${_toTwoDigits(this.inHours)}:$twoDigitMinutes:$twoDigitSeconds";
  }

  String _toTwoDigits(int n) {
    if (n >= 10) return "$n";
    return "0$n";
  }
}

Run Code Online (Sandbox Code Playgroud)


Cop*_*oad 8

定义这个:

extension on Duration {
  String format() => '$this'.split('.')[0].padLeft(8, '0');
}
Run Code Online (Sandbox Code Playgroud)

用法:

String time = Duration(seconds: 3661).format(); // 01:01:01
Run Code Online (Sandbox Code Playgroud)


Mic*_*ato 6

详细说明其他答案,这是一个也格式化天的实现:

extension DurationFormatter on Duration {
  /// Returns a day, hour, minute, second string representation of this `Duration`.
  ///
  ///
  /// Returns a string with days, hours, minutes, and seconds in the
  /// following format: `dd:HH:MM:SS`. For example,
  ///
  ///   var d = new Duration(days:19, hours:22, minutes:33);
  ///    d.dayHourMinuteSecondFormatted();  // "19:22:33:00"
  String dayHourMinuteSecondFormatted() {
    this.toString();
    return [
      this.inDays,
      this.inHours.remainder(24),
      this.inMinutes.remainder(60),
      this.inSeconds.remainder(60)
    ].map((seg) {
      return seg.toString().padLeft(2, '0');
    }).join(':');
  }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,intlDateFormat类没有帮助:它将 a 的格式标记Duration为未实现:

formatDuration(DateTime reference) ? String
NOT YET IMPLEMENTED. [...]
Run Code Online (Sandbox Code Playgroud)