【问题标题】:Why are Rails Weekday indexes different than Ruby's?为什么 Rails Weekday 索引与 Ruby 的不同?
【发布时间】:2011-12-04 20:04:09
【问题描述】:

在 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

【问题讨论】:

  • 不知道为什么索引是这样的,但在 irbrails c 中运行 Date.today.wday 都报告同一工作日(即星期一为 1)。与Time.now.wday 的结果相同。此外,您可能会发现这个bit of information 很有用。
  • 你是对的。我遇到的“问题”是有一个不一致的可访问映射。我希望为我的映射使用内部哈希。 (并感谢您的链接)
  • 在 Rails 中,它们实际上是不变的 - api.rubyonrails.org/classes/Date.html 我期待有一个设置来获取一周的开始。

标签: ruby-on-rails ruby ruby-on-rails-3 time


【解决方案1】:

我不确定这个问题是否有绝对正确的答案。我认为 Zabba 对美国/加拿大和国际上星期几的编号方式有所不同。

关于历史推理,David Heinemeier Hansson (DHH) 似乎在 2005 年 2 月 21 日做出了以下承诺: https://github.com/rails/rails/commit/25f8a25c3ea107dcd0688307ac0ce19c4306f6b4

提交消息明确指出,有意将周开始设为星期一而不是星期日。考虑到 David 固执己见,他是 Rails 的创建者,并且当时仍住在丹麦,因此他忽略 Ruby 的日期和时间课程考虑周日第 0 天这一事实是有道理的。

(后来提交 1c5a6944d38e6818d254f272057b513b038b2270 将 days_into_week 移动到您现在看到的常量 DAYS_INTO_WEEK 中;后来相同的常量被添加到提交 bc1bcddede0c300e9c88f76a66a152814b734981 中的 Date 类中)。

【讨论】:

  • 是的,我想知道为什么 ruby​​ 的时间在 wday 中的星期日为 0。我的意思是,对于世界上大多数人来说,星期一是一周的第一天。这真令人生气,因为我们使用的数据库设置为星期一为 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
相关资源
最近更新 更多