bash, 78 byte (sử dụng tiện ích BSD) hoặc 79 byte (cũng không phải BSD)
Thời gian này dài hơn một chút so với giải pháp bash 71 byte đẹp mắt của @DigitalTrauma và @ hvd, nhưng tôi khá thích ý tưởng ở đây là sử dụng các số trong cơ sở 60; Tôi tò mò nếu có ai có thể đánh gôn này thêm một chút nữa.
Với tiện ích ghi chú chuẩn BSD:
jot '-wx=`dc<<<60do3^%d+n`;((`dc<<<$x++'$1'-n`))||tr \ :<<<${x:3}' 86400 0|sh
Với tiện ích seq phổ biến hơn:
seq '-fx=`dc<<<60do3^%.f+n`;((`dc<<<$x++'$1'-n`))||tr \ :<<<${x:3}' 0 86399|sh
Ý tưởng là tạo ra các số từ 0 đến 83699 và sử dụng dc để chuyển đổi chúng thành cơ sở 60. "Các chữ số" trong đầu ra cơ sở 60 của dc là các số có 2 chữ số từ 00 đến 59, với các khoảng cách phân tách "chữ số", vì vậy cái này liệt kê tất cả các thời gian mong muốn từ 00 00 00 đến 23 59 59 ở hầu hết các định dạng cần thiết.
Tuy nhiên, nếu bạn thực hiện điều đó theo nghĩa đen, các số dưới 60 ^ 2 không phải là số có 3 chữ số trong cơ sở 60, do đó, 00 hoặc 00 00 ban đầu bị thiếu. Vì lý do đó, tôi thực sự tạo ra các số từ 60 ^ 3 đến 60 ^ 3 + 83699; điều này đảm bảo rằng tất cả các số được tạo có độ dài chính xác là 4 chữ số trong cơ sở 60. Điều này cũng được miễn là cuối cùng tôi vứt bỏ chữ số đầu tiên (01) không cần thiết.
Vì vậy, một khi thời gian mong muốn được tạo, tôi chỉ cần lấy mỗi số bốn từ 01 00 00 đến 01 23 59 59, thêm ba số cuối và trừ đi đối số $ 1. Nếu đó là 0, thì tôi lấy mọi thứ trong bộ tứ từ ký tự thứ 3 trở đi (vứt bỏ "01"), sử dụng tr để chuyển đổi khoảng trắng thành dấu hai chấm và in kết quả.