2012-05-31 19 views
58

ऑफसेट मैं 2 दिनों के लिए अब एक स्थानीय इसो-स्ट्रिंग (prettyDate के लिए) के लिए ट्विटर दिनांक परिवर्तित करने के लिए कोशिश कर रहा हूँ। मैं सिर्फ स्थानीय समय सही नहीं मिल रहा है ..जावास्क्रिप्ट toISOString() पर ध्यान नहीं देता समय क्षेत्र

im निम्नलिखित फ़ंक्शन का उपयोग:

function getLocalISOTime(twDate) { 
    var d = new Date(twDate); 
    var utcd = Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), 
     d.getMinutes(), d.getSeconds(), d.getMilliseconds()); 

    // obtain local UTC offset and convert to msec 
    localOffset = d.getTimezoneOffset() * 60000; 
    var newdate = new Date(utcd + localOffset); 
    return newdate.toISOString().replace(".000", ""); 
} 

newdate हर चीज में ठीक है लेकिन toISOString() इसे वापस मूल समय के लिए फिर से फेंकता है ... क्या कोई मुझे Twitterdate से आईएसओ में स्थानीय समय प्राप्त करने में मदद कर सकता है: थू, 31 मई 2012 08:33:41 +0000

+2

प्रारूप आप अंत में वर्णन है [आईएसओ -8601 ई] नहीं है (http://dotat.at/tmp/ISO_8601-2004_E.pdf) प्रारूप (यह भी देखें [Date.toISOString] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toISOString)। आप जिस प्रारूप को आसानी से चाहते हैं उसे प्राप्त कर सकते हैं; यह 'dateObj.toString()' के साथ आपको जो मिलता है उससे बहुत करीब है। इसके साथ खेलने का प्रयास करें। – Zirak

+0

धन्यवाद! इसके साथ समाप्त हुआ: var d = नई तिथि (twDate); नई तारीख लौटें (d.toISOString()। प्रतिस्थापित करें ("Z", "-02: 00"))। toISO स्ट्रिंग()। प्रतिस्थापित करें ("000", ""); सबसे सुंदर समाधान नहीं है लेकिन मेरे टाइमज़ोन के लिए काम करता है। की –

+0

संभव डुप्लिकेट [वहाँ किसी भी तरह से जावास्क्रिप्ट सबस्ट्रिंग कार्य या रेगुलर एक्सप्रेशन का उपयोग किए बिना इस स्ट्रिंग तारीख प्रतिनिधित्व (समय-क्षेत्र के साथ) के उत्पादन के लिए है?] (http://stackoverflow.com/questions/14992051/is-there-any-way करने वाली उपज-इस स्ट्रिंग की तारीख-प्रतिनिधित्व-साथ समय-क्षेत्र-बुद्धि) – Bergi

उत्तर

117

moment.js महान है लेकिन कभी कभी आप साधारण बातों के लिए निर्भरता की एक बड़ी संख्या को खींचने के लिए नहीं करना चाहती।

निम्नलिखित काम करता है और साथ ही:

var tzoffset = (new Date()).getTimezoneOffset() * 60000; //offset in milliseconds 
var localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, -1); 
// => '2015-01-26T06:40:36.181' 

slice(0, -1) अनुगामी Z जो ज़ुलु समय क्षेत्र का प्रतिनिधित्व करता है और अपने खुद के द्वारा प्रतिस्थापित किया जा सकता से छुटकारा मिलता है।

+4

छोटा और सरल - शानदार! इसे और भी मानव पठनीय बनाने के लिए मैंने .toISOString() स्लाइस (0, -5)। जगह ("टी", ""); आपके समाधान के अंत में। – DerWOK

+2

टाइम्स को यूटीसी (कोऑर्डिनेटेड यूनिवर्सल टाइम) में व्यक्त किया जाता है, जिसमें एक विशेष यूटीसी डिज़ाइनर ("जेड") होता है। –

+1

उत्कृष्ट, धन्यवाद। यहां एक ऐसा कार्य है जो एक वैकल्पिक दिनांक पैरामीटर लेता है: फ़ंक्शन लोकलॉइसटाइम (डी) { यदि (! डी) डी = नई तिथि() var tzoffset = d.getTimezoneOffset() * 60000; // मिलीसेकंड में ऑफसेट वापसी (नई तिथि (दिनांक .now() - tzoffset))। toISOString()। टुकड़ा (0, -1); } – Nico

6

moment.js एफटीडब्ल्यू !!!

बस एक क्षण के लिए अपनी तिथि बदलने और लेकिन यह हेरफेर आप कृपया:

var d = new Date(twDate); 
var m = moment(d).format(); 
console.log(m); 

http://momentjs.com/docs/

+0

एक उचित जवाब नहीं है यही कारण है कि ...क्या आप Moment.js का उपयोग कर सही जवाब दे सकते हैं? यदि यह एक वास्तविक उत्तर है, तो मैं हर बार जवाब दे सकता हूं "x86 FTW !!! https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures- सॉफ्टवेयर डेवलपर के अनुदेश सेट-संदर्भ-मैनुअल-325383.pdf "और कहते हैं कि अच्छी किस्मत ... – DestyNova

+0

[* जब है" एक जावास्क्रिप्ट प्रश्न के jQuery "एक मान्य जवाब का उपयोग *?] (https: // मेटा। stackoverflow.com/questions/335328/when-is-use-jquery-not-a-valid-answer-to-a-javascript-question) – RobG

5

इस तिथि समारोह नीचे एक अतिरिक्त स्क्रिप्ट पुस्तकालय के बिना वांछित प्रभाव को प्राप्त होता है। असल में यह सही प्रारूप में बस एक साधारण तिथि घटक सम्मेलन है, और तिथि ऑब्जेक्ट के प्रोटोटाइप को बढ़ाने।

Date.prototype.dateToISO8601String = function() { 
    var padDigits = function padDigits(number, digits) { 
     return Array(Math.max(digits - String(number).length + 1, 0)).join(0) + number; 
    } 
    var offsetMinutes = this.getTimezoneOffset(); 
    var offsetHours = offsetMinutes/60; 
    var offset= "Z";  
    if (offsetHours < 0) 
     offset = "-" + padDigits(offsetHours.replace("-","") + "00",4); 
    else if (offsetHours > 0) 
     offset = "+" + padDigits(offsetHours + "00", 4); 

    return this.getFullYear() 
      + "-" + padDigits((this.getUTCMonth()+1),2) 
      + "-" + padDigits(this.getUTCDate(),2) 
      + "T" 
      + padDigits(this.getUTCHours(),2) 
      + ":" + padDigits(this.getUTCMinutes(),2) 
      + ":" + padDigits(this.getUTCSeconds(),2) 
      + "." + padDigits(this.getUTCMilliseconds(),2) 
      + offset; 

} 

Date.dateFromISO8601 = function(isoDateString) { 
     var parts = isoDateString.match(/\d+/g); 
     var isoTime = Date.UTC(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]); 
     var isoDate = new Date(isoTime); 
     return isoDate;  
} 

function test() { 
    var dIn = new Date(); 
    var isoDateString = dIn.dateToISO8601String(); 
    var dOut = Date.dateFromISO8601(isoDateString); 
    var dInStr = dIn.toUTCString(); 
    var dOutStr = dOut.toUTCString(); 
    console.log("Dates are equal: " + (dInStr == dOutStr)); 
} 

उपयोग:

var d = new Date(); 
console.log(d.dateToISO8601String()); 

उम्मीद है कि इस किसी और मदद करता है।

संपादित

सही dateFromISO8601 समारोह के लिए यूटीसी मुद्दा टिप्पणी में उल्लेख किया है, और Alex को ऋण।

+0

यह मेरे मदद की है और मुझे लगता है कि यह एक बेहतर जवाब है। – Jonathan

+1

जबकि आपको सही स्थानीय समय मिल रहा है, आप समय-समय पर "Z" जोड़कर ज़ुलू समय के साथ गलत तरीके से संबद्ध हैं। यदि आप इस से बनाए गए समय को लेते हैं और इसे किसी भी आईएसओ अनुरूप आवेदन में डालते हैं, तो आपको बदले में सही समय नहीं मिलेगा। आपको '.getTimezoneOffset()' को कॉल करना चाहिए और फिर अपनी आईएसओ तिथि अनुरूप होने के लिए मिनटों की गणना एक घंटे के प्रारूप में करें। –

+0

गलत है और काम नहीं करता मैं डर –

26

पल का उपयोग किए बिना मेरे समाधान एक टाइमस्टैम्प करने के लिए यह तो कन्वर्ट करने के लिए, समय क्षेत्र ऑफसेट जोड़ने के लिए, एक तारीख वस्तु को वापस परिवर्तित, और फिर toISOString चलाने()

var date = new Date(); // Or the date you'd like converted. 
isoDate = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString(); 
+1

जोड़ना चाहिए, मुझे यह दृष्टिकोण पसंद है। उदाहरण के रूप में आप काम नहीं करते हैं क्योंकि आपने तिथि निर्धारित नहीं की है। यदि आप var date = new date() को प्रीपेड करते हैं; आपके उदाहरण के लिए, यह काम करता है। – Brady