2014-11-22 2 views
5

날짜 형식은 다음과 같습니다. 23 Nov. 2014. 23 May 2014 같은 닷은 없다 -Ruby를 사용하여 날짜로 문자열 변환

Date.strptime(my_string, '%d %b. %Y') 

을하지만 달은 월 하나 문제가있다 : 물론, 그러한 식으로 날짜로이 문자열을 변환하기 쉽습니다. 그리고 내 표정이 끊어집니다.

누군가이 문제에 도움을 줄 수 있습니까? 내 사례를 보편적으로 표현할 수있는 방법은 무엇입니까?

답변

3

my_string에서 날짜 패턴을 제거하십시오.

Date.strptime(my_string.sub('.', ''), '%d %b %Y') 

my_string에 최대 한 개의 점이 있다고 가정합니다. 여러 개가있을 수 있으면 gsub을 사용하십시오.

Date.strptime(my_string.gsub('.', ''), '%d %b %Y') 
+1

'sub' 또는'gsub' 대신'tr ('.', '')'를 사용하십시오. 그것은 더 빠르며 똑같은 것을 성취 할 것입니다. –

+0

... 또는'my_string.delete ('.')'. –

2

나는 잘못된 방법을 사용하고 있다고 생각합니다. Date#parse 거의 "아무것도"작업 (통조림업자 답을보고 구문 분석을 사용하지 않을 때의 설명에 대한 언급)과 같은 객체를 제공해야

parse 방법은 일치하는 날짜 또는 날짜 - 시간 형식을 찾으려고 시도
p Date.parse('23 Nov 2014') #=> #<Date: 2014-11-23 ((2456985j,0s,0n),+0s,2299161j)> 
p Date.parse('23 Nov. 2014') #=> #<Date: 2014-11-23 ((2456985j,0s,0n),+0s,2299161j)> same object as with the previous line 
+2

날짜 구문 분석은 "다른 것과 작동하지 않습니다."실제로는 제한적이며 속도가 느리며 미국과 다른 국가 간의 일반적인 날짜 형식의 차이로 인해 오류가 발생하기 쉽습니다. 대신에, 당신이 인식하는 날짜 형식에 대해'strptime'을 사용하십시오. 아마도'parse'로 대체 될 것입니다. 가장 좋은 방법은 사용자의 지역 설정을 아는 것입니다. 또는 단순히 선택 항목에서 지정하여 사용하도록 할 수 있습니다. –

+0

대 미국의 '휴식'? 나는 그것이 오히려 엘리트 주의적 견해임을 알게된다. 우리는 여기에 국제 날짜 형식에 대해 이야기하고 있습니다. 특정 국가 (미국이나 다른 나라와 같이)가 날짜를 나타내는 구체적인 방법을 가지고 있다면 구문 분석 방법이 "작동하지 않습니다"라고 말할 수 없습니다 일부 X 국가 구현을 지원하지 않습니다. – daremkd

+1

언급되거나 암시 된 "엘리트 주의자"는 없습니다. 가장 일반적인 미국 날짜 형식은 다르며 너무 많은 사람들이 그 사실을 모르고 있습니다. Ruby는 국제적으로 통용되는 언어가되어 가고 있습니다. 나는 당신의 정치가 당신이 어떻게 그 발언을 읽었는지 생각하고 있습니다. –

0

, 그런 다음 문자열을 구문 분석하여 새 Date 또는 DateTime을 만드는 데 사용 된 값을 반환합니다. 지원하는 다양한 형식이 있지만 편리합니다. 그러나 일치하는 항목을 검색하는 프로세스가 구문 분석 시간을 지연시킵니다.

또한 일반적으로 사용되는 일부 형식은 "적합"할 필요가 없습니다. 여기에 무슨 일이 일어나고 있는지 생각해

Date.parse '31/01/2001' 
=> #<Date: 2001-01-31 ((2451941j,0s,0n),+0s,2299161j)> 

루비는 미국 중심의 언어가 아닙니다 있기 때문에, 미국에서 일반적이지 비록 '%d/%m/%Y'이 (일, 달, 년) 형식, 구문 분석에 날짜 문자열입니다. 처음 두 필드를 반대로하면, 결과는 다음과 같습니다 :

Date.parse '01/31/2001' 
ArgumentError: invalid date 
    from (irb):4:in `parse' 
    from (irb):4 
    from /Users/greg/.rbenv/versions/2.1.5/bin/irb:11:in `<main>' 
irb(main):005:0> Date.parse '31/01/2001' 
+0

그래, 알았어, 고마워! 그리고 나는 당신이 또한 문자열에서 마침표를 제거하고'strptime'을 사용하도록 권하고 싶습니다. – ktaras

+1

마침표를 제거하여 문자열을 정규화해야합니다. 이 문제를 해결할 수있는 방법이 있지만 기간은 3 자리 월 이름의 정상적인 부분이 아닙니다. –

관련 문제