2015-10-01 15 views
8

मुझे टाइम ऑफसेट से निपटने के लिए moment.js का उपयोग करने का प्रयास करने में कुछ समस्या का सामना करना पड़ रहा है। (मेरे मामले अपने मूल्य -240 है में)पल के साथ समय ऑफसेट अपडेट करना()। UtcOffset()

<script type="text/javascript"> 
    $(document).ready(function() { 
    $('input#timeoffset').val(moment().utcOffset()); 
    }); 
</script> 

ऑफसेट सही ढंग से संग्रहीत हो जाता है:

मैं एक छिपे हुए इनपुट में स्थानीय उपयोगकर्ता समय ऑफसेट इकट्ठा। बाद में सर्वर साइड (जो UTC समय में चलता है) मैं कुछ db संगृहीत utcDate की तरह कुछ कर रही अपडेट करने का प्रयास पर:

var userDate = moment(utcDate).utcOffset(offset) 

मेरे मुद्दा है निम्नलिखित: अगर मैं अपने कोड चलाने जैसा कि ऊपर वर्णित मैं कोई प्रभाव प्राप्त :

  • utcDate: 20151001 012421 +0000
  • userDate: 20151001 012421 +0000

अगर मैं ऑफसेट हस्ताक्षर फ्लिप मैं:

  • utcDate: 20151001 012421 +0000
  • userDate: 20151001 052421 +0400

मैं स्पष्ट रूप से कुछ गलत है (भले ही मेरी उम्मीद है कि पहले संस्करण सही था) कर रहा हूँ, आप किसी भी संकेत है?

क्लाइंट साइड मैं moment.js v2.10.6 उपयोग कर रहा हूँ पर, जबकि सर्वर साइड पल-timezone.js v0.4.0 और moment.js v2.10.6 पर

+0

और ऑफ़सेट लागू करने के बाद आप 'userDate' के साथ क्या करते हैं? आप शायद 'toDate',' valueOf', 'unix', या अन्य विधियों को कॉल कर रहे हैं जो वॉल-टाइम के बजाए तत्काल प्रतिबिंबित करते हैं। –

+0

इसके अलावा, "समय क्षेत्र! = ऑफ़सेट" याद रखें।यदि आप उपयोगकर्ता के * वर्तमान * ऑफसेट को स्टोर करते हैं और बाद में इसे समय-समय पर मनमाने ढंग से लागू करते हैं, तो उस समय के लिए यह गलत ऑफसेट भी हो सकता है। टाइम जोन डेलाइट सेविंग टाइम के लिए ऑफसेट्स और अन्य विभिन्न कारणों से बदल सकते हैं। –

+0

@MattJohnson वास्तव में मैं सिर्फ '.format (...)' परिणामों को मुद्रित करने के लिए। मेरे द्वारा उपर्युक्त परिणामों को मुद्रित किया गया है: 'console.log ('utcDate:' + moment (utcDate) .format ('YYYYMMDD HHmmss ZZ')); console.log ('userDate:' + पल (utcDate) .utc ऑफसेट (ऑफ़सेट) .format ('YYYYMMDD HHmmss ZZ')); '। 'UtcDate' ऑफसेट के बिना है। – Pierluigi

उत्तर

10

मुख्य मुद्दा यह है कि आप कर रहे हैं ऑफ़सेट को एक संख्या के बजाय स्ट्रिंग के रूप में पास करना।

moment.utc("2015-10-01 01:24:21").utcOffset("-240").format('YYYYMMDD HHmmss ZZ') 
// "20151001 012421 +0000" 

moment.utc("2015-10-01 01:24:21").utcOffset(-240).format('YYYYMMDD HHmmss ZZ') 
// "20150930 212421 -0400" 

जब आपके पास मिनटों के मामले में ऑफसेट होता है, तो आपको संख्यात्मक रूप का उपयोग करना होगा। आप हमेशा यह परिवर्तित कर सकते हैं:

moment.utc("2015-10-01 01:24:21").utcOffset(+"-240").format('YYYYMMDD HHmmss ZZ') 
// "20150930 212421 -0400" 

पल ऑफसेट तारों के रूप में प्रदान किया जाने वाला की अनुमति मिल जाएगी, लेकिन यह उम्मीद उन्हें ISO8601 स्वरूपों में से एक में होना: या तो [+/-]HH:mm या [+/-]HHmm

moment.utc("2015-10-01 01:24:21").utcOffset("-04:00").format('YYYYMMDD HHmmss ZZ') 
// "20150930 212421 -0400" 
इसके अतिरिक्त

, टिप्पणी है कि मैं moment.utc(...) प्रयुक्त इनपुट स्ट्रिंग पार्स करने में। आपने अभी moment(...) का उपयोग किया है जो स्थानीय समय क्षेत्र का उपयोग करेगा जब तक कि समय क्षेत्र स्पष्ट न हो या यदि आप स्ट्रिंग के बजाय Date ऑब्जेक्ट पास करते हैं। यह moment ऑब्जेक्ट को "स्थानीय मोड" में भी छोड़ देगा, इसलिए आपका utcDate आउटपुट गलत होगा जब तक कि मशीन का समय क्षेत्र वास्तव में यूटीसी पर सेट न हो जाए।

आखिरकार, "समय क्षेत्र! = ऑफसेट" को न भूलें। आप यह नहीं मान सकते कि आपके द्वारा प्राप्त ऑफ़सेट सभी तिथियों के लिए मान्य है। यदि आपको उपयोगकर्ता के समय क्षेत्र की तारीख प्रोजेक्ट करने की आवश्यकता है, तो आपको वास्तव में समय क्षेत्र, जैसे कि America/New_York पता होना चाहिए। आप इन्हें पल-टाइमज़ोन प्लगइन के साथ उपयोग कर सकते हैं।

+0

मैंने अभी यह पता लगाया है कि यह वास्तव में मेरी गलती है, मैंने 'parseInt' नहीं किया था और मैं इस तथ्य से उलझन में था कि यह एक दिशा में काम करता था, न कि दूसरे में' ऑफसेट 'एक स्ट्रिंग था! धन्यवाद! – Pierluigi

संबंधित मुद्दे