2013-12-17 29 views
2

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

# 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 

示例场景

04/11/13 16:14 

应该转换为

2013-11-04 16:14 

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

回答

5

你应该在格式%y(简称两位数年份)使用斜线和替换%Y(四位数年份),以获得所需的结果。此外,日期字段的顺序是相反的。正确的格式应该是:

"%d/%m/%y %H:%M" 

我想你混淆strptimestrftime目的。 strptime代表“解析”(DateTime from String),而f代表“格式”(另一个方向),而strftime代表“格式”(另一个方向)。

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 

以后可以将其与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") 
+0

谢谢,这个工作完美 – martincarlin87

+0

你是这个网站上最聪明的一个。 – Fuser97381

+0

我很谦虚,但我怀疑;-) –

1

没有您的模板问题,请尝试:DateTime.strptime("04/11/13 16:14", "%d/%m/%y %H:%M")

+0

我以为解析是内置到'strptime'函数中的? - http://ruby-doc.org/stdlib-2.0.0/libdoc/date/rdoc/DateTime.html#M000214。我宁愿不使用宝石只是为了这个小小的功能。 – martincarlin87

+1

“我宁可不使用宝石只是为了这个小小的功能。”?你正在使用Rails;它由一大堆宝石组成。一个写得好的gem不会因为使用标准库中的某些东西而产生任何成本,它只是不属于Ruby发行版的一部分。 –

+0

对,更新了我的答案。 – MatthewFord

1

strptime给定的字符串转换成使用给定格式的日期时间对象。

DateTime.strptime("04/11/13 16:14", "%m/%d/%y %H:%M").strftime("%Y-%m-%d %H:%M") 
相关问题