Почему индексы Rails Weekday отличаются от Ruby?

#ruby-on-rails #ruby #ruby-on-rails-3 #time

#ruby-on-rails #ruby #ruby-on-rails-3 #время

Вопрос:

в Rails 3.0.10

 ruby-1.9.2-p180 :010 > Time::DAYS_INTO_WEEK
 => {:monday=>0, :tuesday=>1, :wednesday=>2, :thursday=>3, :friday=>4, :saturday=>5, :sunday=>6} 
  

И

 ruby-1.9.2-p180 :011 > Date.today
 => Mon, 10 Oct 2011 
ruby-1.9.2-p180 :012 > Date.today.wday
 => 1 
  

Итак, понедельник равен 0 в сопоставлении времени и 1 в сопоставлении даты.
https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/time/calculations.rb

Мне кажется, что начинать с воскресенья, поскольку ноль — это более безопасный, более распространенный, более понятный кому-то другому способ делать что-то. Я надеялся понять историю / рассуждения на случай, если я что-то упущу.

Мой вариант использования: я явно сохраняю день недели в своей БД. Я решил, что хранение в виде целого числа будет более эффективным и простым в работе, чем хранение «понедельника», «вторника» и т. Д.

PS У меня была отличная идея сделать что-то вроде следующего. Сопоставляйте туда и обратно строки дня недели внутри методов (скрывая целое число).

 ruby-1.9.2-p180 :010 > Time::DAYS_INTO_WEEK
 => {:monday=>0, :tuesday=>1, :wednesday=>2, :thursday=>3, :friday=>4, :saturday=>5, :sunday=>6} 
Time::DAYS_INTO_WEEK[day_of_week.downcase.to_sym]
Time::DAYS_INTO_WEEK.to_a.select{|k, v| v == start_day }.first.first.to_s.capitalize
  

Комментарии:

1. Не знаю, почему индексы такие, какие они есть, но работают Date.today.wday , irb а также rails c оба сообщают об одном и том же дне недели (т. Е. 1 для понедельника). Тот же результат с Time.now.wday . Также вы можете найти эту информацию полезной.

2. Вы правы. Проблема, с которой я сталкиваюсь, заключается в том, что существует доступное сопоставление, которое несовместимо. Я надеялся использовать внутренний хэш для своего сопоставления. (и спасибо за ссылку)

3. И в rails они на самом деле постоянны — api.rubyonrails.org/classes/Date.html Я ожидал, что у меня будет установка для сбора в начале недели.

Ответ №1:

Я не уверен, что есть абсолютно правильный ответ на этот вопрос. Я думаю, что Zabba понял что-то относительно разницы между тем, как дни недели нумеруются в США / Канаде и на международном уровне.

Что касается исторических рассуждений, похоже, что Дэвид Хайнемайер Ханссон (DHH) совершил следующий коммит 21 февраля 2005 года: https://github.com/rails/rails/commit/25f8a25c3ea107dcd0688307ac0ce19c4306f6b4

В сообщении о фиксации четко указано, что было намеренно сделать начало недели понедельником, а не воскресеньем. Учитывая, что Дэвид упрям, создатель Rails, и в то время все еще жил в Дании, имеет смысл, что он проигнорировал тот факт, что классы даты и времени Ruby учитывают день воскресенья 0.

(позже коммит 1c5a6944d38e6818d254f272057b513b038b2270 переместил days_into_week в константу, которую вы видите сейчас DAYS_INTO_WEEK; а позже та же константа была добавлена в класс Date в коммите bc1bcddede0c300e9c88f76a66a152814b734981).

Комментарии:

1. да, интересно, почему время ruby имеет воскресенье как 0 в wday. Я имею в виду, что для большей части мира понедельник — первый день недели. Это приводит в бешенство, потому что база данных, с которой мы работаем, настроена на понедельник как 0.