Gem whenever 似乎存在默认上下午问题 (找到原因,是使用 chronic 解析时间导致的)

nagae_memooff · 2014年02月10日 · 最后由 nagae_memooff 回复于 2014年02月10日 · 2135 次阅读

我们现在这个项目之前是直接写 crontab 文件来执行定时任务的,在不同的服务器之间部署比较麻烦(由于许多原因,项目部署路径不一样,而且有些应用端口号也不一样,每次需要修改一些部署路径和配置文件),于是我就想至少把定时任务给用 whenever 做了吧,省得每次都 cd 到部署目录下,还要考虑到环境变量问题。 然后我刚才写了这么一个任务:

every :day, at: '3:00' do
rake 'sometask'
end

由于定时任务有好多,而且终端不能滚屏(orz)所以也就随便扫了一眼,然后发现生成的 cron 是这样的 0 15 * * * /bin/bash ........ 3:00 被解析成了 15 点。 推测是 whenever 或者是 rails 里涉及时间的某些机制导致的,于是由于现在是下午,就默认将 3:00 解析成下午三点了。 不知道这个问题算不算 bug,是不是其他 gem 中也会有类似问题。显式写成 03:00 就没有问题了。

=======修改分割线====== 已找到原因,见 3、4 楼。如果有遇到类似问题的可以参考一下。

服务器时区和 App 时区分别是哪个?

#1 楼 @kgen 都是北京时间。我估计可能在哪儿有一步根据现在时间,自动处理上下午了。

chronic 的问题。whenever 用了 chronic 解析: https://github.com/javan/whenever/blob/master/lib/whenever/cron.rb#L15

我在命令行试了一下,一样的问题:

irb(main):001:0> require 'chronic'
=> true
irb(main):002:0> Chronic.parse('3:00')
=> 2014-02-10 15:00:00 +0800
irb(main):003:0> 

https://github.com/mojombo/chronic/blob/master/lib/chronic/parser.rb#L12 默认用了 十二小时制 =, = 这样就可以了

Chronic.parse('3:00', hours24: true)

或者把 3:00 换成 3:00 am

#3 楼 @saiga 原来如此,THX!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号