Shammer's Philosophy

My private adversaria

ファイルのタイムスタンプを取得【その3】

ファイルのタイムスタンプを取得【その2】 - Shammerismの内容をさらに改良。月と曜日をアルファベットにした。さらに、書いていて気付いたが、時間を引数で渡す方がいい。まだ具体的に活用する前だけれども、今の時点でも

  • ファイルのタイムスタンプ
  • 現在(実行した瞬間)のタイムスタンプ

は取得できるようにしておきたい。それぞれ

  • (file-write-time file):ファイルのタイムスタンプ
  • (get-universal-time):現在(実行した瞬間)のタイムスタンプ

で取得できる。なるべく、date コマンドと同じような表示になるようにしてみた。

(defun get-timestamp-as-string (time)
  (let ((day-names '("Mon" "Tue" "Wed" "Thu" "Fri" "Sat" "Sun"))
        (mon-names '("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")))
    (labels
        ((pad (n)
              (if (< (length (write-to-string n)) 2)
                  (concatenate 'string "0" (write-to-string n))
                (write-to-string n))))
      (multiple-value-bind
          (second minute hour date month year day-of-week dst-p time-zone)
          (decode-universal-time time)
        (concatenate 'string
                     "[" (nth day-of-week day-names) " " (nth (- month 1) mon-names) " " (pad date) " "
                     (pad hour) ":" (pad minute) ":" (pad second) " " (write-to-string year) "]")))))

ただ、タイムゾーンが難しい。日本だと -9 とかいう値で返ってくるけれど、これも全てのタイムゾーンの文字表記を用意しないとダメだろうか。
なお、上記関数は以下のように実行できる。

? (get-timestamp-as-string (get-universal-time))
"[Mon May 17 00:19:01 2010]"
? (get-timestamp-as-string (file-write-date "test.txt"))
"[Wed May 12 01:17:04 2010]"
?