#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.