2013-12-17 4 views
2

레일스 앱 (Rails 2.3.14 및 Ruby 1.8.7)에서 날짜/시간 문자열을 다른 형식으로 변환하여 검색을 수행하려고합니다. 내 MySQL 데이터베이스에서하지만 난 invalid date 오류가 발생하고 왜, 나는 몇 가지 유사한 질문을 읽었어요 알아낼 수가 없어하지만 여전히 문제를 해결할 수없는 것. 나는 그것이 초 프런트 엔드 표현에 포함되지 않는다는 사실과 관련되었을 수 있습니다 생각 예 시나리오는다른 형식으로 변환 할 때 datetime 문자열을 파싱 할 때 Ruby on Rails 유효하지 않은 날짜 오류가 발생했습니다

04/11/13 16:14 

2013-11-04 16:14 

# 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 

을 변환해야합니다 문자열의 정확한 datetime은 데이터베이스 테이블에 2013-11-04 16:14:52이므로 지금은 초를 포함했지만 여전히 같은 오류가 발생합니다. 검색 용어의 양쪽에 와일드 카드를 사용하여 LIKE 피연산자를 사용하고 있기 때문에 문제가되지 않으므로 몇 초가 지나야 작동합니다. 템플릿에 문제가 있습니다

답변

5

. 게다가 날짜 필드의 순서가 바뀝니다. 올바른 형식은 다음과 같습니다

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

난 당신이 strptimestrftime의 목적을 혼동 생각합니다. pstrptime은 "구문 분석"(String에서 DateTime)으로, strftimef은 "형식"(다른 방향)을 나타냅니다.

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

는 시도 : 당신이 원하는 결과를 얻을 수 %y (약식 두 자리 년)와 형식에 슬래시를 사용하고 %Y (4 자리 연도)를 교체해야 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

"이 작은 기능을 위해 보석을 사용하지는 않을 것입니다." 당신은 레일즈를 사용하고 있습니다. 그것은 모든 보석들로 이루어져 있습니다. 잘 쓰여진 보석은 표준 라이브러리에서 무언가를 사용하는 것보다 비용을 들이지는 않지만 Ruby 배포판의 일부가 아닙니다. –

+0

내 대답이 업데이트되었습니다. – MatthewFord

1

strptime는 주어진 형식을 사용하여 날짜 객체로 주어진 문자열로 변환합니다.

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