在Ruby中将两位数年份转换为四位数年份

时间:2009-10-28 19:46:58

标签: ruby date time

我有"84", "03"之类的字符串,我想将其转换为Date对象,但Date.new仅将扩展的4位数年份作为参数。我知道这很简单,但我不想重新发明这个轮子。有没有这样做的事情?无论是标准的Ruby还是ActiveSupport。

5 个答案:

答案 0 :(得分:5)

选择截止日期。

if year < cutoff, then year4 = "20" + year
else year4 = "19" + year

另外,修正两位数年份的原因,否则您的系统将不符合Y2K +截止标准。

答案 1 :(得分:4)

过去大多数2位数年份,所以使用的好截止点是30.例如,如果有人输入'66,那么它们很可能意味着1966年。事实上,这也是Excel使用时的截止值。数字日期传递给日期单元格。

我有一个应用程序,它接受来自excel电子表格的制表符分隔文件,并且它们通常带有两位数的年份。我编写了这个ActiveRecord猴子补丁,允许ActiveRecord处理日期字段的两位数年份:

class ActiveRecord::ConnectionAdapters::Column
  class << self
    protected
    # If a year comes in with two digits, let's try to guess whether it's in the
    # 20th or 21st century.  Typically, Ruby pivots this decision around the
    # year '69, but this is a bad guess.  Since most of our dates will arrive in
    # two digit format because of an Excel import, we should use the same pivot
    # value that Excel uses.  Excel pivots the decision around the year '30
    # which seems to be a better guess anyway.
    def new_date_with_two_digit_year_support(year, mon, mday)
      year += 2000 if (0..29).include? year
      year += 1900 if (30..99).include? year
      new_date_without_two_digit_year_support(year, mon, mday)
    end
    alias_method_chain :new_date, :two_digit_year_support
  end
end

这并不像问题所要求的那样通用,但希望它有所帮助。

答案 2 :(得分:1)

如果您希望将来日期转换为2(例如格式化信用卡到期日期),您可以尝试:

$expYear  = 12

if (strlen($expYear) == 2) {
    $expYear = substr(Date("Y"),0,2) . $expYear;
}

这将是未来的证据,因为它总是得到今年 但是,如果我们处于本世纪的第95个+年,它仍然会引发问题 c'est la vie

答案 3 :(得分:0)

我不知道这样的组件,我不知道你是怎么写的;它将如何决定使用哪个两位数的前缀?盲目地挑选一个有一些明显的问题。

根据您的应用程序,您可能会找到一个合理的启发式方法来选择19到20之间的前缀,但问题通常无法解决;没有足够的信息。

答案 4 :(得分:0)

这样做真的有意义吗?你什么时候应该停止考虑19xx日期?从今年的最后2位数字中获取4位数的年份没有好办法。