因此我的rails应用程序支持不同的时区,并为每个请求设置时区,如下所示:
def set_current_time_zone
Time.zone = current_user.time_zone
end
除了jQuery日期时间选择器之外,我的所有格式和报告都在网站范围内工作。
表单以04/20/2018 5:23 AM
的格式提交开始时间。当我用下面的代码解析时间时,我得到以下输出。
# this is the value of params[:job][:start] 04/20/2018 5:23 AM
job.start = DateTime.strptime(params[:job][:start],"%m/%d/%Y %H:%M %p")
#printing job.start outputs this: 2018-04-20 00:23:00 -0500
正如您注意到时区已应用于时间,现在是错误的时间。我该如何纠正?
提前致谢。
答案 0 :(得分:0)
请注意DateTime.strptime('04/20/2018 5:23 AM',"%m/%d/%Y %H:%M %p")
将返回UTC =>Fri, 20 Apr 2018 05:23:00 +0000
但是,如果将此值存储到数据库字段,则在活动记录对象中,它会将时区值输出到您设置为Time.zone
这可能不是一个完整的答案,但可能会引导您朝着正确的方向前进。
答案 1 :(得分:0)
在上面的上一条评论中添加更多细节。
我在rails控制台中执行了此操作,我的模型为Shift
且start_time: datetime
。
2.1.3 :022 > time = "04/02/2018 5:23 AM"
=> "04/02/2018 5:23 AM"
2.1.3 :023 > Time.zone = "Singapore"
=> "Singapore"
2.1.3 :024 > shift.start_at = time
=> "04/02/2018 5:23 AM"
2.1.3 :025 > shift.save
(0.1ms) begin transaction
SQL (0.5ms) UPDATE "shifts" SET "start_at" = ?, "updated_at" = ? WHERE "shifts"."id" = 2 [["st
art_at", "2018-02-03 21:23:00.000000"], ["updated_at", "2018-05-02 05:43:38.527338"]]
(1.4ms) commit transaction
=> true
2.1.3 :026 > Time.zone = "Dublin"
=> "Dublin"
2.1.3 :027 > shift.start_at = time
=> "04/02/2018 5:23 AM"
2.1.3 :028 > shift.save
(0.2ms) begin transaction
SQL (0.4ms) UPDATE "shifts" SET "start_at" = ?, "updated_at" = ? WHERE "shifts"."id" = 2 [["st
art_at", "2018-02-04 05:23:00.000000"], ["updated_at", "2018-05-02 05:45:44.638291"]]
(1.4ms) commit transaction
=> true
查看SQL中的数据。