Vimで現在の日付・時刻を挿入する方法(strftime)
議事録やメモを書いているとき、Excelの「現在日時の挿入」ショートカットのような機能がVimにも欲しくなります。プラグインを入れなくても、標準のstrftime()関数を使えば、好きなフォーマットで日付・時刻を挿入できます。
目次(10項目)
基本の書き方
:put =strftime('%Y/%m/%d')
:putは式の評価結果をカーソル行の下に挿入するコマンドです。strftime()にフォーマット文字列を渡せば、任意の形式で現在日時の文字列を生成できます。
## 議事録
:put =strftime(...)## 議事録
2026/08/05
フォーマット文字列を変えれば、時刻だけ・日時両方など自由に整形できます。
:put =strftime('%Y/%m/%d') " 2026/08/05
:put =strftime('%H:%M:%S') " 14:30:00
:put =strftime('%Y/%m/%d %H:%M:%S') " 2026/08/05 14:30:00
インサートモード中に挿入する
文章を書いている途中でカーソル行に改行を挟まず埋め込みたい場合は、式レジスタを使います。
Ctrl-r =strftime('%Y/%m/%d')<CR>
インサートモード中にCtrl-rの後=を押すと式レジスタの入力になり、評価結果がその場に挿入されます。:putと違って改行を挟まない点が使い分けのポイントです。
:put =strftime(...)、文中にそのまま埋め込むならCtrl-r =strftime(...)。キーマッピングで呼び出せるようにする
毎回打つのは手間なので、設定ファイルにマッピングしておくと便利です。
nnoremap <leader>dt :put =strftime('%Y/%m/%d')<CR>
inoremap <C-g>t <C-r>=strftime('%Y/%m/%d')<CR>
ノーマルモード用とインサートモード用の両方を用意しておくと、書いている途中でも呼び出しやすくなります。曜日を含めたい場合は%a(英語略称、例:Mon)を組み合わせます。
:put =strftime('%Y/%m/%d (%a)')
コマンド化してさらに短くする
マッピングだけでなく、ユーザー定義コマンドとして名前を付けておくとさらに呼び出しやすくなります。
command! Today put =strftime('%Y/%m/%d')
command! Now put =strftime('%Y/%m/%d %H:%M:%S')
コマンド名を打てば補完も効くので、マッピングを忘れてしまったときでも:Todまで打ってTabで補完すれば思い出せます。議事録用のテンプレートファイルと組み合わせて、ファイルを開いた瞬間に日付が入るようにするautocmdと合わせて使う人もいます。
よく使うフォーマット指定子
| 指定子 | 意味 |
|---|---|
%Y | 4桁の年 |
%m | 2桁の月 |
%d | 2桁の日 |
%H:%M:%S | 時:分:秒 |
%a | 曜日の英語略称 |
議事録用のMarkdownファイルの見出しに日付を入れる作業が多く、leaderキーにstrftimeのマッピングを仕込んでからは手打ちしなくなりました。プラグインなしで標準関数だけで完結するので、環境を移しても設定ファイルをコピーするだけで同じように動くのも気に入っています。
明日や先月の日付を入れる
strftime() は2つ目の引数に時刻を秒で渡せます。localtime() が現在時刻を秒で返すので、そこに足し引きすれば任意の日付になります。手元のVim 9.1.1752で 86400(1日ぶんの秒数)を足すと、翌日の日付が返りました。
:put=strftime('%Y/%m/%d', localtime() + 86400) " 明日
:put=strftime('%Y/%m/%d', localtime() - 86400) " 昨日
:put=strftime('%Y/%m', localtime() - 86400 * 30) " 30日前の年月
週次の議事録に「次回」の日付を入れる、締め切りを1週間後で書く、といった用途に使えます。月をまたぐ計算は日数がずれるので、月単位で正確に扱いたいときは日付を手で書いたほうが確実です。
曜日の表記は環境で変わる
%A(曜日)や %B(月名)は、Vimが見ているロケールによって出力が変わります。同じVim 9.1.1752でも、既定のままなら 火曜日、:language time C を実行したあとは Tuesday になりました。
:language time C " 英語表記にする
:put=strftime('%A') " Tuesday
:language time ja_JP.UTF-8 " 日本語表記に戻す
自分の環境では日本語で出るのに、サーバー上のVimでは英語で出る、という食い違いはこれが原因です。書式を固定したいなら、設定ファイルで language time を明示しておくと環境をまたいでも揃います。
更新日を保存のたびに書き換える
挿入した日付を手で直し忘れるのが嫌なら、保存時に自動で書き換える方法があります。ファイルの先頭数行に決まった書式の行を置いておき、BufWritePre でその行だけを置換します。
autocmd BufWritePre *.md
\ silent! execute '1,5s/^updated: .*/updated: '
\ . strftime('%Y-%m-%d') . '/e'
置換の対象を先頭5行に絞っているのは、本文中に同じ書式の行があっても巻き込まないようにするためです。e フラグを付けておくと、対象が見つからなくてもエラーになりません。書き換わるのは保存した瞬間なので、中身を変えていないファイルの更新日が動くことはありません。
まとめ
現在日時の挿入はstrftime()関数だけで完結します。:putと式レジスタを使い分け、よく使うフォーマットはキーマッピングしておくと、Excelのショートカットのような感覚で呼び出せます。