Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails中将时间从一个时区转换为另一个时区_Ruby On Rails_Ruby_Datetime - Fatal编程技术网

Ruby on rails 在Rails中将时间从一个时区转换为另一个时区

Ruby on rails 在Rails中将时间从一个时区转换为另一个时区,ruby-on-rails,ruby,datetime,Ruby On Rails,Ruby,Datetime,我在创建的时间戳存储在UTC中: >> Annotation.last.created_at => Sat, 29 Aug 2009 23:30:09 UTC +00:00 如何将其中一个转换为“东部时间(美国和加拿大)”(考虑到夏令时)?比如: Annotation.last.created_at.in_eastern_time around_filter :set_time_zone private def set_time_zone old_time_zone

我在创建的时间戳存储在UTC中:

>> Annotation.last.created_at
=> Sat, 29 Aug 2009 23:30:09 UTC +00:00
如何将其中一个转换为“东部时间(美国和加拿大)”(考虑到夏令时)?比如:

Annotation.last.created_at.in_eastern_time
around_filter :set_time_zone

private

def set_time_zone
  old_time_zone = Time.zone
  Time.zone = current_user.time_zone if logged_in?
  yield
ensure
  Time.zone = old_time_zone
end

使用DateTime类的in_time_zone方法

Loading development environment (Rails 2.3.2)
>> now = DateTime.now.utc
=> Sun, 06 Sep 2009 22:27:45 +0000
>> now.in_time_zone('Eastern Time (US & Canada)')
=> Sun, 06 Sep 2009 18:27:45 EDT -04:00
>> quit
那么你的例子呢

Annotation.last.created_at.in_time_zone('Eastern Time (US & Canada)')

将时区设置为东部时间

您可以在config/environment.rb中设置默认时区

config.time_zone = "Eastern Time (US & Canada)"
现在,您提取的所有记录都将位于该时区。如果您需要不同的时区,比如基于用户时区,您可以使用控制器中的before_过滤器对其进行更改

class ApplicationController < ActionController::Base

  before_filter :set_timezone

  def set_timezone
    Time.zone = current_user.time_zone
  end
end
class ApplicationController

只要确保您将所有时间都存储在数据库中作为UTC,一切都会很好。

如果您将其添加到
/config/application.rb

config.time_zone = 'Eastern Time (US & Canada)'
config.time_zone = 'Eastern Time (US & Canada)'

Time.now.in_time_zone

DateTime.now.in_time_zone
然后你就可以用手机了

Annotation.last.created_at.in_time_zone

获取指定时区的时间。

虽然这是一个老问题,但值得一提。在a中,建议使用before_过滤器临时设置时区

您应该永远不要这样做,因为Time.zone将信息存储在线程中,它可能会泄漏到该线程处理的下一个请求

相反,您应该使用around_过滤器来确保在请求完成后重置Time.zone。比如:

Annotation.last.created_at.in_eastern_time
around_filter :set_time_zone

private

def set_time_zone
  old_time_zone = Time.zone
  Time.zone = current_user.time_zone if logged_in?
  yield
ensure
  Time.zone = old_time_zone
end

如果配置
/config/application.rb

config.time_zone = 'Eastern Time (US & Canada)'
config.time_zone = 'Eastern Time (US & Canada)'

Time.now.in_time_zone

DateTime.now.in_time_zone

我使用此方法将datetime字符串解析为一个时区,然后将其转换为另一个时区

datetime=“2021-01-14 05:30”
datetime_in_ET=ActiveSupport::时区['Eastern Time(美国和加拿大)]。解析(datetime)
#=>2021年1月14日星期四05:30:00东部时间-05:00
时区内的日期时间(“澳大利亚/墨尔本”)
#=>2021年1月14日星期四21:30:00 AEDT+11:00
供参考:可用的时区字符串有:

{“国际日期线西部”=>“Etc/GMT+12”、“中途岛”=>“太平洋/中途岛”、“美属萨摩亚”=>“太平洋/帕戈帕戈”、“夏威夷”=>“太平洋/檀香山”、“阿拉斯加”=>“美洲/朱诺”、“太平洋时间(美国和加拿大)”=>“美洲/洛杉矶”、“蒂华纳”=>“美洲/蒂华纳”、“山地时间(美国和加拿大)”=>“美洲/丹佛”、“亚利桑那”=>“美洲/凤凰城”、“奇瓦瓦岛”=>“美洲/奇瓦瓦岛”、“马萨特兰岛”=>“美洲/马萨特兰岛”、“中部时间(美国和加拿大)”=>“美洲/芝加哥”、“萨斯喀彻温省”=>“美洲/里贾纳”、“瓜达拉哈拉岛”=>“美洲/墨西哥城”、“墨西哥城”=>“美洲/墨西哥城”、“蒙特雷”=>“美洲/蒙特雷”、“中美洲”=>“美洲/危地马拉”、“东部时间”(美国和加拿大)“美国/纽约”、“印第安纳州(东部)”=>“美国/印第安纳州/印第安纳波利斯”、“波哥大”=>“美国/波哥大”、“利马”、“基多”=>“美国/利马”、“大西洋时间(加拿大)”=>“美国/哈利法克斯”、“加拉加斯”=>“美国/加拉加斯”、“拉巴斯”、“圣地亚哥”=>“美国/圣地亚哥”、“纽芬兰”=>”“美洲/圣约翰”、“巴西利亚”=>“美洲/圣保罗”、“布宜诺斯艾利斯”=>“美洲/阿根廷/布宜诺斯艾利斯”、“蒙得维的亚”=>“美洲/蒙得维的亚”、“乔治敦”=>“美洲/圭亚那”、“波多黎各”=>“美洲/波多黎各”、“格陵兰”=>“美洲/哥达布”、“大西洋中部”=>“大西洋/南乔治亚州”、“亚速尔群岛”=>“大西洋/亚速尔群岛”、“佛得角”=>”大西洋/佛得角、都柏林、爱丁堡、欧洲/伦敦、里斯本、伦敦、卡萨布兰卡、非洲/卡萨布兰卡、蒙罗维亚、非洲/蒙罗维亚、UTC等/UTC、贝尔格莱德、布拉迪斯拉发、欧洲/布拉迪斯拉发、布达佩斯、欧洲/布达佩斯、卢布尔雅那欧洲/卢布尔雅那、布拉格、萨拉热窝、欧洲/萨拉热窝、斯科普里、华沙、萨格勒布、欧洲/萨格勒布、布鲁塞尔、欧洲/布鲁塞尔、哥本哈根、欧洲/哥本哈根、马德里、欧洲/马德里、巴黎、阿姆斯特丹、欧洲/阿姆斯特丹、柏林“欧洲/柏林”、“伯尔尼”=>“欧洲/苏黎世”、“苏黎世”=>“欧洲/苏黎世”、“罗马”=>“欧洲/罗马”、“斯德哥尔摩”=>“欧洲/斯德哥尔摩”、“维也纳”=>“欧洲/维也纳”、“中西部非洲”=>“非洲/阿尔及尔”、“布加勒斯特”=>“欧洲/布加勒斯特”、“开罗”=>“非洲/开罗”、“赫尔辛基”=>“欧洲/赫尔辛基”、“基辅”=>“欧洲/基辅”、“里加”=>“欧洲/里加”、”索非亚“=>“欧洲/索非亚”、“塔林”=>“欧洲/塔林”、“维尔纽斯”、“雅典”=>“欧洲/雅典”、“伊斯坦布尔”=>“欧洲/伊斯坦布尔”、“明斯克”=>“欧洲/明斯克”、“耶路撒冷”=>“亚洲/耶路撒冷”、“哈拉雷”=>“非洲/哈拉雷”、“比勒陀利亚”=>“非洲/约翰内斯堡”、“加里宁格勒”、“莫斯科”=>“欧洲/加里宁格勒”圣彼得堡“=>“欧洲/莫斯科”、“伏尔加格勒”=>“欧洲/伏尔加格勒”、“萨马拉”=>“欧洲/萨马拉”、“科威特”=>“亚洲/科威特”、“利雅得”=>“亚洲/利雅得”、“内罗毕”=>“非洲/内罗毕”、“巴格达”=>“亚洲/巴格达”、“德黑兰”=>“亚洲/德黑兰”、“阿布扎比”=>“亚洲/马斯喀特”、“马斯喀特”=>“亚洲/马斯喀特”、“巴库”=>“亚洲/巴库”、“第比利斯”=>“亚洲/第比利斯”“,”埃里温“=>”亚洲/埃里温“,”喀布尔“=>”亚洲/喀布尔“,”叶卡捷琳堡“,”伊斯兰堡“,”亚洲/卡拉奇“,”卡拉奇“,”亚洲/卡拉奇“,”塔什干“,”亚洲/塔什干“,”钦奈“,”亚洲/加尔各答“,”亚洲/加尔各答“,”孟买“,”亚洲/加尔各答“,”新德里“,”亚洲/加尔各答“,”加德满都“,”亚洲/加德满都“,”阿斯塔纳“=>“亚洲/达卡”、“达卡”=>“亚洲/达卡”、“斯里贾亚瓦登普拉”=>“亚洲/科伦坡”、“阿拉木图”=>“亚洲/阿拉木图”、“新西伯利亚”、“仰光”=>“亚洲/仰光”、“曼谷”=>“亚洲/曼谷”、“河内”=>“亚洲/曼谷”、“雅加达”=>“亚洲/雅加达”、“克拉斯诺亚尔斯克”=>“亚洲/克拉斯诺亚尔斯克”、“北京”=>“亚洲/上海”、“重庆”=>“亚洲/重庆”、“香港”=>“亚洲/香港”、“乌鲁木齐”=>“亚洲/乌鲁木齐”、“吉隆坡”=>“亚洲/吉隆坡”、“新加坡”=>“亚洲/新加坡”、“台北”=>“亚洲