有谁知道如何在 Rails 2.3 中正确处理用户时区?

2024-04-03

我们正在构建一个 Rails 应用程序,需要在多个时区显示日期(更重要的是计算日期)。

谁能告诉我如何在 Rails 2.3(.5 或 .8)中使用用户时区

我见过的最具包容性的文章详细介绍了用户时区的工作原理,如下:http://wiki.rubyonrails.org/howtos/time-zones http://wiki.rubyonrails.org/howtos/time-zones...虽然尚不清楚这是何时编写的或针对什么版本的 Rails。具体来说,它指出:

“Time.zone - 实际用于显示目的的时区。这可以手动设置以根据每个请求覆盖 ​​config.time_zone。”

关键术语是“显示目的”和“基于每个请求”。

在我的本地机器上,这是真的。但在生产方面,这两种情况都不是真的。设置 Time.zone 在请求结束后仍然存在(对于所有后续请求),并且还会影响 AR 保存到数据库的方式(基本上将任何日期视为已经在 UTC 中,即使它不是),从而保存完全不合适的值。

我们在生产环境中使用乘客运行 Ruby Enterprise Edition。如果这是我的问题,我们需要切换到 JRuby 还是其他东西?

为了说明这个问题,我现在在我的 ApplicationController 中添加了以下操作:

def test
p_time = Time.now.utc
s_time = Time.utc(p_time.year, p_time.month, p_time.day, p_time.hour)

logger.error "TIME.ZONE" + Time.zone.inspect
logger.error ENV['TZ'].inspect
logger.error p_time.inspect
logger.error s_time.inspect

jl = JunkLead.create!
jl.date_at = s_time

logger.error s_time.inspect
logger.error jl.date_at.inspect

jl.save!

logger.error s_time.inspect
logger.error jl.date_at.inspect


render :nothing => true, :status => 200
end


def test2
Time.zone = 'Mountain Time (US & Canada)'
logger.error "TIME.ZONE" + Time.zone.inspect
logger.error ENV['TZ'].inspect

render :nothing => true, :status => 200
end


def test3
Time.zone = 'UTC'
logger.error "TIME.ZONE" + Time.zone.inspect
logger.error ENV['TZ'].inspect


render :nothing => true, :status => 200
end

它们产生以下结果:

Processing ApplicationController#test (for 98.202.196.203 at 2010-12-24 22:15:50) [GET]
TIME.ZONE#<ActiveSupport::TimeZone:0x2c57a68 @tzinfo=#<TZInfo::DataTimezone: Etc/UTC>, @name="UTC", @utc_offset=0>
nil
Fri Dec 24 22:15:50 UTC 2010
Fri Dec 24 22:00:00 UTC 2010
Fri Dec 24 22:00:00 UTC 2010
Fri, 24 Dec 2010 22:00:00 UTC +00:00
Fri Dec 24 22:00:00 UTC 2010
Fri, 24 Dec 2010 22:00:00 UTC +00:00
Completed in 21ms (View: 0, DB: 4) | 200 OK [http://www.dealsthatmatter.com/test]


Processing ApplicationController#test2 (for 98.202.196.203 at 2010-12-24 22:15:53) [GET]
TIME.ZONE#<ActiveSupport::TimeZone:0x2c580a8 @tzinfo=#<TZInfo::DataTimezone: America/Denver>, @name="Mountain Time (US & Canada)", @utc_offset=-25200>
nil
Completed in 143ms (View: 1, DB: 3) | 200 OK [http://www.dealsthatmatter.com/test2]


Processing ApplicationController#test (for 98.202.196.203 at 2010-12-24 22:15:59) [GET]
TIME.ZONE#<ActiveSupport::TimeZone:0x2c580a8 @tzinfo=#<TZInfo::DataTimezone: America/Denver>, @name="Mountain Time (US & Canada)", @utc_offset=-25200>
nil
Fri Dec 24 22:15:59 UTC 2010
Fri Dec 24 22:00:00 UTC 2010
Fri Dec 24 22:00:00 UTC 2010
Fri, 24 Dec 2010 15:00:00 MST -07:00
Fri Dec 24 22:00:00 UTC 2010
Fri, 24 Dec 2010 15:00:00 MST -07:00
Completed in 20ms (View: 0, DB: 4) | 200 OK [http://www.dealsthatmatter.com/test]

Processing ApplicationController#test3 (for 98.202.196.203 at 2010-12-24 22:16:03) [GET]
TIME.ZONE#<ActiveSupport::TimeZone:0x2c57a68 @tzinfo=#<TZInfo::DataTimezone: Etc/UTC>, @name="UTC", @utc_offset=0>
nil
Completed in 17ms (View: 0, DB: 2) | 200 OK [http://www.dealsthatmatter.com/test3]

Processing ApplicationController#test (for 98.202.196.203 at 2010-12-24 22:16:04) [GET]
TIME.ZONE#<ActiveSupport::TimeZone:0x2c57a68 @tzinfo=#<TZInfo::DataTimezone: Etc/UTC>, @name="UTC", @utc_offset=0>
nil
Fri Dec 24 22:16:05 UTC 2010
Fri Dec 24 22:00:00 UTC 2010
Fri Dec 24 22:00:00 UTC 2010
Fri, 24 Dec 2010 22:00:00 UTC +00:00
Fri Dec 24 22:00:00 UTC 2010
Fri, 24 Dec 2010 22:00:00 UTC +00:00
Completed in 151ms (View: 0, DB: 4) | 200 OK [http://www.dealsthatmatter.com/test]

上面应该清楚的是,对 /test 的第二次调用显示 Time.zone 设置为 Mountain,即使它不应该。

此外,检查数据库发现,在 test2 之后运行的测试操作保存了日期为 2010-12-22 15:00:00 的 JunkLead 记录,这显然是错误的。


经过详尽的研究,现在完全清楚 Time.zone 在大多数 Rails 版本(包括 2.3 和 3)中都被破坏了。此功能使用中央线程哈希来存储设置的值(这应该是线程安全的,但事实并非如此),并最终修改所有后续请求的行为。此外,与文档相反,设置 Time.zone 会修改 ActiveRecord 行为并将日期时间保存在新区域中,而不是在配置中指定的时间(通常是 UTC)。

在 Rails 修复此问题之前,我们选择手动使用时区,可以通过未记录的默认方法进行访问:

ActiveSupport::TimeZone['Arizona'].now (or .local, or .parse).

此外,我还修补了 Time 和 ActiveSupport::TimeWithZone,以提供将时间点轻松转换为不同区域的功能。需要明确的是,我指的是不同区域中相应的时刻,而不是同时的时刻。

>> Time.utc(2011)
=> Sat Jan 01 00:00:00 UTC 2011
>> Time.utc(2011).in_time_zone('Arizona')
=> Fri, 31 Dec 2010 17:00:00 MST -07:00 #Simultaneous
>> Time.utc(2011).change_zone('Arizona')
=> Sat, 01 Jan 2011 00:00:00 MST -07:00 #Corresponding

补丁如下:

module ActiveSupport #:nodoc:
  module CoreExtensions #:nodoc:
    module Time #:nodoc:
      module ZoneCalculations
        def self.included(base) #:nodoc:
          base.class_eval do
            alias_method_chain :change, :zone
          end
        end

        def change_zone(new_zone)
          new_zone = ::Time.__send__(:get_zone, new_zone)
          return self if new_zone.name == zone
          new_zone.local(year,month,day,hour,min,sec,usec)
        end

        def change_with_zone(options)
          result = change_without_zone(options)
          options[:zone] ? result.change_zone(options[:zone]) : result
        end

      end
    end
  end
  class TimeWithZone
    def change_zone(new_zone)
      time.change_zone(new_zone)
    end
    def change(options)
      time.change(options)
    end
  end

end

class Time
  include ActiveSupport::CoreExtensions::Time::ZoneCalculations
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有谁知道如何在 Rails 2.3 中正确处理用户时区? 的相关文章

  • 未初始化的常量 Sprockets::Engines (NameError)

    我正在使用 Ubuntu 18 04 Ruby 2 6 3 和 Rails 6 我正在开发一个新的 Rails 项目 当我启动服务器时 出现以下错误 gt rails s gt Booting Puma gt Rails 6 0 2 1 a
  • Rails3 SQL 日志记录输出在单独的文件中

    我希望将所有 ActiveRecord SQL 日志记录重定向到不同的文件中 将其放在控制台或 log development log 中有点混乱 怎么做 我希望将其放在 log development sql log 文件中 Thanks
  • 帮助程序中的 Rails Form 块 - 如何包含“防止伪造”

    我正在尝试为我的液体主题语言构建一个表单块 我的方法基于这个答案 https stackoverflow com questions 15189669 can the liquid ruby template engine deal wit
  • 未找到 Gem 命令

    我已经在 Ubuntu 10 10 32 位上安装了 gem apt get install gem y 但当我尝试跑步时 gem install something gem 我收到未找到命令的错误 bash gem command not
  • Ruby 元编程方法列表?

    刚刚开始学习 Ruby 元编程 看看 Object methods 我得到 Object methods gt allocate new superclass freeze lt gt lt lt gt gt to s included m
  • Rails has_many 通过带有附加属性的表单

    我正在尝试创建一个表单 允许用户向活动添加 编辑 删除位置 我目前找到的所有例子要么是HABTM表单 不允许编辑存在于表单中的附加属性 has many through配置 或仅列出现有关系 下面的图片显示了我想要完成的任务 该列表将显示每
  • Ruby 多维数组

    也许只是我缺乏在这里找到东西的能力 这就是问题所在 但我找不到任何关于如何在 Ruby 中创建多维数组的信息 有人可以给我一个如何做的例子吗 严格来说 在 Ruby 中创建多维数组是不可能的 但是可以将一个数组放入另一个数组中 这与多维数组
  • 随机化数组元素

    我有一个数组 number 1 2 3 4 5 6 7 8 9 现在 我想随机化数组内容 例如 5 3 2 6 7 1 8 请指导我如何继续 Use the shuffle方法 irb main 001 0 gt 1 2 3 4 5 shu
  • 通俗地说,Ruby on Rails ORM 是什么?请解释

    我无法理解 Ruby on Rails 中的 ORM 据我了解 表 列和对象 属性之间存在 1 1 的关系 所以每条记录都是一个对象 另外 模型到底是什么 我知道它映射到一张桌子 我真正追求的是对上述内容有更深入的理解 预先感谢您的帮助 我
  • Rails 中是否可以跨多个数据库进行内部联接?

    我很难使用has many through关联 其中一些表位于单独的数据库中 database one class Input lt ApplicationRecord belongs to user Works great end dat
  • 是否可以在 proc 中查看 ruby​​ 代码?

    p Proc new puts ok 是否可以在过程中看到 ruby 代码 inspect返回内存位置 puts p inspect
  • Ruby 中 SecureRandom.urlsafe_base64(8) 的碰撞概率?

    我在用SecureRandom urlsafe base64 8 为了在我的系统中创建 URL 安全的唯一 ID 我想知道如何计算碰撞概率 我将大约 10 000 个这些 id 插入到一个数组中 我想避免检查其中一个键是否已经在数组中 但我
  • Rails 创建 schema_migrations - Mysql2::Error: 指定的键太长

    我正在使用Rails 3 2 6和Mysql 6 0 9 但我在MySQL 5 2 25上有完全相同的错误 当我创建新数据库时 rake db create 然后当我尝试加载架构时 rake schema load 我收到此错误 Mysql
  • Rails 是否为 rake 任务运行初始化程序?

    当我运行 rake 任务时 是否执行配置 初始化程序中的脚本 如果你的 rake 任务取决于 environment 即 您像这样声明您的任务 task my task gt environment do end
  • Rails 5.2 Active Storage 添加自定义属性

    我有一个带有附件的模型 class Project lt ApplicationRecord has many attached images end 当我附加并保存图像时 我还想保存一个附加的自定义属性 display order 整数
  • 无法安装 RMagick 0.0.0。找不到 Magick 配置

    我正在运行 debian 服务器并在一段时间后升级了所有软件包 apt get update apt get upgrade apt get distro upgrade 然后 rmagick 不再工作了 因为 imagemagick 被更
  • 使用自定义 gem 在 Dreamhost/Passenger 上部署 Sinatra 应用程序

    我有一个 Sinatra 应用程序 正在尝试在 Dreamhost 上运行 该应用程序利用 pony 发送电子邮件 为了让应用程序从一开始就启动并运行 在添加小马之前 我必须gem unpack rack and gem unpack si
  • 防止Rails Turbolinks导致Google地图JS多次执行

    我目前正在开发 Rails 应用程序 但出现以下错误 您已在此页面上多次包含 Google Maps API 这可能会导致意外错误 经过一番研究后 我发现 Turbolinks 导致了这个问题 当 的时候link to单击后 Google
  • Accepts_nested_attributes_for Rails 3 中的实际形式使用

    使用 Ruby on Rails 3 我半明白accepts nested attributes for是如何的supposed工作 但我无法找出以某种形式实现这一点的实用方法 例如 如果有人想在其用户页面中添加他们最近的位置 user r
  • 安装了 Rails 但它说我没有:)

    我刚刚执行了这个命令来安装 Rails gem install rails 它似乎运行良好并安装了东西 然后当我按照本教程进行操作时 http guides rubyonrails org getting started html http

随机推荐

  • shell 解析一行来查找某个标签

    我计划创建一个简单的脚本来根据属性文件中存储的值编辑文件 所以本质上我计划循环遍历原始文件中的每一行 当它遇到一行中的某个标签时 比如 它将获取该标签后面的文本 即证书 然后实现一个函数来解析属性文件获取某些值并将它们添加到原始文件中 例如
  • HTML5 的子集或约束可以完美映射到 XHTML5,反之亦然?

    我需要在 a 中表示内容通用语 也就是说 在当今时代 HTML5标准 我的目标不是在网络浏览器中显示页面 我需要代表仅有内容 没有界面 没有布局 没有逻辑 没有Javascript 正如所记得的其他问题 https stackoverflo
  • 如何枚举所有HID设备? C#

    我需要枚举连接到我的 PC 的所有 HID 设备 我尝试使用这个答案 https stackoverflow com a 3331509 902424 但它枚举了 USBHub 设备 但我在那里找不到我的 HID 设备 EDIT 我很高兴知
  • TCP recvfrom() 不存储“from”

    我正在使用 TCP 制作一个服务器程序 我想获取我刚刚收到的消息发送者的 IP 地址 这是我的代码 case FD READ Incoming data get ready to receive char buffer DEFAULT BU
  • 如何让 jquery 拖动在移动设备上工作?

    我有一个应用程序 允许用户拖动一些图像 它使用jquery 我试图让它在移动设备上工作 在iPhone上 如果我拖动图像 那么它会拖动整个页面 我想使用 jquery 移动 这是正确的方法吗 如果是这样 从常规 jquery 过渡到 jqu
  • 使用查询结果作为表名

    如果我们有如下表 A Table 如何执行涉及以下值的查询A table作为表名 我的意思是这样的 SELECT Table as tbl FROM A SELECT FROM tbl 但在一份声明中 SQLite没有内置的动态构造SQL语
  • Gephi 中的平行边是什么?导入边列表时如何处理它们?

    当我导入 gexf 文件时 它会标记一堆平行边 我不知道什么是平行边以及为什么我的图表存在问题 我正在尝试创建一个动态 gephi 图 如果一对两个节点之间有多条边 这些边彼此平行 因此它们是平行边 Gephi 中无法表示平行边 因此 Ge
  • Github 错误:找不到存储库(是的,还有另一个)

    我在这里搜索并阅读了大多数类似的问题 但似乎没有一个与我的相同 我在 Github 上有一个私人仓库 一个小时前我可以很好地推送 现在 我收到错误 未找到存储库消息 我的 ssh config 中有以下内容 Host github Host
  • GitHub:我为什么要分叉?

    我知道分叉是在服务器端克隆存储库 但我不明白为什么我要这么做 为什么不将原始存储库克隆到我的计算机 添加我的代码 而不是将新分支推送到 GitHub 并发出拉取请求 我知道分叉是在服务器端克隆存储库 差不多是这样吧 在 GitHub 上 分
  • JQuery 将变量从 href 传递到 load()

    我试图在 JQuery 中将 href id 传递给 load 我可以从警报中看到返回的 id 960 所以我知道 id 值已经过去了 我只是不知道如何附加加载 url refreshme add id 是重要的部分 我用它来刷新数据库拉取
  • 检查具有关联的对象

    我有两个模型 其中 A has many B 如果我加载 A 包括关联的 B a A find first include bs a inspect只显示a的属性 gt a 我能怎么做a inspect这样它就会显示所有关联的a bs 默认
  • Android 旋转位图而不进行复制

    有没有办法旋转位图而不复制它 或者也许是保存位图的图像视图 现在我有类似的东西 Bitmap bm BitmapFactory decodeFile get the orientation Matrix m new Matrix m pos
  • Linux 内核的静态调用图生成

    我正在寻找一个工具来静态生成 Linux 内核的调用图 对于给定的内核配置 生成的调用图应该是 完整的 即包含所有调用 包括潜在的间接调用 我们可以假设在 Linux 内核的情况下只能通过使用函数指针来完成调用 例如 这可以通过分析函数指针
  • pytest。使用堆叠参数化装饰器时定义预期结果的最佳方法?

    我有两个类似的测试用例 每个都有超过 100 行代码 这些代码为测试创建辅助对象 这些行非常相似 事实上 测试设置之间只有 2 行不同 我不想删除这些代码重复 我认为多个参数化可能会帮助我完成这项任务 使用多个参数化 我可以将设置组合起来
  • PHP会话文件权限

    我有文件index php
  • WebLogic 和 OSGi

    有没有办法在 Weblogic 应用程序服务器中运行 OSGi 容器 我知道它可以与 JBoss Glassfish 配合使用 并且可以将 Equinox servlet 桥添加到您的 OSGi 项目中 桥的实现太旧了 但我想要类似 JBo
  • npm install packagename --save-dev 不更新 package.json

    有没有简单或微妙的原因package json运行 save dev 后不会更新吗 这是我的命令 npm install modulename save dev 从项目的根目录运行 命令成功 新模块按预期显示在 node modules 目
  • 如何增加TabLayout中选项卡的图标大小

    我正在尝试增加应用程序中选项卡的图标大小 图标大小是固定的 尝试了很多方法 但没有任何效果 最后尝试了以下方法 但大小没有改变 如果有人能告诉我正确的方法 我会很高兴 提前致谢 这是我的代码 Toolbar toolbar Toolbar
  • @TransactionalEventListener 不起作用,因为 @EventListener 对于相同上下文就像魅力一样工作

    我正在从事 Spring Boot 应用程序的事件驱动设计 该代码由以下文件组成 Spring boot ApplicationEvent 文件 即 MyBusinessEvent java Data AllArgsConstructor
  • 有谁知道如何在 Rails 2.3 中正确处理用户时区?

    我们正在构建一个 Rails 应用程序 需要在多个时区显示日期 更重要的是计算日期 谁能告诉我如何在 Rails 2 3 5 或 8 中使用用户时区 我见过的最具包容性的文章详细介绍了用户时区的工作原理 如下 http wiki rubyo