如何从现有的 Time.zone 为 Rails 创建 Ruby DateTime?

Posted

技术标签:

【中文标题】如何从现有的 Time.zone 为 Rails 创建 Ruby DateTime?【英文标题】:How to create a Ruby DateTime from existing Time.zone for Rails? 【发布时间】:2013-03-28 18:16:03 【问题描述】:

我让用户在 Ruby on Rails 网站中输入日期。我将日期解析为 DateTime 对象,如下所示:

date = DateTime.new(params[:year].to_i, params[:month].to_i, params[:day].to_i, params[:hour].to_i, params[:minute].to_i)

date = DateTime.parse(params[:date])

DateTimes 都将在我之前设置的用户的时区中:

Time.zone = "Pacific Time (US & Canada)"

如何将上述DateTimes 解析为正确的时区?我知道DateTime.new 方法有第 7 个参数作为时间偏移量。有没有一种简单的方法可以在给定时间内查找时区的偏移量?还是我应该使用DateTime以外的其他东西?

【问题讨论】:

【参考方案1】:

如果您之前设置了Time.zone,则可以使用Time.zone.local

user_time = Time.zone.local(params[:year].to_i, params[:month].to_i, params[:day].to_i, params[:hour].to_i, params[:minute].to_i, 0)

查看ActiveSupport::TimeWithZone 文档。

【讨论】:

对于拥有 Railscasts.com 专业帐户的任何人:railscasts.com/episodes/106-time-zones-revised @wintermeyer 因为你,我才订阅了 railscasts,谢谢。 如果您想接受月份和日期的 0 或 -1 等参数,请参阅 ***.com/a/49559402/188574。【参考方案2】:

您可以使用以下代码创建一个带有您想要的TimeZoneDateTime 对象。

DateTime.new(2013, 6, 29, 10, 15, 30).change(:offset => "+0530")

更新:使用 new 1.9.1 版本的 Rails Ruby,下面的行就像魔术一样完成了同样的工作。

DateTime.new(2013, 6, 29, 10, 15, 30, "+0530")

文档here

【讨论】:

你有一个已经存在的时间和一个设定的时区你可以做 DateTime.new(2013, 6,29,10,15,30).change(:offset => known_time.zone) 这不会产生所需的值。关键是时间“10:15:30”应该在所需的时区,并且想要得到一个值: (byebug) p DateTime.new(2015,12,27,0,0, 0).change(:offset => 'America/New_York') 2015 年 12 月 27 日星期日 00:00:00 +0000 DateTime.new 接受偏移量作为第七个可选参数。用法见***.com/a/49559402/188574。 谢谢@twnaing。更新了评论:-)【参考方案3】:

如果您已经有一个名为“datetime”的正确 DateTime 对象,并且想要复制它,您可以简单地调用它的“getutc”,然后使用“in_time_zone”

DateTime.new(datetime.getutc.year, datetime.getutc.month, datetime.getutc.day, time.getutc.hour, time.getutc.min).in_time_zone

【讨论】:

【参考方案4】:

试试:

Time.zone = "Pacific Time (US & Canada)"
Time.zone.parse('8-11-2013 23:59:59') #=> Fri, 08 Nov 2013 23:59:59 PST -08:00 

Time.now.in_time_zone("Pacific Time (US & Canada)")

DateTime.now.in_time_zone("Pacific Time (US & Canada)")

【讨论】:

只是为了补充这里的答案,我会在常量中找到所有可用区域列表apidock.com/rails/TimeZone【参考方案5】:

DateTime.new 接受从 ruby​​ 1.9.1 开始的可选 offset 参数(作为第七个)

我们可以写

DateTime.new(2018, 1, 1, 0, 0, 0, Time.zone.formatted_offset)

【讨论】:

以上是关于如何从现有的 Time.zone 为 Rails 创建 Ruby DateTime?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 中获取 UTC 偏移量?

带rails 3的时区

如何从现有的 WSDL 和 XSD 文件生成 WCF 服务主机

试图从现有的 for 循环中读取文件

如何在 Rails 中将当前时间添加 10 天

如何从现有的远程分支创建本地分支?