【问题标题】:Invalid argument to TimeZone?TimeZone 的参数无效?
【发布时间】:2012-08-20 10:49:50
【问题描述】:

我正在尝试让我的用户时区成为我的应用程序的当前时区,以便他们交互的所有内容都将由它进行。不过,我在 ApplicationController 中的方法遇到了 ArgumentError

application_controller.rb

before_filter :set_user_time_zone

private

def set_user_time_zone
  if signed_in?
   Time.zone = Time.now.in_time_zone(current_user.time_zone)
  end
end

注意:current_user 是 Devise Helper,我的 User 模型是 :time_zone 列。

比错误:

invalid argument to TimeZone[]: Mon, 20 Aug 2012 13:16:20 JST +09:00

我不知道从这里去哪里。有关如何纠正此问题的任何想法?

谢谢。

更新

class Price
  attr_accessible :date
  def self.today
    where(:date => Date.today)
  end
end

如果我的方法是这样:

def set_user_time_zone
  if signed_in?
    Time.zone = current_user.time_zone
  end
end

我遇到的问题是这样的:

 Time.now = US EAST- 2012-08-22 21:17:03 -0400 
 Time.zone = TOKYO - (GMT+09:00) Tokyo 
 Time.zone.now 2012-08-23 10:17:03 +0900

这意味着我所有的Date 方法都通过了

Time.now = US EAST- 2012-08-22 21:17:03 -0400

应该是什么时候

Time.zone.now 2012-08-23 10:17:03 +0900

我怎样才能把它交给后者?

【问题讨论】:

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


    【解决方案1】:

    Time.now.in_time_zone(current_user.time_zone) 返回TimeWithZone 类的实例,但是 Time#zone= 期望得到可以转换为 TimeZone 的东西。

    假设您将 TimeZone 标识符存储在您的 :time_zone 列中(“东部时间(美国和加拿大)”、“夏威夷”等),您可以简单地这样做

    Time.zone = current_user.time_zone
    

    【讨论】:

    • 好的,所以我这样做了,但是如果我使用Date.today 编写一个方法,它将不会使用当前用户的时区,而是使用默认的("Eastern Time (US & Canada)"。我上面的代码是试图纠正这种行为。我将展示我称为 today 的方法的代码,该方法执行我所描述的操作。
    • 我还解释了其他所有内容。
    • 好的,现在我明白你的意思了,基本上......你不能这样做(或者至少不应该这样做)。看看this 的回答我建议你在服务器端和用户区域的任何地方都使用UTC,只在视图和助手中。
    • 仅在视图和助手中的用户区?
    • 是的,在数据​​库中保持 UTC 时间 - 这是 rails 默认设置,通过 ActiveRecord 保存的时间将自动从用户区域转换为 UTC。在视图中将其转换回用户的区域,以便他看到他的当地时间。
    【解决方案2】:

    Time#zone= 方法只接受这些参数:

    • Rails TimeZone 对象。

    • Rails TimeZone 对象的标识符(例如,“Eastern Time (US & 加拿大)”,-5 小时)。

    • 一个 TZInfo::Timezone 对象。

    • TZInfo::Timezone 对象的标识符(例如, “美国/纽约”)。

    所以你应该从这个列表中传递一些东西

    【讨论】:

    • +1 我在项目中使用了第二个选项(“Rails TimeZone 对象的标识符”),没有任何问题。
    猜你喜欢
    • 1970-01-01
    • 2015-09-02
    • 2016-07-07
    • 2012-04-11
    • 2013-04-05
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多