我不知道我是不是在做蠢事,所以请耐心等待。
tl; dr Rails ActiveSupport 时间和时区在 Alpine Linux 上似乎有错误。当它应该使用冬季时间时,它使用我的时区的 DST 变体(夏令时)。
重现步骤:
$ docker run -it --rm ruby:2.7.1-alpine sh
Run Code Online (Sandbox Code Playgroud)
以下所有步骤都发生在正在运行的 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
Run Code Online (Sandbox Code Playgroud)
$ ruby -e 'puts Time.now.inspect'
2020-10-28 20:34:24.4817918 +0000
Run Code Online (Sandbox Code Playgroud)
看起来挺好的。时间以 UTC 打印。
Time类只能处理本地时间。这取决于本地系统时区,它可以使用操作系统配置机制进行配置,或者可以简单地通过TZenv var传递给 Ruby 。让我们尝试使用我的时区“欧洲/柏林”:$ TZ="Europe/Berlin" ruby -e …Run Code Online (Sandbox Code Playgroud)