2012-08-04 14 views
10

मैं एक तारीख स्ट्रिंग की तरह स्वरूपित के साथ एक JSON फ़ीड हो रही है निम्नलिखित:मैं इस दिनांक स्ट्रिंग को कैसे प्रारूपित करूं ताकि Google स्क्रिप्ट इसे पहचान सकें?

// 2012-08-03T23: 00: 26-05: 00

मैंने सोचा था मैं बस में इस गुजारें सकता एक नई तिथि जैसे

var dt = new Date("2012-08-03T23:00:26-05:00"); 

यह jsfiddle पर काम करता है लेकिन Google स्क्रिप्ट में नहीं। यह एक अवैध तारीख लौट रहा है। this post पढ़ने के बाद मुझे पता है कि यह कैसे हो सकता है कि जीएएस डेट स्ट्रिंग का अर्थ कैसे लेता है, इसलिए अब मुझे यकीन नहीं है कि इसे काम करने के लिए तारीख को दोबारा कैसे सुधारें।

क्या उस तारीख स्ट्रिंग को दोबारा सुधारने का सबसे अच्छा तरीका है ताकि जीएएस इसे एक तारीख के रूप में पहचान सके?

उत्तर

18

Google Apps स्क्रिप्ट जावास्क्रिप्ट (ECMA-262 3rd Edition) का एक विशेष संस्करण उपयोग करता है और जैसा कि आपने पाया है आईएसओ 8601 प्रारूप में दिनांक/समय का विश्लेषण नहीं कर सकता है। नीचे एक संशोधित समारोह मैं अपने Apps स्क्रिप्ट की एक संख्या में उपयोग किया जाता है

var dt = new Date(getDateFromIso("2012-08-03T23:00:26-05:00")); 

// http://delete.me.uk/2005/03/iso8601.html 
function getDateFromIso(string) { 
    try{ 
    var aDate = new Date(); 
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" + 
     "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\\.([0-9]+))?)?" + 
     "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?"; 
    var d = string.match(new RegExp(regexp)); 

    var offset = 0; 
    var date = new Date(d[1], 0, 1); 

    if (d[3]) { date.setMonth(d[3] - 1); } 
    if (d[5]) { date.setDate(d[5]); } 
    if (d[7]) { date.setHours(d[7]); } 
    if (d[8]) { date.setMinutes(d[8]); } 
    if (d[10]) { date.setSeconds(d[10]); } 
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); } 
    if (d[14]) { 
     offset = (Number(d[16]) * 60) + Number(d[17]); 
     offset *= ((d[15] == '-') ? 1 : -1); 
    } 

    offset -= date.getTimezoneOffset(); 
    time = (Number(date) + (offset * 60 * 1000)); 
    return aDate.setTime(Number(time)); 
    } catch(e){ 
    return; 
    } 
} 
+0

हाय। "ईसीएमए -262 तीसरा संस्करण" का लिंक टूटा हुआ है। क्या आप किसी भी स्थान को जानते हैं जहां Google "दिनांक" ऑब्जेक्ट को दस्तावेज किया गया है (उदा। कन्स्ट्रक्टर, विधियां इत्यादि)? धन्यवाद। – Kalin

+1

[ईसीएमए -262 भाषा विशिष्टता पृष्ठ] (http://www.ecma-international.org/publications/standards/Ecma-262.htm) <-HTML और पीडीएफ संस्करणों के लिए लिंक। [एचटीएमएल दस्तावेज़ीकरण में दिनांक ऑब्जेक्ट्स अनुभाग डायरेक्ट लिंक] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.9) –

+0

आपके regexp STRING की लाइन 2 पर, आपको डॉट से पहले दो बैकस्लैश की आवश्यकता है , इस तरह: \\। \। एक वैध बचने वाला चरित्र नहीं है, और यदि आप STRING में बैकस्लैश चाहते हैं, तो आपको इसे से बचने की आवश्यकता है। अब, यदि आप regex/और/के बीच था, तो आपको बैकस्लैश से बचने की आवश्यकता नहीं होगी –

1

प्रारूप को पहले से ज्ञात करने के लिए कठिन और निश्चित शॉट तरीका इसे पहले पार्स करना है।

var dtString = "2012-08-03T23:00:26-05:00"; 
var date = dtString.split('T')[0]; 
var time = dtString.split('T')[1].split('-')[0]; 
var tz = dtString.split('T')[1].split('-')[1]; 
var dt = new Date(date.split('-')[0] , date.split('-')[1] - 1, // month is special 
        date.split('-')[2], time.split(':')[0], 
        time.split(':')[1], time.split(':')[2] , 0); 

मैंने कोड के इस सटीक टुकड़े का परीक्षण नहीं किया है, लेकिन समान कोड का उपयोग किया है। इसलिए, यह आपको आगे बढ़ने का एक उचित विचार देता है।

+0

@Srik ... सही काम किया। आपकी सहायता के लिए धन्यवाद. कोई विचार क्यों Google स्क्रिप्ट उस दिनांक स्ट्रिंग को पहचान नहीं पाती है? – jrad

+0

केवल समय क्षेत्र के लिए काम करता है जीएमटी-एक्सएक्स: एक्सएक्स, जीएमटी/यूटीसी से आगे के समय क्षेत्र के बारे में क्या? – kksensei

7

मिले इस अन्य संभावित और बहुत ही सरल कोड लगता है कि यह भी काम करने के लिए:

function test(){ 
    Logger.log(isoToDate("2013-06-15T14:25:58Z")); 
    Logger.log(isoToDate("2012-08-03T23:00:26-05:00")); 
    Logger.log(isoToDate("2012-08-03T23:00:26+05:00")); 
} 

function isoToDate(dateStr){// argument = date string iso format 
    var str = dateStr.replace(/-/,'/').replace(/-/,'/').replace(/T/,' ').replace(/\+/,' \+').replace(/Z/,' +00'); 
    return new Date(str); 
} 
+1

यह "2016-07-12T16: 30: 00.000 + 0200" के लिए काम नहीं करता है, mhawskeys उत्तर अधिक विश्वसनीय – Paul

1

यह मेरे लिए काम किया, जब Google स्क्रिप्ट में डेट-ऑब्जेक्ट को डेट-ऑब्जेक्ट को कनवर्ट करना।

दिनांक-स्ट्रिंग को Google शीट सेल से GetValue s() विधि द्वारा लिया गया था।

से: 01.01.2017 22:43:34 से: 2017/01/01 22:43:34 ने काम किया। और फिर new Date()

var dateTimeObj = new Date(stringDate.replace(/^(\d{1,2})[-.](\d{1,2})[-.](\d{4})/g,"$3/$2/$1")); 
+0

** नोट: * * Google शीट समय क्षेत्र और Google स्क्रिप्ट समय क्षेत्र बराबर हैं। – NikitOn

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

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