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:設定によっては、異なる動作になるので注意