रेल में एक समय क्षेत्र से दूसरे में समय परिवर्तित करें


105

मेरे created_atटाइमस्टैम्प UTC में संग्रहीत हैं:

>> Annotation.last.created_at
=> Sat, 29 Aug 2009 23:30:09 UTC +00:00

मैं उनमें से एक को 'पूर्वी समय (यूएस और कनाडा)' (दिन की बचत को ध्यान में रखते हुए) में कैसे परिवर्तित करूं? कुछ इस तरह:

Annotation.last.created_at.in_eastern_time

जवाबों:


191

दिनांक समय वर्ग के 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)')

7
या आप घंटे की पहचान का उपयोग कर सकते हैंnow.in_time_zone(3)
fl00r

8
created_at.in_time_zone("EST")छोटा है
ऑरलैंडो

51
"ईएसटी" = "पूर्वी मानक समय", इसलिए डेलाइट सेविंग टाइम के दौरान यह गलत होगा। "पूर्वी समय (यूएस और कनाडा)" यह पता लगाता है कि यह आपके लिए डीएसटी है या नहीं।
jhiro009

1
ध्यान दें कि in_time_zone विधि ActiveSupport का हिस्सा है, इस प्रकार यह रेल में बनाया गया है, लेकिन रूबी stdlib का हिस्सा नहीं है। यदि आपके पास एक रेल एप्लिकेशन है, तो कोई समस्या नहीं है। यदि आपके पास एक सीधा रूबी ऐप है तो आपको सक्रिय समर्थन की आवश्यकता होगी।
गेल

इस विधि के लिए प्रलेखन का लिंक यहां है: apidock.com/rails/DateTime/in_time_zone
नावेद खान

17

हालांकि यह एक पुराना सवाल है, यह कुछ उल्लेख करने लायक है। एक में पिछले जबाब यह एक before_filter उपयोग करने के लिए अस्थायी समय क्षेत्र सेट करने का सुझाव दिया है।

आपको कभी ऐसा नहीं करना चाहिए , क्योंकि Time.zone जानकारी को थ्रेड में संग्रहीत करता है, और यह संभवतः उस थ्रेड द्वारा संकलित अगले अनुरोध पर लीक हो जाएगा।

इसके बजाय आपको यह सुनिश्चित करने के लिए लगभग_फिल्टर का उपयोग करना चाहिए कि अनुरोध पूरा होने के बाद Time.zone रीसेट हो गया है। कुछ इस तरह:

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

इसके बारे में यहाँ और पढ़ें


1
आजकल एक अच्छा Time.use_zone तरीका है।
फ़्रीमैनॉइड

9

अगर आप इसे अपने साथ जोड़ते हैं /config/application.rb

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

फिर आप सेल कर सकते हैं

Annotation.last.created_at.in_time_zone

निर्दिष्ट समय क्षेत्र में समय पाने के लिए।


अगर हम application.rb में टाइम ज़ोन को कॉन्फ़िगर कर रहे हैं तो ".in_time_zone" पर कॉल करने की आवश्यकता नहीं है। रेल स्वचालित रूप से हमारे लिए ऐसा करती है जिस्ट को Annotation.last.created_at
विशाल

3

यदि आप अपने कॉन्फ़िगर करते हैं /config/application.rb

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

Time.now.in_time_zone

DateTime.now.in_time_zone

2

पूर्वी समय के लिए अपना समयक्षेत्र निर्धारित करें।

आप अपने डिफ़ॉल्ट टाइमज़ोन को config / environment.rb में सेट कर सकते हैं

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

अब आपके द्वारा निकाले गए सभी रिकॉर्ड उस समय क्षेत्र में होंगे। यदि आपको अलग-अलग समय क्षेत्र की आवश्यकता है, तो उपयोगकर्ता टाइमज़ोन के आधार पर कह सकते हैं कि आप इसे अपने नियंत्रक में पहले_फिल्टर के साथ बदल सकते हैं।

class ApplicationController < ActionController::Base

  before_filter :set_timezone

  def set_timezone
    Time.zone = current_user.time_zone
  end
end

बस यह सुनिश्चित करें कि आप डेटाबेस में अपने सभी समय को यूटीसी के रूप में संग्रहीत कर रहे हैं और सब कुछ मीठा होगा।


क्या यह मायने रखता है अगर आप एक एप्लीकेशन सर्वर चला रहे हैं जैसे कि mongrel, थिन या पैसेंजर? वे एक से अधिक उदाहरणों को चलाते हैं, एकल पिरोया हुआ जो मुझे विश्वास है? मैं गलत हो सकता हूं, जानना चाहूंगा!
नाइटकेडर

4
Time.zone=थ्रेड-सुरक्षित github.com/rails/rails/blob/master/activesupport/lib/… है
ऐसा न हो कि

यह '09 में नहीं रहा होगा?
नाइटेकोडर

2
@jpwynn: इसके अनुसार: github.com/rails/rails/commit/… यह 5 साल से अधिक समय से थ्रेड सुरक्षित है। आपकी समस्या के लिए कोई स्रोत या उदाहरण?
पास्कल

1
एक धागा कई सत्रों की सेवा कर सकता है। जब आप उपयोगकर्ता द्वारा लॉग इन किया जाता है तो इसे एक बार सेट करते हैं, उदाहरण के लिए, लॉग इन करने वाला सबसे पुराना उपयोगकर्ता उन सभी उपयोगकर्ताओं के लिए टाइमज़ोन सेट करेगा, जिनका सत्र उसी धागे का उपयोग करता है। इसलिए आप प्रत्येक पृष्ठ लोड के लिए प्रत्येक उपयोगकर्ता के लिए इसे सेट करने के लिए पहले_फिल्टर का उपयोग करें।
jpw
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.