パーソナルツール

日付、時間の計算

作者: 小見 拓 最終変更 2012年01月08日 12時10分

日付、時間の計算

  • localtime()は1970年からの秒を返す。strftime()で文字列表記に変換できる。
:let now = localtime()
:echo now
"# => 1203574847
:echo strftime("%Y/%m/%d %H:%M:%S", now)
"# => 2008/02/21 15:20:47
  • 1時間前。
:let hour = (60 * 60)
:echo strftime("%Y/%m/%d %H:%M:%S", now - hour)
"# => 2008/02/21 14:20:47
  • 1日前。
:let day = (60 * 60 * 24)
:echo strftime("%Y/%m/%d %H:%M:%S (%A)", now - day)
"# => 2008/02/20 15:20:47 (水曜日)
  • 31日前。
:let month = (60 * 60 * 24 * 31)
:echo strftime("%Y/%m/%d %H:%M:%S (%A)", now - month)
"# => 2008/01/21 15:20:47 (月曜日)
  • 365日前。
:let year = (60 * 60 * 24 * 365)
:echo strftime("%Y/%m/%d %H:%M:%S (%A)", now - year)
"# => 2007/02/21 15:20:47 (水曜日)
  • 日付から経過秒数をとる(日本時間)。
:function! Localtime(year, month, day, hour, minute, second)
    " days from 0000/01/01
    :let l:year  = a:month < 3 ? a:year - 1   : a:year
    :let l:month = a:month < 3 ? 12 + a:month : a:month
    :let l:days = 365*l:year + l:year/4 - l:year/100 + l:year/400 + 306*(l:month+1)/10 + a:day - 428

    " days from 0000/01/01 to 1970/01/01
    " 1970/01/01 == 1969/13/01
    :let l:ybase = 1969
    :let l:mbase = 13
    :let l:dbase = 1
    :let l:basedays = 365*l:ybase + l:ybase/4 - l:ybase/100 + l:ybase/400 + 306*(l:mbase+1)/10 + l:dbase - 428

    " seconds from 1970/01/01
    :return (l:days-l:basedays)*86400 + (a:hour-9)*3600 + a:minute*60 + a:second
:endfunction

:let ltime = Localtime(2008, 2, 23, 14, 23, 0)
:echo ltime
:echo strftime("%Y/%m/%d %H:%M:%S (%A)", ltime)
"# => 1203744180
"# => 2008/02/23 14:23:00 (土曜日)
  • 経過秒数から日付、時間、曜日表示。
:function! Localtime(year, month, day, hour, minute, second)
    " days from 0000/01/01
    :let l:year  = a:month < 3 ? a:year - 1   : a:year
    :let l:month = a:month < 3 ? 12 + a:month : a:month
    :let l:days = 365*l:year + l:year/4 - l:year/100 + l:year/400 + 306*(l:month+1)/10 + a:day - 428

    " days from 0000/01/01 to 1970/01/01
    " 1970/01/01 == 1969/13/01
    :let l:ybase = 1969
    :let l:mbase = 13
    :let l:dbase = 1
    :let l:basedays = 365*l:ybase + l:ybase/4 - l:ybase/100 + l:ybase/400 + 306*(l:mbase+1)/10 + l:dbase - 428

    " seconds from 1970/01/01
    :return (l:days-l:basedays)*86400 + (a:hour-9)*3600 + a:minute*60 + a:second
:endfunction

:let ltime = Localtime(2008, 2, 23, 14, 23, 0)

:echo strftime("%Y/%m/%d", ltime)
"# => 2008/02/23
:echo strftime("%H:%M:%S", ltime)
"# => 14:23:00
:echo strftime("%Y/%m/%d %H:%M:%S", ltime)
"# => 2008/02/23 14:23:00

:echo strftime("%B", ltime)
"# => 2月
:echo strftime("%b", ltime)
"# => 2

:echo strftime("%a", ltime)
"# => 土
:echo strftime("%A", ltime)
"# => 土曜日
ドキュメントアクション
コメント
blog comments powered by Disqus