0

これらの入力で何が起こったのか疑問に思って、2013-05-31 13:30:00 -0400

Time.parse("05-31 13:30") => 2013-06-06 16:30:00 -0400

Time.parse("5 31 13:30")  => 2013-07-01 13:30:00 -0400
4

2 に答える 2

2

@SergioTulentsevのコメントは問題を指摘しています。Date.parse人々が日付/日時の値を構造化する方法のすべての可能な組み合わせを知ることはできません。そのため、Date は をサポートしておりstrptime、パターンを定義できます。

require 'date'
DateTime.strptime("05-31 13:30", '%m-%d %H:%M')
=> #<DateTime: 2013-05-31T13:30:00+00:00 ((2456444j,48600s,0n),+0s,2299161j)>
DateTime.strptime("5 31 13:30", '%m %d %H:%M')
=> #<DateTime: 2013-05-31T13:30:00+00:00 ((2456444j,48600s,0n),+0s,2299161j)>

問題は、特定の日付文字列に使用するフォーマット文字列の 1 つになります。このテストでは、2 番目の日時文字列を変更して、コードが正しく機能していることをより明確にしました。

require 'date'
DATE_PATTERNS = {
  /[0-2]\d-\d{2} \d{2}:\d{2}/  => '%m-%d %H:%M',
  /[0-2]?\d \d{1,2} \d{2}:\d{2}/ => '%m %d %H:%M'
}

puts ["05-31 13:30", "5 31 13:31"].map { |str|
  pattern = DATE_PATTERNS.keys.find { |k|
    str[k]
  }
  puts pattern.source
  DateTime.strptime(str[pattern], DATE_PATTERNS[pattern]).to_s
}

どの出力:

[0-2]\d-\d{2} \d{2}:\d{2}
[0-2]?\d \d{1,2} \d{2}:\d{2}
2013-05-31T13:30:00+00:00
2013-05-31T13:31:00+00:00
于 2013-06-04T22:11:52.087 に答える