W Ruby / Rails, jak przekonwertować UTC DateTime na inną strefę czasową?
W Ruby / Rails, jak przekonwertować UTC DateTime na inną strefę czasową?
Odpowiedzi:
time.in_time_zone(time_zone)
Przykład:
zone = ActiveSupport::TimeZone.new("Central Time (US & Canada)")
Time.now.in_time_zone(zone)
Lub tylko
Time.now.in_time_zone("Central Time (US & Canada)")
Możesz znaleźć nazwy stref czasowych ActiveSupport, wykonując:
ActiveSupport::TimeZone.all.map(&:name)
# or for just US
ActiveSupport::TimeZone.us_zones.map(&:name)
require 'active_support/time'
najpierw.
rake time:zones:all
. Zobacz także rake -D time
. Ustaw domyślną strefę czasową w config/application.rb
.
jeśli Time.zone
jest to Twoja żądana strefa czasowa, możesz użyć@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
W zwykłym rubinie, tylko z require 'date'
użyciem new_offset
metody:
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')}"
Testowano z Ruby 2.3.7, który był standardowo w systemie Mac OS X 10.13.
Wypróbuj obiekty TimeWithZone firmy ActiveSupport manipulowane za pomocą TimeZone. ActiveSupport zapewnia również metodę in_time_zone do konwersji czasu UTC na określoną strefę czasową TimeZone. Odpowiedź McKeeda pokazuje kod.
Na wszelki wypadek, jeśli masz do czynienia z obiektem ActiveRecord w Railsach.
Dobrym pomysłem może być użycie Time.use_zone
strefy czasowej na żądanie, która zastępuje domyślną strefę czasową ustawioną wconfig.time_zone
Więcej szczegółów wyjaśniam na https://stackoverflow.com/a/25055692/542995
Używam simple_form w Rails 4 i właśnie dodałem pole wejściowe jako
<%= f.input :time_zone, :as => :time_zone %>
z migracją
class AddTimeZoneColumnToTextmessage < ActiveRecord::Migration
def change
add_column :textmessages, :time_zone, :string
end
end