2014-10-17 2 views
-1

다음 코드는이 같은 날짜 문자열을 검색 - 2014/06/10 0시시간 포맷 루비

window1= line[13].scan(/\d\d\/\d\d\/\d\d\d\d\s\d\d\:\d\d/) if line[13] 

가 어떻게 시간 클래스의 객체로이 저장합니까? 당신의 형식을 가정

+0

'line [13]'은 날짜 문자열 만 포함합니까? 아니면 더 큰 문자열에서 날짜를 추출합니까? – Stefan

답변

0

좋은 시작이 될 것이다 일/월/년

require 'date' 
DateTime.strptime('06/10/2014 00:00', '%d/%m/%Y %H:%M') 
+0

시간과 분 기호를 뒤집습니다. – mcfinnigan

0

scan주의를 기울이지 않으면 발로 몸을 쏠 수 있습니다. 이것을 고려하십시오 :

str = 'foo 06/10/2014 00:00 bar' 

str.scan(/\d\d\/\d\d\/\d\d\d\d\s\d\d\:\d\d/) # => ["06/10/2014 00:00"] 

scan 문자열에 모든 일치하는 패턴의 배열을 반환합니다. 당신은 단지 하나의 값을 얻기 위해 정기적 일치를 사용하여 하나의 값이 알고 있다면, 대신

str = 'foo 06/10/2014 00:00 bar 99/99/9999 99:99 baz' 
str.scan(/\d\d\/\d\d\/\d\d\d\d\s\d\d\:\d\d/) # => ["06/10/2014 00:00", "99/99/9999 99:99"] 

: 문자열이 조금 달랐다 경우, 예기치 않은 무언가를 얻을 수 있습니다.

str[/\d\d\/\d\d\/\d\d\d\d\s\d\d\:\d\d/] # => "06/10/2014 00:00" 

당신이 반복 \d (자리 문자 세트)의 긴 시리즈를 얼마나 공지 사항 및 / 구분 기호 ("\/")를 탈출했다. 사람들은 패턴이 더 읽을 수 있도록 몇 가지 트릭을 사용하여 줄일 수 있습니다

%r#\d+/\d+/\d+ \d+:\d+# # => /\d+\/\d+\/\d+ \d+:\d+/ 
str[%r#\d+/\d+/\d+ \d+:\d+#] # => "06/10/2014 00:00" 

\d+는 반복 \d을 감소하지만, 탈출 구분을 없애 도움이되지 않는 한 또는-이상의 숫자를 의미합니다. 대체 구분 기호가 도움이 될 것입니다. %r을 사용하면됩니다. 패턴이

\/\d 

에서

/\d 

그것은 사소한 일이 있지만 가독성을하는 데 도움이 갈 수 있도록 %r 다음 첫 번째 문자는 구분 기호를 정의합니다.

곳보다 두 개 또는 4 개의보다, 비록 새로운 문제를 열 ​​수 \d+을 사용하여, 숫자는 캡처 할 수 있습니다 :

str = 'foo 1/22/55555 22:666666 bar' 
str[%r#\d+/\d+/\d+ \d+:\d+#] # => "1/22/55555 22:666666" 

정규식 패턴이 허용되는 문자 수를 지정하는 우리를 할 수 있도록 확장되었다 :

str = 'foo 06/10/2014 00:00 bar' 
str[%r#\d+/\d+/\d+ \d+:\d+#] # => "06/10/2014 00:00" 
str[%r#\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{2}#] # => "06/10/2014 00:00" 

str = 'foo 1/22/55555 22:666666 bar' 
str[%r#\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{2}#] # => nil 

시간 값으로 이동 중 ....

타임 클래스는 시간 인스턴스 캡처 한 문자열을 구문 분석하고 반환 할 수 있습니다, 당신은 생각이와 매우 조심해야

str = 'foo 06/10/2014 00:00 bar' 
time_str = str[%r#\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{2}#] # => "06/10/2014 00:00" 

require 'time' 
Time.parse(time_str).class # => Time 
Time.parse(time_str) # => 2014-10-06 00:00:00 -0700 

을하기 때문에 형식 "MM/DD/YYYY시 : 분" "dd/mm/yyyy hh : mm"과 쉽게 혼동됩니다. 첫 번째는 미국의 표준, 두 번째는 세계의 대부분의 주위에 표준, 그리고 충돌이있을 때 언어가 싫어하는 :

str = 'foo 31/01/2014 00:00 bar' 
time_str = str[%r#\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{2}#] # => "31/01/2014 00:00" 

require 'time' 
Time.parse(time_str).class # => Time 
Time.parse(time_str) # => 2014-01-31 00:00:00 -0700 

그래서,에 :

str = 'foo 01/31/2014 00:00 bar' 
time_str = str[%r#\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{2}#] # => "01/31/2014 00:00" 

require 'time' 
Time.parse(time_str).class # => 
Time.parse(time_str) # => 
# ~> 'local': argument out of range (ArgumentError) 

대 당신의 문자열이 어떤 지역/지역에서 오는 것인지를 반드시 알아야한다. 그렇지 않으면 무작위 예외가 발생하거나 월/일 값이 엉망이 될 것이다.

parse은 편리하지만이 문제로 인해 양날 검이됩니다. 당신은 특정 형식의 문자열로 strptime을 사용을 시도 할 수 있습니다 :

str = 'foo 01/31/2014 00:00 bar' 
time_str = str[%r#\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{2}#] # => "01/31/2014 00:00" 

require 'time' 
Time.strptime(time_str, '%m/%d/%Y %H:%M') # => 2014-01-31 00:00:00 -0700 

str = 'foo 31/01/2014 00:00 bar' 
time_str = str[%r#\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{2}#] # => "31/01/2014 00:00" 
Time.strptime(time_str, '%d/%m/%Y %H:%M') # => 2014-01-31 00:00:00 -0700 
Time.strptime(time_str, '%m/%d/%Y %H:%M') # => 
# ~> 'strptime': invalid strptime format - `%m/%d/%Y %H:%M' (ArgumentError) 

그러나 다시, 당신은 형식이 무엇인지 모른다면, 당신은 여전히 ​​문제로 실행할 수 있습니다. 이것은 프로그래밍에있어서 정말로 어려운 부분 중 하나이며, 사이트에서 누군가가 어디에 있는지 묻습니다. 추측은 잘 작동하지 않습니다.