bash, 78 байтов (с использованием утилиты BSD) или 79 байтов (также не-BSD)
Это немного длиннее, чем у @DigitalTrauma и красивого 71-байтового bash-решения @ hvd, но мне здесь очень понравилась идея использования чисел в 60-й строке; Мне любопытно, может кто-нибудь еще немного поиграть в гольф.
С помощью стандартной утилиты BSD:
jot '-wx=`dc<<<60do3^%d+n`;((`dc<<<$x++'$1'-n`))||tr \ :<<<${x:3}' 86400 0|sh
С более универсально доступной утилитой seq:
seq '-fx=`dc<<<60do3^%.f+n`;((`dc<<<$x++'$1'-n`))||tr \ :<<<${x:3}' 0 86399|sh
Идея состоит в том, чтобы сгенерировать числа от 0 до 83699 и использовать dc для преобразования их в base 60. «Цифры» в выводе dc base-60 представляют собой двузначные числа от 00 до 59, с пробелами, разделяющими «цифры», поэтому в нем перечислены все желаемые времена с 00 00 00 до 23 59 59 почти в необходимом формате.
Если вы выполняете это буквально, числа ниже 60 ^ 2 не являются трехзначными числами в базе 60, поэтому начальные 00 или 00 00 отсутствуют. По этой причине я на самом деле генерирую числа от 60 ^ 3 до 60 ^ 3 + 83699; это гарантирует, что все сгенерированные числа имеют длину ровно 4 цифры в базе 60. Это нормально, пока я в конечном итоге выбрасываю лишнюю первую цифру (01), которая не нужна.
Итак, как только желаемое время сгенерировано, я просто беру каждую четверку с 01 00 00 00 до 01 23 59 59, добавляю последние три числа и вычитаю аргумент $ 1. Если это 0, то я беру все в четверке с 3-го символа (отбрасывая «01»), использую tr для преобразования пробелов в двоеточия и печатаю результат.