如何让我的模型接受两种不同的日期格式?

Posted

技术标签:

【中文标题】如何让我的模型接受两种不同的日期格式?【英文标题】:How do I allow my model to accept two different date formats? 【发布时间】:2017-07-11 11:21:03 【问题描述】:

我正在使用 Ruby on Rails 5。我的模型中有以下代码...

class User < ActiveRecord::Base
    ...
  attr_accessor :dob_string 

  def dob_string
    @dob_string || (self.dob ? self.dob.strftime('%m/%d/%Y') : "")  
  end

  def dob_string=(dob_s)
    date = dob_s && !dob_s.empty? ? Date.strptime(dob_s, '%m/%d/%Y') : nil 
    self.dob = date
  rescue ArgumentError
    errors.add(:dob, 'The birth date is not in the correct format (MM/DD/YYYY)')
    @dob_string = dob_s
  end

尽管有我的指示,但有时用户会以 MM-DD-YYYY 的形式输入日期。所以我想做的是让我的模型接受两种格式,MM/DD/YYYY 或 MM-DD-YYYY,但不能混合,也就是说 MM/DD-YYYY 应该仍然是非法的。如何修改我的模型以使其可以接受任何一种格式?

【问题讨论】:

请更新您的帖子,因为有太多的拼写错误,甚至编辑选项都对我们禁用:-) 【参考方案1】:

我认为这可能会满足您的需求:

class User < ActiveRecord::Base
  def dob_string
    @dob_string || (dob ? dob.strftime("%m/%d/%Y") : "")
  end

  def dob_string=(dob_s)
    unless convert_preferred_date(dob_s) || convert_acceptable_date(dob_s)
      errors.add(:dob, 'The birth date is not in the correct format (MM/DD/YYYY)')
      @dob_string = dob_s
    end
  end

  private

  def convert_preferred_date(dob_s)
    convert_date(dob_s, "%m/%d/%Y")
  end

  def convert_acceptable_date(dob_s)
    convert_date(dob_s, "%m-%d-%Y")
  end

  def convert_date(dob_s, format)
    self.dob = (dob_s && !dob_s.empty? ? Date.strptime(dob_s, format) : nil)
  rescue ArgumentError
    nil
  end
end

这有点不雅,但我想不出一种方法来使用两种日期格式。如果您准备好接受任何人类可读的数据格式,有一种更简单的方法可以做到这一点。

请在您自己的应用中对此进行彻底测试。我只是在 Rails 控制台中搞砸了这个,我可能没有测试每个案例。希望这会有所帮助。

【讨论】:

我保存无效日期,因为如果有人在返回视图时在视图中输入无效日期,他们应该会看到他们输入的无效值。有意义吗? 这肯定是有道理的。我没有考虑如何在视图中使用它。答案对你有帮助吗? 虽然它可以正确解析日期,如“01-01-1980”和“01/01/1980”,但它也解析日期“01/01-1980”,这不是我想要的。我只希望它接受正确的日期,如果他们使用所有破折号或所有斜杠但不是两者的组合。 戴夫,我最谦虚的道歉。我已经注释掉了以“errors.add”开头的行,所以我怀疑代码可能正在运行,但它没有报告错误。我修复了上面的代码。此外,dob_string= 方法的返回值使它看起来像是在解析日期,但实际上并非如此。 (确保您测试不同日期的不同格式,否则很难判断代码是否真的有效。) 新代码不接受“01/01-1980”,这很好,但它拒绝了我想要的“01-01-1980”。

以上是关于如何让我的模型接受两种不同的日期格式?的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬如何在模型中设置日期格式

我有一个具有两种不同格式日期值的 csv 文件,希望它们采用任何单一格式

使用 nzload 上传具有两种不同日期格式的文件

表格日期斜杠怎么弄

Pandas Dataframe:在两种完全不同的格式之间转换日期格式[重复]

在同一页面上使用两个具有两种不同日期格式的日期选择器