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