Ruby on Rails中如何将Date转换为UTC时区的正午Time?
解决Ruby 3 + Rails 7中Date转UTC正午Time的问题
原代码出错的核心原因是逻辑错误,且依赖了当前时间的时区偏移而非目标日期的偏移:
date.to_time会生成你本地时区(英国)的当日午夜,比如2024-10-20 00:00 +0100(此时英国处于夏令时BST,偏移+1小时)- 加上
Time.now.gmt_offset(3600秒)相当于把本地午夜转成UTC的前一天23:00(2024-10-19 23:00 UTC) - 再加12小时自然得到UTC 11:00,完全偏离需求
下面是两种可靠的实现方式:
1. Rails原生推荐方法(最简洁)
利用Rails对Date的扩展方法,直接指定时区并修改时间:
date = Date.new(2024, 10, 20) utc_noon = date.in_time_zone('UTC').change(hour: 12) # => Wed, 20 Oct 2024 12:00:00 UTC +00:00
这个方法返回的是ActiveSupport::TimeWithZone类型,兼容所有Ruby Time的操作,且自动处理时区规则,不会受本地时区影响。
2. 纯Ruby方法(不依赖Rails扩展)
直接用Ruby的Time.utc构造函数,传入日期和时间参数:
date = Date.new(2024, 10, 20) utc_noon = Time.utc(date.year, date.month, date.day, 12) # => 2024-10-20 12:00:00 UTC
这个方法直接生成UTC时区的Time实例,完全不依赖本地时区设置,结果准确。
内容的提问来源于stack exchange,提问作者Masa Sakano
相关产品推荐
相关产品推荐

