- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不知道我是不是在做蠢事,所以请耐心等待。
tl;博士 Rails ActiveSupport 时间和时区在 Alpine Linux 上似乎有错误。当它应该使用冬季时间时,它使用我的时区的 DST 变体(夏令时)。
重现步骤:
$ docker run -it --rm ruby:2.7.1-alpine sh
以下所有步骤都发生在正在运行的 docker 容器内。
$ apk add --no-cache --update tzdata
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/community/x86_64/APKINDEX.tar.gz
(1/1) Installing tzdata (2020c-r0)
Executing busybox-1.31.1-r9.trigger
OK: 23 MiB in 37 packages
$ ruby -e 'puts Time.now.inspect'
2020-10-28 20:34:24.4817918 +0000
看起来不错。时间以 UTC 打印。
Time
类只能处理本地时间。这取决于本地系统时区,它可以使用操作系统配置机制进行配置,或者可以简单地通过 TZ
传递给 Ruby。环境变量。让我们尝试使用我的时区“欧洲/柏林”:$ TZ="Europe/Berlin" ruby -e 'puts Time.now.inspect'
2020-10-28 21:39:22.7037648 +0100
看起来不错。柏林时区在冬季(标准)是 UTC+01,在夏季(DST)是 UTC+02。在撰写本文时,我们有冬天,所以
+0100
很好。
$ gem install activesupport
Fetching tzinfo-1.2.7.gem
Fetching i18n-1.8.5.gem
Fetching activesupport-6.0.3.4.gem
# #### many more lines of output ####
Successfully installed activesupport-6.0.3.4
6 gems installed
Time.current
,所以让我们试试这个:$ ruby -e 'require "active_support/all"; puts Time.current.inspect'
2020-10-28 20:43:51.1098842 +0000
这看起来与步骤 3 的输出没有什么不同。原因是
Time.current
仅与
Time.now
的行为不同配置时区时。
Time.zone=(timezone_identifier)
为 ActiveSupport 配置时区或与 Time.use_zone(timezone_identifier) { "inside this block the timezone is used" }
.让我们尝试第一个变体:$ ruby -e 'require "active_support/all"; Time.zone = "UTC"; puts Time.current.inspect'
Wed, 28 Oct 2020 20:50:55 UTC +00:00
我们仍然使用 UTC,但输出看起来与以前不同。由此我们知道我们得到了一个
ActiveSupport::TimeWithZone
目的。这很好。
$ ruby -e 'require "active_support/all"; Time.zone = "Europe/Berlin"; puts Time.current.inspect'
Wed, 28 Oct 2020 22:52:21 CEST +02:00
乍一看,这看起来不错,但请仔细将其与步骤 4 的输出进行比较。在“欧洲/柏林”时区中,我们目前有冬季时间 UTC+01,也称为“CET”(中欧时间)。但是这次在输出中时间戳被标记为“CEST”(中欧夏令时),即 UTC+02。
最佳答案
原来这是一个影响 tzinfo
的问题。 gem(版本 < 1.2.8
/< 2.0.3
) - 它是 incompatible with timezone-data 2020b (以后?),以及 Alpine ship with 2020c 的最新版本.文件格式从“fat”更改为“slim”,与 tzinfo
不兼容。 gem 呢。
更新解决方案 (2020-11-09)
对“slim”格式 zoneinfo 文件的支持现已添加到 tzinfo
发布中的 gem :
tzinfo-data
gem 而不是依赖于系统 tzinfo:
gem install activesupport tzinfo-data
ruby -e 'require "active_support/all"; Time.zone = "Europe/Berlin"; puts TZInfo::DataSource.get; puts Time.current.inspect'
# Ruby DataSource
# Thu, 29 Oct 2020 16:25:08 CET +01:00
原始的阿尔卑斯解决方案
FROM ruby:2.7.2-alpine
# Install tzdata because we need the zic binary
RUN apk add --no-cache tzdata
# Fix incompatibility with slim tzdata from 2020b onwards
RUN wget https://data.iana.org/time-zones/tzdb/tzdata.zi -O /usr/share/zoneinfo/tzdata.zi && \
/usr/sbin/zic -b fat /usr/share/zoneinfo/tzdata.zi
然后测试
Europe/Berlin
中的时间:
gem install activesupport
ruby -e 'require "active_support/all"; Time.zone = "Europe/Berlin"; puts TZInfo::DataSource.get; puts Time.current.inspect'
# Zoneinfo DataSource: /usr/share/zoneinfo
# Thu, 29 Oct 2020 16:29:19 CET +01:00
关于ruby - Alpine Linux 上的 Rails ActiveSupport 时间和时区错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64581249/
当我尝试执行 rails server 和 thin start 时,两者都说:“在任何来源中都找不到 activesupport-3.0.6。” 我安装了 activesupport-3.0.7。我
在迁移到 rails 5 之前,它运行良好,但是当我迁移到 rails 5.1.1 时,它给我这样的错误 ActiveSupport::MessageVerifier::InvalidSignatur
在尝试启动某个开源 Rails 项目的旧版本时,遇到了一条多云的错误消息: “无法激活 activesupport (>= 2.3.2, runtime),已经激活 activesupport-2.1
我在将我的 React on Rails 应用程序部署到 Heroku 时遇到了一些麻烦。我已经阅读并尝试了无数关于如何解决 secret_key_base 和 rails_master_key 问题
我已将 Ruby on Rails 应用程序从 Rails 5.1.2 迁移到 Rails 5.2.0 以使用加密的 secret 。应用程序已成功部署到 Digital Ocean Ubuntu 服
我已将 Ruby on Rails 应用程序从 Rails 5.1.2 迁移到 Rails 5.2.0 以使用加密的 secret 。应用程序已成功部署到 Digital Ocean Ubuntu 服
我找到了 ActiveSupport 变形器类。在哪里可以找到初始化英文变形器的代码? 最佳答案 ActiveSupport inflector.rb文件包含所有词形变化库和模块。 如果您想自定义它,
我正在使用带有 rails 3 的 mongoid 并且最近遇到了一个非常艰难的问题 问题,我需要一个建议。 我正在开发 CMS,其中一个想法是 CMS 将提供 一些基本模型定义和最终用户将在需要时扩
我在纽约有我的 Linux 服务器,配置为 GMT。 我所有的日期都以 UTC 格式保存。 要将这些日期返回给客户,我唯一需要做的是 ? date = my_date.utc_to_local 不管我
我有一个令人尴尬的基本问题: 我正在研究一个处理金钱的普通老式 ruby 模型,一些类方法返回需要格式化才能显示的价格。 过去我曾使用 include ActionView::Helpers::N
我遇到了一个小问题...我正要在 Exercism.io 上开始一些卡塔练习当我运行测试时,我有一个 Gem:ConflictError /Users/john/.rbenv/versions/2.4
我有一个这样的日期对象: >> the_date => Tue, 12 Jun 2012 >> the_date.class => Date 和一个存储为字符串的时区: >> tz = "Pacifi
我已经从 Rails 应用程序中提取了一个类到 a gem 中.它非常非常简单,但我当然想对其进行全面测试(我使用的是 rspec)。 该类进行一些简单的日期计算。它不依赖于 Rails,但由于它是在
我很高兴也很惊讶地发现 ActiveSupport 以我想要的方式计算月数。无论所讨论的月份有多少天,添加 1.month到特定的 Time将使您与 Time 在同一天. > Time.utc(201
我有一个非常简单的设置来测试 rails3 ActiveSupport::Notifications。通过阅读文档,ActiveSupport::Notifications.subscribe 位应该
是否可以在类方法上使用 ActiveSupport::Callbacks?更具体地说,在下面的模块中,您会将 include ActiveSupport::Callbacks 放在哪里,以使 defi
我想在我的一个模型上使用 ActiveSupport 选项 encode_big_decimal_as_string。我应该把它放在模型中吗?我是否在模型实例上调用此方法?我要把它放在配置中的某个地方
我正在研究 CodeSchool 的 RubyBits,我做了一个我只是不理解的练习:“确保 AtariLibrary 类只包含 LibraryUtils 模块,并让 ActiveSupport::C
我在 Rails 3 应用程序中收到 SystemStackError。 我拥有的所有信息都是无用的一行堆栈跟踪(从日志中获取): SystemStackError (stack level too
我知道 include 用于将模块方法作为实例方法访问,而 extend 用于将模块方法作为类方法访问。 对于 ActiveSupport::Concern 某处我看到写成, module Test
我是一名优秀的程序员,十分优秀!