रेल 3 में UTC को स्थानीय समय में बदलें


95

मुझे UTC Timeया TimeWithZoneस्थानीय समय को रेल 3 में परिवर्तित करने में समस्या हो रही है ।

यूटीसी में momentकुछ Timeचर कहते हैं (जैसे moment = Time.now.utc)। momentडीएसटी (यानी ईएसटी / ईडीटी का उपयोग करके) मैं अपने समय क्षेत्र में कैसे परिवर्तित करूं?

अधिक सटीक रूप से, मैं "सोमवार 14 मार्च, सुबह 9 बजे" का प्रिंटआउट लेना चाहता हूं, यदि समय आज सुबह 9 बजे ईडीटी और "सोमवार 7 मार्च, 9 बजे" के अनुरूप हो, यदि समय 9 बजे ईएसटी पिछले सोमवार था।

उम्मीद है कि एक और तरीका है?

संपादित करें : मैंने पहले सोचा था कि "EDT" एक मान्यता प्राप्त समयक्षेत्र होना चाहिए, लेकिन "EDT" एक वास्तविक समयक्षेत्र नहीं है, एक समयक्षेत्र की स्थिति की तरह। उदाहरण के लिए यह पूछने का कोई मतलब नहीं होगा Time.utc(2011,1,1).in_time_zone("EDT")। यह थोड़ा भ्रमित है के रूप में "ईएसटी" है एक वास्तविक समय क्षेत्र, कुछ स्थानों है कि डेलाइट बचत समय का उपयोग नहीं करते और कर रहे हैं (यूटीसी -5) yearlong में इस्तेमाल किया।

जवाबों:


113

रेलों के अपने नाम हैं। इन्हें देखें:

rake time:zones:us

आप rake time:zones:allसभी समय क्षेत्रों के लिए भी दौड़ सकते हैं । अधिक ज़ोन से संबंधित रेक कार्य देखने के लिए:rake -D time

तो, EST में बदलने के लिए, DST के लिए स्वचालित रूप से खानपान:

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

21
वेब एप्लिकेशन तक पहुंचने वाले उपयोगकर्ता के लिए आप समय क्षेत्र का उपयोग कैसे कर सकते हैं?
dmonopoly

एकमात्र तरीका मुझे जावास्क्रिप्ट के साथ मिला और फिर इसे सर्वर पर वापस भेज दिया गया। (new Date()).getTimeZoneOffset()। लेकिन यह काफी असंगत है, इसलिए इस आदमी ने अपना लिखा हुआ लगता है: onlineaspect.com/2007/06/08/…
ड्यूक

2
स्वचालित रूप से सभी ActiveRecord datetimes - config.time_zone = 'पूर्वी समय (यूएस और कनाडा)' में समय क्षेत्र को जोड़ दें - config / application.rb में
idrinkpabst

अपडेट: नए समाधान के लिए लिंक किए गए जेएस समाधान बिंदुओं के मालिक: pellepim.bitbucket.org/jstz
Miles

@dmonopoly आप एप्लिकेशन कॉन्फिगर में टाइमज़ोन सेट कर सकते हैं config.time_zone = 'Wellington'और फिर Time.current (जो time.now के बराबर है, लेकिन आपके द्वारा सेट किए गए टाइमज़ोन का उपयोग करता है) का उपयोग करें
शॉन

114

Time#localtime कोड चलाने वाली मशीन के वर्तमान समय क्षेत्र में आपको समय देगा:

> moment = Time.now.utc
  => 2011-03-14 15:15:58 UTC 
> moment.localtime
  => 2011-03-14 08:15:58 -0700 

अद्यतन: यदि आप अपने समयक्षेत्र के बजाय विशिष्ट समय क्षेत्रों में परिवर्तित करना चाहते हैं, तो आप सही रास्ते पर हैं। हालांकि, ईएसटी बनाम ईडीटी के बारे में चिंता करने के बजाय, बस सामान्य पूर्वी समय क्षेत्र में पास करें - यह उस दिन के आधार पर पता चलेगा कि यह ईडीटी है या ईएसटी:

> Time.now.utc.in_time_zone("Eastern Time (US & Canada)")
  => Mon, 14 Mar 2011 11:21:05 EDT -04:00 
> (Time.now.utc + 10.months).in_time_zone("Eastern Time (US & Canada)")
  => Sat, 14 Jan 2012 10:21:18 EST -05:00 

यह एक शुरुआत है। मैं वर्तमान समय क्षेत्र कैसे सेट कर सकता हूं (क्योंकि मुझे यह भी पता नहीं है कि ऐप को कहां होस्ट किया जाएगा, सर्वर एक अलग समयक्षेत्र में हो सकता है तब क्या उपयोग किया जाना चाहिए)।
मार्क-आंद्रे लाफ्यून

6
"स्थानीय समय" विधि मस्त है, लेकिन कोड चलाने वाली मशीन का समय क्षेत्र उतना उपयोगी नहीं है जितना कि उपयोगकर्ता वेब ऐप तक पहुँचने के समय क्षेत्र के लिए। (जैसा कि यहां बताया गया है: stackoverflow.com/questions/6003491/rails-3-user-timezones/… ) वेब ऐप एक्सेस करने वाले उपयोगकर्ता के लिए आप समय क्षेत्र कैसे प्राप्त कर सकते हैं?
dmonopoly

@ मुझे लगता है कि आप अपने उपयोगकर्ताओं को उनके टाइमज़ोन चुनने के लिए एक विकल्प सेट कर सकते हैं, और फिर उनके टाइमज़ोन के in_time_zoneसाथ विधि का उपयोग कर सकते हैं।
डायलन मार्क

1
धन्यवाद, स्थानीय तरीका वही है जिसकी मुझे आवश्यकता थी।
बॉब

Time.now.localtimeएक सामान्य irb सत्र पर काम करता है, लेकिन जब मैं इसे एक मशीन पर चलाने की कोशिश करता हूं जो UTC टाइमज़ोन में है, तो यह काम नहीं करता है।
अवा

15

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

config.time_zone = Time.now.zone

फिर, रेल को आपको अपने स्थानीय समय में टाइमस्टैम्प दिखाना चाहिए या आप स्थानीयकरण प्राप्त करने के लिए इस निर्देश का उपयोग कर सकते हैं

Post.created_at.localtime

15

वहाँ वास्तव में एक अच्छी मणि local_timebasecamp द्वारा कहा जाता है कि केवल ग्राहक पक्ष में है, मुझे विश्वास है:

https://github.com/basecamp/local_time


यह सबसे अच्छा काम करता है। हम पहले से ही संग्रहीत समय को जानते हैं, उपयोगकर्ता को प्रारूप में इसे दिखाने का तरीका मेरी राय में ग्राहक की ओर से सबसे अच्छा किया जाता है और यह ऐसा करता है।
नीरज शुक्ला

1

पता नहीं क्यों, लेकिन मेरे मामले में यह पहले सुझाए गए तरीके से काम नहीं करता है। लेकिन यह इस तरह काम करता है:

Time.now.change(offset: "-3000")

बेशक आपको अपना offsetमूल्य बदलने की जरूरत है ।


0

यदि आप वास्तव में ऐसा सिर्फ इसलिए कर रहे हैं क्योंकि आप उपयोगकर्ता का टाइमज़ोन प्राप्त करना चाहते हैं, तो आपको बस इतना करना है कि आप में अपना टाइमज़ोन बदल दें config/applications.rb

ऐशे ही:

रेल, डिफ़ॉल्ट रूप से, आपका समय रिकॉर्ड UTC में बचाएगा, भले ही आप वर्तमान समय क्षेत्र निर्दिष्ट करें।

config.time_zone = "Singapore"

तो यह सब आपको करना है और आप जाने के लिए अच्छे हैं।

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