String formatFriendlyDuration(Duration d) { final seconds = (d.inSeconds.remainder(Duration.secondsPerMinute)).toString().padLeft(2, '0'); if (d.inHours == 0) return '${d.inMinutes}:$seconds'; final minutes = (d.inMinutes.remainder(Duration.minutesPerHour)).toString().padLeft(2, '0'); return '${d.inHours}:$minutes:$seconds'; } String formatPreciseDuration(Duration d) { final millis = ((d.inMicroseconds / 1000.0).round() % 1000).toString().padLeft(3, '0'); final seconds = (d.inSeconds.remainder(Duration.secondsPerMinute)).toString().padLeft(2, '0'); final minutes = (d.inMinutes.remainder(Duration.minutesPerHour)).toString().padLeft(2, '0'); final hours = (d.inHours).toString().padLeft(2, '0'); return '$hours:$minutes:$seconds.$millis'; } extension ExtraDateTime on DateTime { bool isAtSameYearAs(DateTime? other) => year == other?.year; bool isAtSameMonthAs(DateTime? other) => isAtSameYearAs(other) && month == other?.month; bool isAtSameDayAs(DateTime? other) => isAtSameMonthAs(other) && day == other?.day; bool get isToday => isAtSameDayAs(DateTime.now()); bool get isYesterday => isAtSameDayAs(DateTime.now().subtract(Duration(days: 1))); bool get isThisMonth => isAtSameMonthAs(DateTime.now()); bool get isThisYear => isAtSameYearAs(DateTime.now()); }