[RUBY-ON-RAILS] 문자열이 유효한 날짜인지 확인하는 방법
RUBY-ON-RAILS문자열이 유효한 날짜인지 확인하는 방법
"31-02-2010"을하고 유효한 날짜인지 여부를 확인하려면 : 나는 문자열을 가지고있다. 그것을 할 수있는 가장 좋은 방법은 무엇입니까?
나는 그것이 아닌 경우 문자열이 유효한 날짜와 거짓 인 경우는 true 반환하는 방법이 필요합니다.
해결법
-
==============================
1.
require 'date' begin Date.parse("31-02-2010") rescue ArgumentError # handle invalid date end
-
==============================
2.
d, m, y = date_string.split '-' Date.valid_date? y.to_i, m.to_i, d.to_i
-
==============================
3.다음은 간단한 한 라이너는 :
다음은 간단한 한 라이너는 :
DateTime.parse date rescue nil
당신이 전무에 대한 예를 확인하기 위해 발신자를 강제로 아마 현실에서 정확하게이 모든 상황에서 일을 권하고 싶지 않다. 특히 포맷 할 때. 당신이 기본 날짜를 반환하는 경우 |이 우호적이 될 수있는 오류.
-
==============================
4.구문 분석 기간이 될 수 있도록 미국이나 유럽에서 사용되는 짧은 기간 같은 MM / DD / YYYY 또는 DD / MM / YYYY 형식으로되어 특히, 일부 잡았다의로 실행할 수 있습니다.
구문 분석 기간이 될 수 있도록 미국이나 유럽에서 사용되는 짧은 기간 같은 MM / DD / YYYY 또는 DD / MM / YYYY 형식으로되어 특히, 일부 잡았다의로 실행할 수 있습니다.
날짜 # 구문 분석 사용하는 알아낼 시도하지만, 일년 내내 한 달에 많은 일이있다는 형식 사이의 모호성 문제를 구문 분석 될 수 있습니다 때.
나는 사용자의 로케일이 무엇인지 알아내는 것을 권 해드립니다하고, 그 기반으로, 당신은 Date.strptime을 사용하여 지능적으로 분석하는 방법을 알 수 있습니다. 위치는 사용자가 가입시를 요청하고이를 변경, 환경 설정의 설정을 제공하는 경우 가장 좋은 방법은 찾을 수 있습니다. 해당 정보는 사용자를 귀찮게 일부 영리한 발견하여 발굴 할 수없고 가정, 그래서 그냥 물어 실패하는 경향이있다.
이것은 다음 Date.parse를 사용하여 테스트입니다. 난과 미국의에있어 :
>> Date.parse('01/31/2001') ArgumentError: invalid date >> Date.parse('31/01/2001') #=> #<Date: 2001-01-31 (4903881/2,0,2299161)>
은 처음과 미국의 : mm / DD / YYYY에 대한 올바른 형식 이었지만 날짜는 같이하지 않았다. 두 번째는 유럽 정확하지만, 고객이 주로 미국 기반의 경우, 당신은 심하게 분석 날짜를 많이 얻을 것이다.
루비의 Date.strptime이 같이 사용된다 :
>> Date.strptime('12/31/2001', '%m/%d/%Y') #=> #<Date: 2001-12-31 (4904549/2,0,2299161)>
-
==============================
5.Date.valid_date? * date_string.split ( '-') reverse.map (: to_i).
Date.valid_date? * date_string.split ( '-') reverse.map (: to_i).
-
==============================
6.나는 날짜 클래스를 확장하고 싶습니다.
나는 날짜 클래스를 확장하고 싶습니다.
class Date def self.parsable?(string) begin parse(string) true rescue ArgumentError false end end end
Date.parsable?("10-10-2010") # => true Date.parse("10-10-2010") # => Sun, 10 Oct 2010 Date.parsable?("1") # => false Date.parse("1") # ArgumentError: invalid date from (pry):106:in `parse'
-
==============================
7.유효성 검사 날짜에 또 다른 방법 :
유효성 검사 날짜에 또 다른 방법 :
date_hash = Date._parse(date.to_s) Date.valid_date?(date_hash[:year].to_i, date_hash[:mon].to_i, date_hash[:mday].to_i)
-
==============================
8.모든 날짜에 대한 정규식보십시오 :
모든 날짜에 대한 정규식보십시오 :
/(\d{1,2}[-\/]\d{1,2}[-\/]\d{4})|(\d{4}[-\/]\d{1,2}[-\/]\d{1,2})/.match("31-02-2010")
앞의 0, 년의 마지막과 대시 만 형식 :
/(\d{2}-\d{2}-\d{4})/.match("31-02-2010")
에서 [- /] 수단 중 - 또는 / 슬래시 이스케이프되어야한다. 당신은 http://gskinner.com/RegExr/에서이를 테스트 할 수 있습니다
첫 번째 정규식을 사용하는 경우 다음 줄을 추가, 그들은 모두 첫 번째와 마지막 / (그들은 루비 코드에서 사용하기위한 것)하지 않고, 강조 표시됩니다.
2004-02-01 2004/02/01 01-02-2004 1-2-2004 2004-2-1
-
==============================
9.그것은 당신이 기대하는 날짜 형식을 지정하면 날짜의 정확성을 확인하는 것이 더 쉽습니다. 그러나, 다음, 루비도 내 사용 사례에 대한 내성이 약간입니다 :
그것은 당신이 기대하는 날짜 형식을 지정하면 날짜의 정확성을 확인하는 것이 더 쉽습니다. 그러나, 다음, 루비도 내 사용 사례에 대한 내성이 약간입니다 :
Date.parse("Tue, 2017-01-17", "%a, %Y-%m-%d") # works Date.parse("Wed, 2017-01-17", "%a, %Y-%m-%d") # works - !?
분명히, 적어도 이러한 문자열의 지정 중 하나가 잘못된 평일,하지만 루비 행복하게 그것을 무시합니다.
다음은하지 않는 방법입니다; 그것은 date.strftime (포맷) 변환이 포맷에 따른 Date.strptime로 해석하는 것과 같은 입력 문자열을 맞댄 것을 검증한다.
module StrictDateParsing # If given "Tue, 2017-01-17" and "%a, %Y-%m-%d", will return the parsed date. # If given "Wed, 2017-01-17" and "%a, %Y-%m-%d", will error because that's not # a Wednesday. def self.parse(input_string, format) date = Date.strptime(input_string, format) confirmation = date.strftime(format) if confirmation == input_string date else fail InvalidDate.new( "'#{input_string}' parsed as '#{format}' is inconsistent (eg, weekday doesn't match date)" ) end end InvalidDate = Class.new(RuntimeError) end
-
==============================
10.나중에 다른 사람에게 유용 할 수 있기 때문에이 게시. 어떤 실마리이 그것을 여부를 할 수있는 "좋은"방법이없는 경우,하지만 나를 위해 작동하고 펼 수있다.
나중에 다른 사람에게 유용 할 수 있기 때문에이 게시. 어떤 실마리이 그것을 여부를 할 수있는 "좋은"방법이없는 경우,하지만 나를 위해 작동하고 펼 수있다.
class String def is_date? temp = self.gsub(/[-.\/]/, '') ['%m%d%Y','%m%d%y','%M%D%Y','%M%D%y'].each do |f| begin return true if Date.strptime(temp, f) rescue #do nothing end end return false end end
이 부가 기능 문자열 클래스는 다음 라인 4 라인 (5)하지 로켓 과학에 유효한 형식의 목록에 구분 기호의 목록을 지정할 수 있습니다,하지만 정말 쉽게 확장 할 수 있습니다 당신은 단순히과 같이 문자열을 확인할 수 있습니다 :
"test".is_date? "10-12-2010".is_date? params[:some_field].is_date? etc.
-
==============================
11.
require 'date' #new_date and old_date should be String # Note we need a () def time_between(new_date, old_date) new_date = (Date.parse new_date rescue nil) old_date = (Date.parse old_date rescue nil) return nil if new_date.nil? || old_date.nil? (new_date - old_date).to_i end puts time_between(1,2).nil? #=> true puts time_between(Time.now.to_s,Time.now.to_s).nil? #=> false
-
==============================
12.당신은 간단한 방법입니다 다음을 시도 할 수 있습니다 :
당신은 간단한 방법입니다 다음을 시도 할 수 있습니다 :
"31-02-2010".try(:to_date)
하지만 당신은 예외를 처리해야합니다.
-
==============================
13.다음 Date.parse이 예에 대한 예외 발생하지 :
다음 Date.parse이 예에 대한 예외 발생하지 :
Date.parse("12!12*2012") => Thu, 12 Apr 2018 Date.parse("12!12&2012") => Thu, 12 Apr 2018
나는이 솔루션을 선호 :
Date.parse("12!12*2012".gsub(/[^\d,\.,\-]/, '')) => ArgumentError: invalid date Date.parse("12-12-2012".gsub(/[^\d,\.,\-]/, '')) => Wed, 12 Dec 2012 Date.parse("12.12.2012".gsub(/[^\d,\.,\-]/, '')) => Wed, 12 Dec 2012
-
==============================
14.방법:
방법:
require 'date' def is_date_valid?(d) Date.valid_date? *"#{Date.strptime(d,"%m/%d/%Y")}".split('-').map(&:to_i) rescue nil end
용법:
config[:dates].split(",").all? { |x| is_date_valid?(x)}
이 반환 true 또는 false의 경우는 설정 [: 날짜] = "12 / 10 / 2012,05 / / 1520 09"
from https://stackoverflow.com/questions/2955830/how-to-check-if-a-string-is-a-valid-date by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 레일 4.0에서 고안에 새로운 필드를 추가 허가되지 않은 매개 변수 (0) | 2020.02.29 |
---|---|
[RUBY-ON-RAILS] 루비 레일에 4 응용 프로그램이있는 iframe하지 작업을 수행 (0) | 2020.02.29 |
[RUBY-ON-RAILS] 레일 콘솔에 루비로드 할 때 걸려 (0) | 2020.02.28 |
[RUBY-ON-RAILS] 레일 3 - 속도 콘솔로드 시간까지 (0) | 2020.02.28 |
[RUBY-ON-RAILS] 루비 2.0 설치 오류 보석 레일 "등의 파일을로드 할 수 없습니다 -하려면 openssl" (0) | 2020.02.28 |