복붙노트

[RUBY-ON-RAILS] 문자열이 유효한 날짜인지 확인하는 방법

RUBY-ON-RAILS

문자열이 유효한 날짜인지 확인하는 방법

"31-02-2010"을하고 유효한 날짜인지 여부를 확인하려면 : 나는 문자열을 가지고있다. 그것을 할 수있는 가장 좋은 방법은 무엇입니까?

나는 그것이 아닌 경우 문자열이 유효한 날짜와 거짓 인 경우는 true 반환하는 방법이 필요합니다.

해결법

  1. ==============================

    1.

    require 'date'
    begin
       Date.parse("31-02-2010")
    rescue ArgumentError
       # handle invalid date
    end
    
  2. ==============================

    2.

    d, m, y = date_string.split '-'
    Date.valid_date? y.to_i, m.to_i, d.to_i
    
  3. ==============================

    3.다음은 간단한 한 라이너는 :

    다음은 간단한 한 라이너는 :

    DateTime.parse date rescue nil
    

    당신이 전무에 대한 예를 확인하기 위해 발신자를 강제로 아마 현실에서 정확하게이 모든 상황에서 일을 권하고 싶지 않다. 특히 포맷 할 때. 당신이 기본 날짜를 반환하는 경우 |이 우호적이 될 수있는 오류.

  4. ==============================

    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. ==============================

    5.Date.valid_date? * date_string.split ( '-') reverse.map (: to_i).

    Date.valid_date? * date_string.split ( '-') reverse.map (: to_i).

  6. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    12.당신은 간단한 방법입니다 다음을 시도 할 수 있습니다 :

    당신은 간단한 방법입니다 다음을 시도 할 수 있습니다 :

    "31-02-2010".try(:to_date)
    

    하지만 당신은 예외를 처리해야합니다.

  13. ==============================

    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. ==============================

    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"

  15. from https://stackoverflow.com/questions/2955830/how-to-check-if-a-string-is-a-valid-date by cc-by-sa and MIT license