`DateTime.strptime` returns weekday/time 字符串的无效日期

`DateTime.strptime` returns invalid date for weekday/time string

为什么 Ruby 的 strptime 不能将其转换为 DateTime 对象:

DateTime.strptime('Monday 10:20:20', '%A %H:%M:%S')
# => ArgumentError: invalid date

虽然这些有效?

DateTime.strptime('Wednesday', '%A')
# => #<DateTime: 2015-11-18T00:00:00+00:00 ((2457345j,0s,0n),+0s,2299161j)>
DateTime.strptime('10:20:20', '%H:%M:%S')
# => #<DateTime: 2015-11-18T10:20:20+00:00 ((2457345j,37220s,0n),+0s,2299161j)>

这看起来像一个错误 - 是正确的。不过,现在有一个解决方法(因为您可能希望它现在 起作用):

您可以在 space 上拆分它,从工作日获取日期,然后从另一个字符串获取时间部分(使用 minitech 提到的 _strptime 方法)。然后你可以将第一个日期的时间设置为第二个字符串的时间组件:

def datetime_from_weekday_time_string(string)
  components = string.split(" ")
  date = DateTime.strptime(components[0], '%A')
  time = Date._strptime(components[1], '%H:%M:%S') # returns a hash like {:hour=>10, :min=>20, :sec=>20} 
  return date.change(time)
end

2.2.2 :021 > datetime_from_weekday_time_string("Monday 10:20:20")
 => Mon, 16 Nov 2015 10:20:20 +0000 

2.2.2 :022 > datetime_from_weekday_time_string("Saturday 11:45:21")
 => Sat, 21 Nov 2015 11:45:21 +0000

2.2.2 :023 > datetime_from_weekday_time_string("Thursday 23:59:59")
 => Thu, 19 Nov 2015 23:59:59 +0000