Преобразование двузначного года в четырехзначный год в рубине - PullRequest
7 голосов
/ 28 октября 2009

У меня есть строки типа "84", "03" и т. Д., Которые я хочу преобразовать в объекты Date, но Date.new принимает в качестве параметра только расширенный четырехзначный год. Я знаю, что это легко сделать, но я не хочу изобретать это колесо. Есть ли что-то, что делает это уже? Либо в стандартном Ruby, либо в ActiveSupport.

Ответы [ 5 ]

5 голосов
/ 28 октября 2009

Выберите дату отсечения.

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

Кроме того, исправьте причину двухзначного года, иначе ваша система не будет соответствовать требованиям 2000 года + отсечка.

4 голосов
/ 30 октября 2009

Большинство двухзначных лет уже в прошлом, поэтому хорошим значением для отсчета является 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

Это не совсем общий вопрос, о котором просил вопрос, но, надеюсь, это поможет.

1 голос
/ 17 мая 2011

Если вы хотите преобразовать 2 в 4 для будущих дат (например, форматирование даты истечения срока действия кредитной карты), вы можете попробовать:

$expYear  = 12

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

Это будет чуть более надежно в будущем, поскольку это всегда получает текущий год Тем не менее, если мы находимся в 95-м + году века .. это все равно вызовет проблемы c'est la vie

0 голосов
/ 28 октября 2009

Имеет ли это смысл? Когда следует прекратить рассмотрение дат 19xx? Нет хорошего способа получить четырехзначный год из последних двухзначных.

0 голосов
/ 28 октября 2009

Я не знаю такого компонента, и я не знаю, как бы вы его написали; как бы решить, какой двузначный префикс использовать? Выбор одного слепого имеет определенные продемонстрированные проблемы.

В зависимости от вашего приложения вы, вероятно, можете найти разумную эвристику для выбора между 19 и 20 для префикса, но в целом проблема не решаема; недостаточно информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...