68 votes

Formatage d'une durée comme HH: mm: ss

Existe-t-il un bon moyen de formater une durée en quelque chose comme hh: mm: ss, sans avoir à gérer les fuseaux horaires?

J'ai essayé ceci:

 DateTime durationDate = DateTime.fromMillisecondsSinceEpoch(0);
String duration = DateFormat('hh:mm:ss').format(durationDate);

Mais je reçois toujours 1 heure de trop, dans ce cas, cela dirait 01:00:00

Et quand je fais ça:

 Duration(milliseconds: 0).toString();

J'obtiens ceci: 0:00:00.000000

159voto

diegoveloper Points 24042

Vous pouvez utiliser Duration et implémenter cette méthode:

 String _printDuration(Duration duration) {
  String twoDigits(int n) => n.toString().padLeft(2, "0");
  String twoDigitMinutes = twoDigits(duration.inMinutes.remainder(60));
  String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60));
  return "${twoDigits(duration.inHours)}:$twoDigitMinutes:$twoDigitSeconds";
}

Usage:

 final now = Duration(seconds: 30);
print("${_printDuration(now)}");

41voto

AlexPad Points 1432

Vous pouvez commencer à créer un format vous-même, allez sur celui-ci:

 String sDuration = "${duration.inHours}:${duration.inMinutes.remainder(60)}:${(duration.inSeconds.remainder(60))}"; 

28voto

Frank Treacy Points 2118

Le moyen le plus court, le plus élégant et le plus fiable d'obtenir HH:mm:ss partir d'un Duration est de faire:

 format(Duration d) => d.toString().split('.').first.padLeft(8, "0");

Exemple d'utilisation:

 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
}

24voto

Evan Chu Points 581

Juste une mise en œuvre rapide.

Cela affichera la durée au format [JJ] d: [HH] h: [mm] m: [ss] s, et ignorera l'élément principal s'il était 0. Mais les secondes seront toujours présentes.

Par example:

1j: 2h: 3m: 4s

2h: 3m: 4s

3m: 4s

4 s

0s

   /// 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(':');
  }

14voto

csga5000 Points 2024

Voici une autre version. C'est toute préférence à ce stade, mais j'ai aimé que ce soit sec et qu'il n'ait pas besoin d'une déclaration de fonction (la fonction d'emballage est évidemment facultative) bien que ce soit définitivement un enchaînement de fonctions un peu lourd.

Compact

 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(':');
}

Version formatée

 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(':');
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X