Rails:将UTC DateTime转换为另一个时区

Dre*_*son 108 ruby datetime runtime ruby-on-rails

在Ruby/Rails中,如何将UTC DateTime转换为另一个时区?

mck*_*eed 200

time.in_time_zone(time_zone)
Run Code Online (Sandbox Code Playgroud)

例:

zone = ActiveSupport::TimeZone.new("Central Time (US & Canada)")
Time.now.in_time_zone(zone)
Run Code Online (Sandbox Code Playgroud)

要不就

Time.now.in_time_zone("Central Time (US & Canada)")
Run Code Online (Sandbox Code Playgroud)

您可以通过执行以下操作找到ActiveSupport时区的名称:

ActiveSupport::TimeZone.all.map(&:name)
# or for just US
ActiveSupport::TimeZone.us_zones.map(&:name)
Run Code Online (Sandbox Code Playgroud)

  • 要在Rails之外使用它,首先需要'require_support/time'. (13认同)
  • 您可以通过运行`rake time:zones:all`列出所有时区.另见`rake -D time`.在`config/application.rb`中设置默认时区. (3认同)

vla*_*iov 6

如果Time.zone这是你想要的时区,那么你可以使用@date.to_time.to_datetime

> @date
=> Tue, 02 Sep 2014 23:59:59 +0000
> @date.class
=> DateTime
> @date.to_time
=> 2014-09-02 12:59:59 -1100
> @date.to_time.to_datetime
=> Tue, 02 Sep 2014 12:59:59 -1100 
Run Code Online (Sandbox Code Playgroud)

  • 不适用于 Rails 5 ` Time.zone # => Europe/Paris my_date # => 2017 年 3 月 29 日星期三 19:00:20 +0200 my_date.to_time # => "2017-03-29T17:00:20.000+ 00:00" my_date.to_time.to_datetime # => 2017 年 3 月 29 日星期三 17:00:20 +0000 ` (2认同)

jby*_*ler 5

在普通的 ruby​​ 中,只有require 'date',使用new_offset方法:

require 'date'

d=DateTime.parse('2000-01-01 12:00 +0200')
l=d.new_offset('-0700')
u=l.new_offset('UTC')
puts "#{u.strftime('%a %F %T %Z')} ? #{l.strftime('%a %F %T %Z')}"
Run Code Online (Sandbox Code Playgroud)

使用在 Mac OS X 10.13 上标配的 ruby​​ 2.3.7 进行测试。