ファイルのタイムスタンプを取得【その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]" ?