65 strftime() に関するメモ

はじめに

:h strftime()

簡単な使い方とサンプル

第一引数は format, 省略可能な第二引数は time 。time が省略された場合は、現在時刻が使用される。time には localtime() で取得した数値(1970年1月1日からの秒数)を渡すことが多い。

:let time = localtime()
:echo 'today   : ' . strftime('%Y-%m-%d %H:%M:%S', time)
:echo 'tomorrow: ' . strftime('%Y-%m-%d %H:%M:%S', time + 24 * 60 * 60)

こんな感じ。別に難しい関数じゃない。自分の中では、使用頻度が高い関数だと思う。

タイムゾーンを考慮する

strftime() はタイムゾーンを考慮する。コードを見てもらえば早い。日本でごく普通のパソコンで動かした場合は以下のようになる。

" strftime() は '1970-01-01 09:00:00' を返す
:echo strftime('%Y-%m-%d %H:%M:%S', 0)

1970年1月1日からの秒数を渡したはずなのに、出力を見ると 09:00:00 からはじまっていることが分かってもらえれば良い。*1ここで使われるタイムゾーンはおそらくOSに設定されているもの。Windows XPであれば「コントロールパネル」の「日付と時刻」からタイムゾーンを変更することで、strftime() の方も変更されることを確認した。

有効範囲

次に有効範囲。意外と扱える年の幅が狭いことに注意したい。

おそらくコンパイル時に決めることだと思うが、Kaoriya さん配布の Vim7 は 32 bit int ぽい( time_t の大きさが問題になるのかな?普段使う分には全然問題ないっす)。適当に大きな数値を :echo してやればわかると思う。

で、自分の環境 GMT+09:00 での strftime() の有効範囲は
'1970-01-01 09:00:00' ( 0 ) から
'2038-01-19 12:14:07' ( 2147483647 ) 。
いわゆる2038年問題の時間+9時間(タイムゾーン)。ちなみに 負の数を渡すと '(無効)' が返される。

使うときに注意すべきこと

第一引数の format は環境依存。そもそも strftime() がない場合もある。

if !exists('*strftime') || 
      \ strftime('%Y-%m-%d %H:%M:%S') !~# '^\d\{4}-\d\d-\d\d \d\d:\d\d:\d\d$'
  finish
endif

関数があるかどうかと、特定のフォーマットが使えるか確認しておくといいかもしれない。ここで使われたようなものは、きっとほとんどの環境で使用可能だと思う。思いたい。

自分メモみたいな感じ。明日は、これを使って日付をあらわす文字列から数値への変換をしたい。

*1:設定によっては、異なる動作になるので注意