2009-09-28 13 views
63

की वजह से तिथि का समय बदलता है जावास्क्रिप्ट में मेरी तिथि ऑब्जेक्ट्स हमेशा यूटीसी +2 द्वारा प्रतिनिधित्व की जाती है क्योंकि मैं कहां स्थित हूं। इसलिए इस तरहJSON स्ट्रिंगिफ़ाई यूटीसी

Mon Sep 28 10:00:00 UTC+0200 2009 

समस्या एक JSON.stringify कर रही है

2009-09-28T08:00:00Z (notice 2 hours missing i.e. 8 instead of 10) 

क्या मैं जरूरत दिनांक और समय के लिए सम्मानित किया जा रहा है लेकिन ऐसा नहीं है, इसलिए यह होना चाहिए करने के लिए ऊपर दिए गए तिथि धर्मान्तरित

var jsonData = JSON.stringify(jsonObject); 
:
2009-09-28T10:00:00Z (this is how it should be) 

मूल रूप से मैं इस का उपयोग 210

मैंने एक replacer पैरामीटर (स्ट्रिंग पर दूसरा पैरामीटर) पारित करने का प्रयास किया लेकिन समस्या यह है कि मान पहले ही संसाधित हो चुका है।

मैं भी तारीख वस्तु पर toString() और toUTCString() उपयोग करने की कोशिश, लेकिन इन मुझे देना नहीं है जो मैं चाहता तो ..

किसी को भी मेरी मदद कर सकते हैं?

+12

'2009-09-28T10: 00: 00Z' * समय में उसी क्षण का प्रतिनिधित्व नहीं करता है * सोमवार 28 सितंबर 10:00:00 यूटीसी + 0200 200 9 'के रूप में। एक [आईएसओ 8601] में 'जेड' (http://en.wikipedia.org/wiki/ISO_8601) दिनांक यूटीसी का मतलब है, और यूटीसी में 10 बजे * समय में एक अलग पल * 10 बजे तक है 0200। तारीख को सही समय क्षेत्र के साथ क्रमबद्ध करने की तारीख बनाना एक बात होगी, लेकिन आप हमें ऐसे प्रतिनिधित्व के लिए क्रमबद्ध करने में मदद करने के लिए कह रहे हैं जो निष्पक्ष रूप से, निष्पक्ष * गलत * है। –

+0

मार्क्स टिप्पणी में जोड़ने के लिए, ज्यादातर मामलों में यूटीसी समय के रूप में अपने डेटाटाइम को स्टोर करना सबसे अच्छा अभ्यास है, इसलिए आप अलग-अलग समय क्षेत्र – JoeCodeFrog

उत्तर

47

हाल ही में मैंने एक ही समस्या में भाग लिया है। और यह निम्नलिखित कोड का उपयोग कर हल किया गया था:

x = new Date(); 
x.setHours(x.getHours() - x.getTimezoneOffset()/60); 
+0

हां में उपयोगकर्ताओं का समर्थन कर सकते हैं, लेकिन यह है कि अगर मेरे देश में वेबसाइट का उपयोग किया जाता है, तो इसका इस्तेमाल दूसरे देश में किया जाता है संयुक्त राज्य अमेरिका की तरह - यह 2 नहीं होगा ... –

+0

जाहिर है, इस मूल्य की गणना की जानी चाहिए। – Anatoliy

+2

धन्यवाद ... मुझे वास्तव में यहां एक महान लाइब्रेरी मिली, http://blog.stevenlevithan.com/archives/date-time-format आपको यह करने की ज़रूरत है (शायद यह आपकी मदद करेगा), आप झूठी पास करते हैं और यह परिवर्तित नहीं होता है। var something = dateFormat (myStartDate, "isoDateTime", false); –

2

आमतौर पर आप चाहते हैं दिनांकों अपने ही स्थानीय समय

है यही कारण है कि हम जीएमटी (यूटीसी) का उपयोग में प्रत्येक उपयोगकर्ता के लिए प्रस्तुत किया जाना है।

उपयोग Date.parse (jsondatestring) स्थानीय समय स्ट्रिंग,

पाने के लिए जब तक आप आपके स्थानीय समय प्रत्येक आगंतुक को दिखाया चाहते हैं।

उस स्थिति में, अनातोली की विधि का उपयोग करें।

28

JSON Date.prototype.toISOString समारोह जो स्थानीय समय का प्रतिनिधित्व नहीं करता उपयोग करता है - यह असंशोधित UTC में समय का प्रतिनिधित्व करता है - अगर आप अपनी तिथि उत्पादन को देखो आप देख सकते हैं आप UTC + 2 घंटे में कर रहे हैं, यही वजह है कि JSON स्ट्रिंग है दो घंटों में बदलता है, लेकिन अगर यह एक ही समय को एकाधिक समय क्षेत्रों में सही ढंग से प्रदर्शित करने की अनुमति देता है।

+0

इस बारे में कभी सोचा नहीं, लेकिन आप सही हैं। यह समाधान है: मैं प्रोटोटाइप का उपयोग कर किसी भी प्रारूप को प्राथमिकता दे सकता हूं। – racs

9

बस रिकॉर्ड के लिए, याद रखें कि "2009-09-28T08: 00: 00Z" में अंतिम "ज़ेड" का अर्थ है कि समय वास्तव में यूटीसी में है।

विवरण के लिए http://en.wikipedia.org/wiki/ISO_8601 देखें।

+0

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/18 9 0 9 8383) – WebDevBooster

0

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

एक PostgreSQL बैकएंड आधारित उदाहरण:

select '2009-09-28T08:00:00Z'::timestamp -> '2009-09-28 08:00:00' (wrong for 10am) 
select '2009-09-28T08:00:00Z'::timestamptz -> '2009-09-28 10:00:00+02' 
select '2009-09-28T08:00:00Z'::timestamptz::timestamp -> '2009-09-28 10:00:00' 

पिछले एक संभव है कि आप, डेटाबेस में उपयोग करना चाहते हैं आप ठीक ढंग से समय क्षेत्र तर्क को लागू तैयार नहीं हैं है।

5

यहाँ एक और जवाब है (और व्यक्तिगत रूप से मुझे लगता है कि इसे और अधिक उपयुक्त है)

var currentDate = new Date(); 
currentDate = JSON.stringify(currentDate); 

// Now currentDate is in a different format... oh gosh what do we do... 

currentDate = new Date(JSON.parse(currentDate)); 

// Now currentDate is back to its original form :) 
+0

@ रोहन धन्यवाद कि यह इंगित करने के लिए धन्यवाद लेकिन प्रश्न पर टैग जावास्क्रिप्ट का उल्लेख करते हैं। – aug

+0

धन्यवाद! मेरे लिये कार्य करता है। –

0

के बजाय toJSON, आप format समारोह जो हमेशा सही दिनांक और समय + GMT

इससे उपयोग कर सकते हैं सबसे मजबूत प्रदर्शन विकल्प है। यह टोकन की एक स्ट्रिंग लेता है और उन्हें उनके संबंधित मानों के साथ बदल देता है।

0

date.toJSON() यूटीसी-डेट को एक स्ट्रिंग स्वरूपित में प्रिंट करता है (इसलिए इसे जेएसओएन प्रारूप में परिवर्तित करते समय ऑफसेट जोड़ता है)।

date = new Date(); 
new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toJSON(); 
+3

आमतौर पर यह आपके विचारों के बारे में स्पष्टीकरण जोड़ना एक अच्छा विचार है। यह नए डेवलपर्स को समझने की अनुमति देता है कि कोड कैसे काम करता है। –

+0

क्या आप समझा सकते हैं कि उत्तर में कोड क्यों काम करना चाहिए? – Cristik

+0

यह मेरे लिए काम करता है लेकिन मुझे समझ में नहीं आता है –

2

मैं एक छोटे से देर हो रही है लेकिन आप हमेशा का उपयोग कर प्रोटोटाइप इसलिए की तरह एक तिथि के मामले में toJson समारोह के ऊपर लिख सकते हैं:

Date.prototype.toJSON = function(){ 
    return Util.getDateTimeString(this); 
}; 

मेरे मामले में, Util.getDateTimeString (यह) एक वापसी इस तरह की स्ट्रिंग: "2017-01-19T00: 00: 00Z"

0

moment.js लाइब्रेरी (गैर-टाइमज़ोन संस्करण) का उपयोग करके इस समस्या के आसपास मिला।

var newMinDate = moment(datePicker.selectedDates[0]); 
var newMaxDate = moment(datePicker.selectedDates[1]); 

// Define the data to ask the server for 
var dataToGet = {"ArduinoDeviceIdentifier":"Temperatures", 
       "StartDate":newMinDate.format('YYYY-MM-DD HH:mm'), 
       "EndDate":newMaxDate.format('YYYY-MM-DD HH:mm') 
}; 

alert(JSON.stringify(dataToGet)); 

मैं flatpickr.min.js लाइब्रेरी का उपयोग कर रहा था। परिणामस्वरूप जेएसओएन ऑब्जेक्ट का समय प्रदान किए गए स्थानीय समय से मेल खाता है लेकिन तारीख पिकर।