Rails: UTC DateTime'ı başka bir saat dilimine dönüştürme


Yanıtlar:


206
time.in_time_zone(time_zone)

Misal:

zone = ActiveSupport::TimeZone.new("Central Time (US & Canada)")
Time.now.in_time_zone(zone)

ya da sadece

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

ActiveSupport saat dilimlerinin adlarını şu şekilde bulabilirsiniz:

ActiveSupport::TimeZone.all.map(&:name)
# or for just US
ActiveSupport::TimeZone.us_zones.map(&:name)

İrb'de Time.now.in_time_zone ('CST') denediğimde "undefined method 'in_time_zone" hatası alıyorum. Bunun çalışması için ihtiyacım olan ray sınıfları var mı?
Drew Johnson

Hangi Rails sürümünü kullanıyorsunuz? Time.zone.now.in_time_zone (...) yaparsan işe yarıyor mu?
mckeed

13
Bunu Rails dışında kullanmak için require 'active_support/time'önce.
sunaku

3
Koşarak tüm saat dilimlerini listeleyebilirsiniz rake time:zones:all. Ayrıca bakınız rake -D time. Varsayılan saat dilimini olarak ayarlayın config/application.rb.
user664833

1
@AdamEberlin Rails'de DateTime değil, genellikle ActiveSupport :: TimeWithZone kullanırsınız. Tüm bu kod, Ruby DateTime nesnelerinde ve Time nesnelerinde çalışır.
mckeed

6

eğer Time.zonesizin istediğiniz saat dilimi var o zaman kullanabilirsiniz@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 

Rails 5 "Time.zone # => Europe / Paris my_date # => Wed, 29 Mar 2017 19:00:20 +0200 my_date.to_time # =>" 2017-03-29T17: 00: 20.000+ üzerinde çalışmıyor 00:00 "my_date.to_time.to_datetime # => Çar, 29 Mar 2017 17:00:20 +0000`
Cyril

5

Sade yakutta sadece require 'date'şu new_offsetyöntemi kullanın :

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')}"

Mac OS X 10.13'te standart olarak gelen Ruby 2.3.7 ile test edilmiştir.


3

ActiveSupport'un TimeZone ile değiştirilmiş TimeWithZone nesnelerini deneyin . ActiveSupport, UTC saatini belirli bir TimeZone saat dilimine dönüştürmek için in_time_zone yöntemini de sağlar. mckeed'in cevabı kodu gösterir.


TimeWithZone'u sınıfıma aktarmanın sözdizimi nedir? Yoksa bunu varsayılan olarak Rails ile mi alıyorum?
Drew Johnson

1
Varsayılan olarak aldığına inanıyorum. mckeed ihtiyacınız olan koda sahiptir, ancak bunu irb'de görmeyeceksiniz. Rails'de çalıştırmanız gerekiyor.
Fred

Haklısın - teşekkürler, Fred - varsayılan olarak Rails ile birlikte gelir. Kamışları tutuyordum, IRB'de çalıştırmaya çalışıyordum.
Drew Johnson

3

Her ihtimale karşı, Rails'te ActiveRecord nesnesiyle uğraşıyorsanız.

İçinde Time.use_zoneayarlanan varsayılan saat dilimini geçersiz kılan istek başına temel bir saat dilimi kullanmak iyi bir fikir olabilir .config.time_zone

Https://stackoverflow.com/a/25055692/542995 adresinde açıkladığım daha fazla ayrıntı


0

Rails 4'te simple_form kullanıyorum ve giriş alanını şu şekilde ekledim:

<%= f.input :time_zone, :as => :time_zone %>

göç ile

class AddTimeZoneColumnToTextmessage < ActiveRecord::Migration
  def change
    add_column :textmessages, :time_zone, :string
  end
end

1
Bu, DateTime nesnelerini nasıl dönüştürebileceğiniz sorusuna cevap vermiyor
zykadelic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.