くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

DartのDurationをいい感じにフォーマットする

DartのDurationにHH:mm:ss.SSみたいにフォーマットしたかったので、
いろいろ調べてみたときの備忘録(*´ω`*)

Formatterはないっぽく、自前で整形しないといけないっぽい。。

整形する関数

HH:mm:ss.SSっぽくするのはこんな感じ。

String formatDuration(Duration d) {
  String twoDigits(int n) {
    if (n.isNaN) return "00";
    return n.toString().padLeft(2, "0").substring(0, 2);
  }
  
  // 符号の取得
  String negativeSign = d.isNegative ? '-' : '';
  
  // 各値の絶対値を取得
  int hour = d.inHours.abs();
  int min = d.inMinutes.remainder(60).abs();
  int sec = d.inSeconds.remainder(60).abs();
  int mills = d.inMilliseconds.remainder(1000).abs();

  // 各値を2桁の文字列に変換
  String strHour = twoDigits(hour);
  String strMin = twoDigits(min);
  String strSec = twoDigits(sec);
  String strMills = twoDigits(mills);
  
  // フォーマット
  return "$negativeSign$strHour:$strMin:$strSec.$strMills";
}

extensionで拡張する

毎回書くのも面倒なので、Extensionを使って、 DurationにfmtHHmmssSS()を生やしてみる。

extension DurationEx on Duration {
  String fmtHHmmssSS() {
    return formatDuration(this);
  }
}

以上!!これでいい感じにフォーマットできる。。(*´ω`*)

参考にしたサイトさま