एक विशिष्ट समयक्षेत्र में प्रारूप तिथि


177

मैं अपने वेब ऐप में क्षणों को पार्स और प्रारूप करने के लिए Moment.js का उपयोग कर रहा हूं । एक JSON ऑब्जेक्ट के भाग के रूप में, मेरा बैकेंड सर्वर UTC युग (Unm ऑफ़सेट) से कई मिलीसेकंड के रूप में दिनांक भेजता है।

एक विशिष्ट टाइमज़ोन में पार्सिंग की तारीख आसान है - बस पार्सिंग से पहले स्ट्रिंग के अंत में आरएफसी 822 टाइमज़ोन पहचानकर्ता को जोड़ें:

// response varies according to your timezone
const m1 = moment('3/11/2012 13:00').utc().format("MM/DD HH:mm")

// problem solved, always "03/11 17:00"
const m2 = moment('3/11/2012 13:00 -0400').utc().format("MM/DD HH:mm")

console.log({ m1, m2 })
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

लेकिन मैं स्पेसक टाइमज़ोन में तारीख कैसे प्रारूपित करूं ?

मुझे ब्राउज़र के वर्तमान समय की परवाह किए बिना लगातार परिणाम चाहिए, लेकिन मैं UTC में दिनांक प्रदर्शित नहीं करना चाहता।


2
पल इसका समर्थन नहीं करता है, लेकिन वे इस पर काम कर रहे हैं। github.com/timrwood/moment/pull/671
बेन

5
यह सिर्फ काम करना चाहिए। यदि आप एक समय स्ट्रिंग पास करते हैं जिसमें वांछित ऑफ़सेट शामिल हैं, तो उसे उस समय को ऑफ़सेट रखना चाहिए और स्थानीय समय को प्रदर्शित करना चाहिए, न कि स्वचालित रूप से ब्राउज़र-स्थानीय समय में समायोजित करने के बजाय। अगर मैं इसे ब्राउज़र-स्थानीय समय में समायोजित करना चाहता था, तो मैं इसे स्पष्ट रूप से उपयोग करने के लिए एक ऑफसेट देने के बजाय इसे UTC समय दूंगा। मेरा मतलब है ... मैं इसे एक स्पष्ट ऑफसेट देता हूं, यह मूल रूप से इसे क्यों खा रहा है और ऐसा करने से यह ब्राउज़र ऑफसेट का अपना रूपांतरण है। भयानक डिजाइन।
त्रिवेंको

@ ट्रायनको ऑफ़सेट दिन के उजाले की बचत के अधीन हैं, यह हमेशा अपेक्षा के अनुरूप काम नहीं करता है।
गुलाबीपानी

1
इससे संबंधित कुछ, मैं एक विशिष्ट प्रारूप में समय प्रिंट करना चाहता हूं, जैसे 15 मार्च, 2018 लेकिन ऐसा करने के लिए प्रारूप स्ट्रिंग नहीं ढूंढ सकता। जेनेरिक DD MMM, YYYYकाम नहीं करता है, जब मैं इसका उपयोग करता हूं moment.tz("2018-02-15T14:20:00.000+0530", "Asia/Bangkok").format("DD MMM, YYYY")। क्या कोई मुझे दस्तावेज में इंगित कर सकता है, जहां मैं इस एपीआई का उपयोग करते समय प्रारूपण के लिए सभी कुंजी पा सकता हूं।
pmmdk

@PramodKumar क्या गलत है? वह देता है "15 Feb, 2018"। क्या आप DD MMMM, YYYYपाने के लिए प्रारूप स्ट्रिंग का उपयोग करने का मतलब है "15 February, 2018"?
शांतिकाल

जवाबों:


248

जैसा कि मंटो के जवाब में बताया गया है , .utcOffset()मोमेंट 2.9.0 की पसंदीदा विधि है। यह फ़ंक्शन UTC से वास्तविक ऑफ़सेट का उपयोग करता है, न कि रिवर्स ऑफ़सेट (जैसे, DST के दौरान न्यूयॉर्क के लिए -240)। "+0400" जैसे ऑफसेट स्ट्रिंग्स पहले जैसे ही काम करते हैं:

// always "2013-05-23 00:55"
moment(1369266934311).utcOffset(60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).utcOffset('+0100').format('YYYY-MM-DD HH:mm')

.zone()सेटर के रूप में पुराने मोमेंट.जेएस 2.9.0 में पदावनत किया गया था । इसने एक टाइमज़ोन आइडेंटिफ़ायर (उदाहरण के लिए, -4 घंटे के लिए "-0400" या "-04: 00") या यूटीसी के पीछे मिनटों का प्रतिनिधित्व करने वाली संख्या (जैसे, डीएसटी के दौरान न्यूयॉर्क के लिए 240 ) को स्वीकार किया ।

// always "2013-05-23 00:55"
moment(1369266934311).zone(-60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).zone('+0100').format('YYYY-MM-DD HH:mm')

न्यूमेरिक ऑफ़सेट्स के बजाय नामित टाइमज़ोन के साथ काम करने के लिए, मोमेंटम टाइमज़ोन शामिल करें और .tz()इसके बजाय उपयोग करें :

// determines the correct offset for America/Phoenix at the given moment
// always "2013-05-22 16:55"
moment(1369266934311).tz('America/Phoenix').format('YYYY-MM-DD HH:mm')

मुझे "TypeError: Object 240 में कोई विधि 'प्रारूप'" त्रुटि के माध्यम से इससे परेशानी हो रही थी। मुझे एहसास हुआ कि ज़ोन केवल 2.1.0 संस्करण और मोमेंट.जेएस के संस्करण पर एक सेटर के रूप में उपलब्ध है (और मैं पुराने संस्करण पर था)। धन्यवाद!
मेलिंडा विंग्स

5
@ebi यह पहले से ही डिफ़ॉल्ट रूप से ब्राउज़र के टाइमज़ोन का उपयोग करता है। करने के लिए का उपयोग ऑफसेट ब्राउज़र के समय क्षेत्र, उपयोग .zone()एक गेटर, जो यूटीसी (जैसे, रिटर्न मानक समय के दौरान न्यूयॉर्क के लिए 300) से कुछ ही मिनटों रिटर्न के रूप में।
चुपचाप

1
@ EricCope नहीं, काफी नहीं। आप कर सकते हैं का उपयोग .tz("America/Phoenix")करता है, तो आप शामिल momentjs.com/timezone रूप में अच्छी तरह है, लेकिन। मैंने एक उदाहरण के साथ उत्तर को अपडेट किया है।
चुपचाप

1
ध्यान दें कि ऑफ़सेट का उपयोग अपेक्षा के अनुरूप काम नहीं करेगा यदि दिन के उजाले की बचत के कारण टाइमज़ोन के अलग-अलग ऑफसेट हैं।
गुलाबीपन

1
विल .utcOffset () स्वचालित रूप से दिन के समय की बचत का प्रबंधन करेगा? जैसे जब मैं सर्दियों में UTC +1 CET सेट करता हूँ तो क्या यह डेलाइट सेविंग टाइम के दौरान UTC +2 CEST पर दांव लगाएगा? इसका कारण यह प्रयोग करने योग्य है या नहीं!
हेमसे

61

समय-समय पर उपयोग करें

moment(date).tz('Europe/Berlin').format(format)

किसी विशेष समय-क्षेत्र का उपयोग करने में सक्षम होने से पहले, आपको इसे लोड करने की आवश्यकता होगी (या यहां वर्णित वैकल्पिक तरीकों का उपयोग करके )

moment.tz.add('Europe/Berlin|CET CEST CEMT|-10 -20 -30')

मुझे नहीं लगता कि जब सवाल पूछा गया था तो tz उपलब्ध था, लेकिन मुझे लगता है कि यह जाने का रास्ता हो सकता है। मैं वर्तमान में MySQL में UTC के रूप में संग्रहीत सभी टाइमस्टैम्प के साथ एक परिचित समस्या पर काम कर रहा हूं, लेकिन उपयोगकर्ता कॉन्फ़िगरेशन पर निर्भर एक विशिष्ट क्षेत्र में देखा जा सकता है और क्लाइंट के समय क्षेत्र पर नहीं।
निकड्नक

47

उत्तर के एक जोड़े ने पहले ही उल्लेख किया है कि क्षण-समयक्षेत्र नाम टाइमज़ोन के साथ जाने का तरीका है। मैं सिर्फ इस लाइब्रेरी के बारे में कुछ स्पष्ट करना चाहता हूं जो मेरे लिए बहुत उलझन की बात थी। इन दोनों कथनों में अंतर है:

moment.tz(date, format, timezone)

moment(date, format).tz(timezone)

यह मानते हुए कि इसमें पारित की गई तारीख में एक समयक्षेत्र निर्दिष्ट नहीं है:

पहला कोड तारीख में लगता है और मान लिया जाता है कि समय बीत चुका है। दूसरा व्यक्ति तारीख लेगा, ब्राउज़र से टाइमज़ोन को मान लेगा और फिर टाइमज़ोन के अनुसार समय और समयक्षेत्र बदल देगा।

उदाहरण:

moment.tz('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss', 'UTC').format() // "2018-07-17T19:00:00Z"

moment('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss').tz('UTC').format() // "2018-07-18T00:00:00Z"

Utc से मेरा टाइमजोन +5 है। तो पहले मामले में यह नहीं बदलता है और यह तारीख और समय सेट करने के लिए utc timezone है।

दूसरे मामले में, यह मानती है कि यह तारीख -5 में है, फिर इसे UTC में बदल देता है, और इसीलिए यह "2018-07-18T00: 00: 00Z" तारीख निकलता है

नोट: प्रारूप पैरामीटर वास्तव में महत्वपूर्ण है। यदि छोड़े गए क्षण वापस दिनांक वर्ग में आ सकते हैं जो अप्रत्याशित व्यवहार कर सकते हैं


टाइमजोन मान लिया गया है कि इसमें दी गई तारीख को निर्दिष्ट किया गया है:

इस मामले में वे दोनों समान व्यवहार करते हैं


भले ही अब मुझे समझ में आया कि यह उस तरह से क्यों काम करता है, मैंने सोचा कि यह एक बहुत भ्रमित करने वाली विशेषता थी और समझाने लायक थी।


1
क्षण (...)। tz एक फ़ंक्शन नहीं है
K - SO में विषाक्तता बढ़ रही है।

5
क्या आपने क्षण-समय-क्षेत्र स्थापित किया?
निकोला पेड्रेती

वहाँ स्वरूपित और परिवर्तित क्षण को स्वरूपण के बिना वापस लाने का एक तरीका है? उदाहरण के लिए, अगर मैं इसे फिर से पार्स किए बिना विभिन्न तरीकों को प्रारूपित करना चाहता हूं।
jEremyB

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

20

.zone () पदावनत कर दिया गया है, और आपको इसके बजाय utcOffset का उपयोग करना चाहिए:

// for a timezone that is +7 UTC hours
moment(1369266934311).utcOffset(420).format('YYYY-MM-DD HH:mm')

8

मैं Moment.js के साथ एक ही मुद्दा रहा था। मैंने क्षण-समय क्षेत्र स्थापित किया है, लेकिन समस्या हल नहीं हुई। फिर, मैंने वही किया जो यहाँ उजागर हुआ है, टाइमज़ोन सेट करें और यह एक आकर्षण की तरह काम करता है:

moment(new Date({your_date})).zone("+08:00")

आपका बहुत बहुत धन्यवाद!


16
आपको new Date()कंस्ट्रक्टर का उपयोग नहीं करना चाहिए । क्षण आपको वह सब कुछ प्रदान करता है, जिसकी आपको कभी तिथियों को पार्स करने की आवश्यकता होती है। पार्सिंग डॉक्स देखें ।
शांतिकाल

हां, लेकिन अगर मैं ऐसा नहीं करता हूं, तो मुझे मोमेंट से एक चेतावनी मिल रही है, कि यह कुछ इस तरह से हटा दिया गया है
facundofarias

7
चेतावनी का अर्थ है कि मोमेंट आंतरिक रूप से ठीक उसी तरह वापस गिर रहा है जैसा आप कर रहे हैं ( new Date()आंतरिक रूप से उपयोग कर रहे हैं ), लेकिन यह पूरे ब्राउज़र में असंगत है । इसके बजाय, आपको दूसरे तर्क के रूप में अपेक्षित प्रारूप प्रदान करना चाहिए। उदाहरण: moment("12-25-1995", "MM-DD-YYYY")
शांतिकाल

4

बस यह एकरोस आया, और चूंकि मेरे पास एक ही मुद्दा था, इसलिए मैं केवल उन परिणामों को पोस्ट करूंगा जिनके साथ मैं आया था

पार्स करते समय, आप ऑफसेट को अपडेट कर सकते हैं (यानी मैं एक डेटा (1.1.2014) पार्स कर रहा हूं और मैं केवल तारीख चाहता हूं, 1 जनवरी 2014। GMT + 1 पर मुझे 31.12.2013 मिलेगा। तो मैं पहले मूल्य ऑफसेट करता हूं।

moment(moment.utc('1.1.2014').format());

खैर, मेरे लिए टाइमज़ोन का समर्थन करने के लिए काम आया

बी


-7

आप यह कोशिश कर सकते हैं,

यहां आप क्लाइंट टाइमज़ोन (ब्राउज़र) के आधार पर तारीख प्राप्त कर सकते हैं।

moment(new Date().getTime()).zone(new Date().toString().match(/([-\+][0-9]+)\s/)[1]).format('YYYY-MM-DD HH:mm:ss')

रेगेक्स मूल रूप से आपको ऑफसेट मूल्य प्राप्त करता है।

चीयर्स !!


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