解析日期时间字符串以转换为其他格式时,Ruby on Rails无效日期错误

mar*_*n87 2 ruby datetime ruby-on-rails strptime ruby-on-rails-2

在我的Rails应用程序(Rails 2.3.14和Ruby 1.8.7)中,我试图将日期时间字符串转换为不同的格式,以便在我的MySQL数据库上执行搜索但是我收到 invalid date错误,我似乎无法弄清楚为什么,我已经阅读了一些类似的问题,但我似乎仍无法解决这个问题.

# check if filter contains a time stamp
if params[:sSearch].include?('/') and params[:sSearch].include?(':')
  datetime = DateTime.strptime(params[:sSearch], "%Y-%m-%d %H:%M")
  params[:sSearch] = datetime
end
Run Code Online (Sandbox Code Playgroud)

示例场景

04/11/13 16:14
Run Code Online (Sandbox Code Playgroud)

应转换为

2013-11-04 16:14
Run Code Online (Sandbox Code Playgroud)

我认为这可能是因为秒不包含在字符串的前端表示中,因为datetime数据库表中的精确是2013-11-04 16:14:52这样的,所以我现在包括秒,但仍然得到相同的错误,我不知道我认为这应该很重要,因为我LIKE在搜索词的任一侧使用带有通配符的操作数,所以即使没有它应该工作的秒数.

Pat*_*ity 7

您应该使用格式的斜杠并%Y%y(缩写为两位数年份)替换(四位数年份)以获得所需的结果.此外,日期字段的顺序相反.正确的格式是:

"%d/%m/%y %H:%M"
Run Code Online (Sandbox Code Playgroud)

我觉得你混淆了strptime和的目的strftime.而pin strptime代表"parse"(make DateTimefrom String),而fin strftime代表"format"(另一个方向).

require 'date'

DateTime.strptime("04/11/13 16:14", "%Y-%m-%d %H:%M")
# ArgumentError: invalid date

DateTime.strptime("04/11/13 16:14", "%d/%m/%Y %H:%M")
#=> #<DateTime: 0013-11-04T16:14:00+00:00 ((1722836j,58440s,0n),+0s,2299161j)>
# Wrong! You do not want the year 0013, but 2013

DateTime.strptime("04/11/13 16:14", "%d/%m/%y %H:%M")
#=> #<DateTime: 2004-11-13T16:14:00+00:00 ((2453323j,58440s,0n),+0s,2299161j)>
# Correct
Run Code Online (Sandbox Code Playgroud)

您可以稍后将其转换为所需的格式,DateTime#strftime如下所示:

# parse the user input to a DateTime object
datetime = DateTime.strptime("04/11/13 16:14", "%d/%m/%y %H:%M")

# reformat it
params[:sSearch] = datetime.strftime("%Y-%m-%d %H:%M")
Run Code Online (Sandbox Code Playgroud)