- (decode-universal-time ut)
- (declare (ignore daylight-p zone))
- (format nil "~[Mon~;Tue~;Wed~;Thu~;Fri~;Sat~;Sun~], ~d ~[Jan~;Feb~;Mar~;Apr~;May~;Jun~;Jul~;Aug~;Sep~;Oct~;Nov~;Dec~] ~d ~2,'0d:~2,'0d:~2,'0d"
- dow
- day
- (1- mon)
- year
- hr min sec))))
+ (decode-universal-time ut)
+ (declare (ignore daylight-p zone))
+ (format nil "~[Mon~;Tue~;Wed~;Thu~;Fri~;Sat~;Sun~] ~d ~[Jan~;Feb~;Mar~;Apr~;May~;Jun~;Jul~;Aug~;Sep~;Oct~;Nov~;Dec~] ~d ~2,'0d:~2,'0d:~2,'0d"
+ dow
+ day
+ (1- mon)
+ year
+ hr min sec))))
+
+(eval-when (:compile-toplevel :load-toplevel :execute)
+ (defconstant +minute-seconds+ 60)
+ (defconstant +hour-seconds+ (* 60 +minute-seconds+))
+ (defconstant +day-seconds+ (* 24 +hour-seconds+))
+ (defconstant +week-seconds+ (* +day-seconds+ 7))
+ (defconstant +month-seconds+ (* +day-seconds+ (/ 365.25 12)))
+ (defconstant +year-seconds+ (* +day-seconds+ 365.25)))
+
+(defun seconds-to-condensed-time-string (sec &key (dp-digits 0))
+ "Prints a quantity of seconds as a condensed string. DP-DIGITS controls
+how many digits after decimal point."
+ (multiple-value-bind (year yrem) (floor (coerce sec 'double-float) +year-seconds+)
+ (multiple-value-bind (month mrem) (floor yrem +month-seconds+)
+ (multiple-value-bind (week wrem) (floor mrem +week-seconds+)
+ (multiple-value-bind (day drem) (floor wrem +day-seconds+)
+ (multiple-value-bind (hour hrem) (floor drem +hour-seconds+)
+ (multiple-value-bind (minute minrem) (floor hrem +minute-seconds+)
+ (let ((secstr (if (zerop dp-digits)
+ (format nil "~Ds" (round minrem))
+ (format nil (format nil "~~,~DFs" dp-digits) minrem))))
+ (cond
+ ((plusp year)
+ (format nil "~Dy~DM~Dw~Dd~Dh~Dm~A" year month week day hour minute secstr))
+ ((plusp month)
+ (format nil "~DM~Dw~Dd~Dh~Dm~A" month week day hour minute secstr))
+ ((plusp week)
+ (format nil "~Dw~Dd~Dh~Dm~A" week day hour minute secstr))
+ ((plusp day)
+ (format nil "~Dd~Dh~Dm~A" day hour minute secstr))
+ ((plusp hour)
+ (format nil "~Dh~Dm~A" hour minute secstr))
+ ((plusp minute)
+ (format nil "~Dm~A" minute secstr))
+ (t
+ secstr))))))))))