रेलें: यूटीसी डेटाइम को किसी अन्य समय क्षेत्र में परिवर्तित करें


जवाबों:


206
time.in_time_zone(time_zone)

उदाहरण:

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

या केवल

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

आप कर सकते हैं ActiveSupport समय क्षेत्र के नाम पाकर:

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

Irb में, जब मैं Time.now.in_time_zone ('CST') की कोशिश करता हूं, तो मुझे "अपरिभाषित विधि 'in_time_zone' त्रुटि मिलती है। वहाँ रेल वर्गों है कि मैं यह काम करने के लिए प्राप्त करने की आवश्यकता है?
ड्रू जॉनसन

रेल का कौन सा संस्करण आप उपयोग कर रहे हैं? यदि आप Time.zone.now.in_time_zone (...) करते हैं तो क्या यह काम करता है?
मकेड

13
रेल के बाहर इसका उपयोग करने के लिए, require 'active_support/time'पहले।
सुनकु

3
आप सभी समय क्षेत्रों को चलाकर सूचीबद्ध कर सकते हैं rake time:zones:all। यह भी देखें rake -D time। डिफ़ॉल्ट समय क्षेत्र सेट करें config/application.rb
user664833

1
@AdamEberlin रेल में आप आमतौर पर ActiveSupport का उपयोग करते हैं :: TimeWithZone, डेटाइम नहीं। यह सभी कोड माणिक डेटाइम ऑब्जेक्ट्स के साथ-साथ टाइम ऑब्जेक्ट्स पर भी काम करता है।
21

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 

रेल 5 पर कार्य नहीं करता है 00:00 "my_date.to_time.to_datetime # => बुध, 29 मार्च 2017 17:00:20 +0000`
सिरिल डचोन-डोरिस

5

सादे माणिक्य में, केवल 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')}"

रूबी 2.3.7 के साथ परीक्षण किया गया जो मैक ओएस एक्स 10.13 पर मानक आया।


3

ActiveSupport की TimeWithZone ऑब्जेक्ट्स को TimeZone के साथ जोड़कर देखें। ActiveSupport एक UTC समय को एक निर्दिष्ट TimeZone टाइम ज़ोन में परिवर्तित करने के लिए in_time_zone विधि भी प्रदान करता है। mckeed का जवाब कोड दिखाता है।


TimeWithZone को मेरी कक्षा में आयात करने के लिए वाक्य रचना क्या है? या मैं इसे रेल के साथ डिफ़ॉल्ट रूप से प्राप्त करता हूं?
जॉनसन

1
मेरा मानना ​​है कि आप इसे डिफ़ॉल्ट रूप से प्राप्त करते हैं। mckeed में आपके लिए आवश्यक कोड है, लेकिन आप इसे irb में नहीं देखेंगे। आपको इसे रेल में चलाने की आवश्यकता है।
फ्रेड

आप सही हैं - धन्यवाद, फ्रेड - यह डिफ़ॉल्ट रूप से रेल के साथ आता है। मैं तिनके पर लोभी था, इसे irb में काम करने की कोशिश कर रहा था।
जॉनसन

3

बस के मामले में, यदि आप पटरियों में ActiveRecord ऑब्जेक्ट के साथ काम कर रहे हैं।

यह एक अच्छा विचार हो सकता है Time.use_zoneकि प्रति अनुरोध आधार समयक्षेत्र के लिए उपयोग किया जाए जो तयशुदा समयक्षेत्र में ओवरराइड करता हैconfig.time_zone

अधिक विवरण मैं https://stackoverflow.com/a/25055692/542995 पर समझाता हूं


0

मैं रेल्स 4 में simple_form का उपयोग कर रहा हूं और मैंने सिर्फ इनपुट फील्ड को इसमें जोड़ा है

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

प्रवास के साथ

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

1
यह इस सवाल का जवाब नहीं देता है कि आप दिनांक समय वस्तुओं को कैसे परिवर्तित करते हैं
zykadelic
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.