如何检查字符串是否是有效日期

Sal*_*lil 107 ruby string ruby-on-rails date

我有一个字符串:"31-02-2010"并想检查它是否是一个有效的日期.最好的方法是什么?

我需要一个方法,如果字符串是有效日期,则返回true,否则返回false.

mpd*_*mpd 109

require 'date'
begin
   Date.parse("31-02-2010")
rescue ArgumentError
   # handle invalid date
end
Run Code Online (Sandbox Code Playgroud)

  • 它不是Date类功能​​,它是异常处理. (24认同)
  • 使用"全能"救援应该被视为反模式.它可以隐藏我们不期望的其他错误,并使代码的调试非常困难. (12认同)
  • 对不起,这是一个错误的答案.它不检查字符串是否是有效日期,它只检查Date.parse是否可以解析字符串.Date.parse在日期方面似乎非常宽容,例如它会将"FOOBAR_09_2010"解析为2012-09-09日期. (9认同)
  • 那么......如果它确实是一种反模式,你会如何回答这个问题呢? (7认同)
  • Date.parse('2012-08-13 == 00:00:00')#=>星期一,2012年8月13日 (3认同)
  • 只有在您没有真正预料到错误时才应使用异常 (2认同)
  • -1 Date.parse("H01")#=> <Date:2014-06-01 ...> (2认同)

小智 49

这是一个简单的一个班轮:

DateTime.parse date rescue nil
Run Code Online (Sandbox Code Playgroud)

我可能不建议在现实生活中的每种情况下都这样做,因为你强制调用者检查nil,例如.特别是格式化时.如果您返回默认日期|错误,它可能会更友好.

  • DateTime.parse"123"救援无.这将返回一个真实日期.2017年5月3日 (8认同)
  • `Date.strptime(日期,'%d /%m /%Y')救援nil` (3认同)
  • 不鼓励使用内联 `rescue`。 (2认同)

Soh*_*han 48

d, m, y = date_string.split '-'
Date.valid_date? y.to_i, m.to_i, d.to_i
Run Code Online (Sandbox Code Playgroud)

  • 什么版本的Ruby支持`is_valid?`?试过1.8,2.0和2.1.他们似乎都没有那个.但是,所有人似乎都有`valid_date?`. (4认同)

the*_*Man 28

解析日期可能会遇到一些问题,尤其是当它们处于MM/DD/YYYY或DD/MM/YYYY格式时,例如美国或欧洲使用的短日期.

Date#parse 试图找出使用哪个,但是在一年中的一个月中有很多天,格式之间的模糊可能导致解析问题.

我建议找出用户的LOCALE是什么,然后,基于此,你将知道如何使用智能解析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)>
Run Code Online (Sandbox Code Playgroud)

第一个是美国的正确格式:mm/dd/yyyy,但是Date并不喜欢它.第二个对欧洲来说是正确的,但如果您的客户主要以美国为基础,那么您将获得大量错误解析的日期.

Ruby的Date.strptime用法如下:

>> Date.strptime('12/31/2001', '%m/%d/%Y') #=> #<Date: 2001-12-31 (4904549/2,0,2299161)>
Run Code Online (Sandbox Code Playgroud)


Sam*_*una 26

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

  • 此方法可能引发异常'ArgumentError:错误的参数数'而不是返回false.例如,如果您的字符串包含斜杠而不是破折号 (2认同)
  • 也许我们可以做这样的事情,处理错误的格式化日期:`Date.valid_date?*Array.new(3)的.zip(date_string.split( ' - '))transpose.last.reverse.map(&:to_i)`. (2认同)

iro*_*and 9

我想扩展Date课程.

class Date
  def self.parsable?(string)
    begin
      parse(string)
      true
    rescue ArgumentError
      false
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)


小智 6

验证日期的另一种方法:

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)
Run Code Online (Sandbox Code Playgroud)

  • 在此基础上,您可以将其简化为: `Date.valid_date?(*Date._parse(date).values)` (2认同)