他人様のコードをメンテする必要があって、コードを追ってると、%j
な年月日を UNIX time
に変換するのに、面倒な事やってた。
で、嫌気が差して、「ruby
でも strptime
あるだろ?」と適当に探すと、ビンゴ!!
問題発生
差し替える前に、テスト。
以下の様なコードを実行
$ ruby -e 'require "time" ; p Time.strptime("2003,070,12:21:51 JST", "%Y,%j,%H:%M:%S %z").to_i'
1041391311
# ↑ 2003/01/01 12:21:51 JST
問題発生。
え? %j
解釈してくれないの?
ググって見ても答えは得られず1
色々試して、、、
結論
古い ruby
の Time
クラス(モジュール?)の .strptime
は、%j
解釈してくれないっぽい2
検証では、2.7.1p83
はOKだった3
検証
以下のコードを、1.9.2p290
, 2.0.0p481
, 2.7.1p83
で、それぞれ実行
test.rb
require 'date'
require 'time'
# コントロール用の自作関数
def manu(t)
arr = t.split(/[,: ]/).map(&:to_i)
Time.mktime(arr[0],1,1,arr[2],arr[3],arr[4]) + ( arr[1] - 1) * 24 * 60 * 60
end
str = "2003,070,12:21:51 JST"
# DateTime.strptime の結果
p DateTime.strptime(str, "%Y,%j,%H:%M:%S %z").strftime("%s").to_i
# 自作関数の結果
p ( manu str ).to_i
# Timme.strptime の結果
p Time.strptime(str, "%Y,%j,%H:%M:%S %z").to_i
1.9.2
と、2.0.0
では、Time.strptime
は %j
を解釈しない。DateTime.strptime
は解釈してくれる。
1.9.2p290,2.0.0p481
$ ruby test.rb
1047352911
1047352911
1041391311 # <= 2003/01/01 12:21:51 JST
に対し、2.7.1
は Time.strptime
も解釈してくれてる。
2.7.1p83
$ ruby test.rb
1047352911
1047352911
1047352911
ruby
版の delta
みたいなのがあれば、それ読めば一発なんだろうけど、そこまでの情熱は湧かない、、、