मैं जावास्क्रिप्ट में आईएसओ 8601 स्वरूपित स्ट्रिंग का उत्पादन कैसे करूं?


247

मेरे पास एक Dateवस्तु है। मैं titleनिम्नलिखित स्निपेट के हिस्से को कैसे प्रस्तुत करूं ?

<abbr title="2010-04-02T14:12:07">A couple days ago</abbr>

मेरे पास दूसरे पुस्तकालय से "शब्दों में सापेक्ष समय" भाग है।

मैंने निम्नलिखित कोशिश की है:

function isoDate(msSinceEpoch) {

   var d = new Date(msSinceEpoch);
   return d.getUTCFullYear() + '-' + (d.getUTCMonth() + 1) + '-' + d.getUTCDate() + 'T' +
          d.getUTCHours() + ':' + d.getUTCMinutes() + ':' + d.getUTCSeconds();

}

लेकिन यह मुझे देता है:

"2010-4-2T3:19"

जवाबों:


453

वहाँ पहले से ही एक समारोह कहा जाता है toISOString():

var date = new Date();
date.toISOString(); //"2011-12-19T15:28:46.493Z"

यदि, किसी तरह, आप उस ब्राउज़र पर हैं जो इसका समर्थन नहीं करता है, तो मैंने आपको कवर कर लिया है:

if ( !Date.prototype.toISOString ) {
  ( function() {

    function pad(number) {
      var r = String(number);
      if ( r.length === 1 ) {
        r = '0' + r;
      }
      return r;
    }

    Date.prototype.toISOString = function() {
      return this.getUTCFullYear()
        + '-' + pad( this.getUTCMonth() + 1 )
        + '-' + pad( this.getUTCDate() )
        + 'T' + pad( this.getUTCHours() )
        + ':' + pad( this.getUTCMinutes() )
        + ':' + pad( this.getUTCSeconds() )
        + '.' + String( (this.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 )
        + 'Z';
    };

  }() );
}

1
.toISOString () निश्चित रूप से UTC में दिनांक लौटाता है?
जॉन वेल्स

new Date("xx").toISOString()का उत्पादन NaN-NaN-NaNTNaN:NaN:NaN.NZदेशी कार्यान्वयन RangeException फेंकता है।
जोसेफ लेनॉक्स

यदि आप किसी साबुन सेवा को डेट ऑब्जेक्ट पास करना चाहते हैं ... तो यह तरीका है! :) धन्यवाद।
थिंकलिनक्स

1
ओपी द्वारा प्रदान किए गए नमूने में, कोई मिलीसेकंड या समय क्षेत्र नहीं हैं।
Dan Dascalescu

उन सभी फ़ंक्शन जैसे "getUTCFullYear" कॉल विफल हो रहे हैं क्योंकि वे IE दस्तावेज़ मोड 5 के लिए ज्ञात नहीं हैं
Elaskanator

63

पेज पर अंतिम उदाहरण देखें https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference:Global_Objects:Date :

/* Use a function for the exact format desired... */
function ISODateString(d) {
    function pad(n) {return n<10 ? '0'+n : n}
    return d.getUTCFullYear()+'-'
         + pad(d.getUTCMonth()+1)+'-'
         + pad(d.getUTCDate())+'T'
         + pad(d.getUTCHours())+':'
         + pad(d.getUTCMinutes())+':'
         + pad(d.getUTCSeconds())+'Z'
}

var d = new Date();
console.log(ISODateString(d)); // Prints something like 2009-09-28T19:03:12Z

1
ओपी द्वारा प्रदान किए गए नमूने <abbr title="2010-04-02T14:12:07">में कोई समयक्षेत्र नहीं है। शायद वे स्थानीय समय चाहते थे, जो यूआई टाइम स्ट्रिंग के लिए समझ में आएगा?
Dan Dascalescu

60

वेब पर लगभग हर आईएसओ विधि स्ट्रिंग को आउटपुट करने से पहले "Z" ulu समय (UTC) में कनवर्ट करके टाइमजोन जानकारी को गिरा देती है। ब्राउज़र का मूल .toISOString () भी टाइमज़ोन जानकारी को छोड़ देता है।

यह बहुमूल्य जानकारी को सर्वर, या प्राप्तकर्ता के रूप में, हमेशा एक पूर्ण आईएसओ दिनांक को ज़ुलु समय में परिवर्तित कर सकता है या समय-समय पर इसकी आवश्यकता हो सकती है, जबकि प्रेषक के समय-क्षेत्र की जानकारी अभी भी प्राप्त कर रहा है।

सबसे अच्छा समाधान जो मुझे आया है वह है मोमेंट.जेएस जावास्क्रिप्ट लाइब्रेरी का उपयोग करना और निम्नलिखित कोड का उपयोग करना:

समय क्षेत्र की जानकारी और मिलीसेकंड के साथ वर्तमान आईएसओ समय प्राप्त करने के लिए

now = moment().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
// "2013-03-08T20:11:11.234+0100"

now = moment().utc().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
// "2013-03-08T19:11:11.234+0000"

now = moment().utc().format("YYYY-MM-DDTHH:mm:ss") + "Z"
// "2013-03-08T19:11:11Z" <- better use the native .toISOString() 

एक देशी जावास्क्रिप्ट दिनांक वस्तु का आईएसओ समय प्राप्त करने के लिए समय क्षेत्र की जानकारी के साथ लेकिन मिलीसेकंड के बिना

var current_time = Date.now();
moment(current_time).format("YYYY-MM-DDTHH:mm:ssZZ")

इसे Date.js के साथ जोड़ा जा सकता है ताकि Date.today () जैसे फ़ंक्शंस प्राप्त किए जा सकें, जिनके परिणाम को पल में पास किया जा सकता है।

इस तरह तैयार की गई डेट स्ट्रिंग JSON कंपाइलेंट है, और डेटाबेस में संग्रहीत होने के लिए अच्छी तरह से उधार देती है। अजगर और सी # इसे पसंद करने लगते हैं।


21
तारीख लोगों के साथ चारों ओर सामान न करें। बस क्षण का उपयोग करें। अपने बालों को बचाएं।
वलमास

1
वास्तव में, अजगर और डीबी पर यह एक दर्द के रूप में निकला। db का यूटीसी (कोई संभावना नहीं है, जैसा कि आप आसानी से यूटीसी सर्वर-साइड में बदल सकते हैं), इसलिए यदि आप ऑफसेट जानकारी को रखना चाहते हैं, तो आपको दूसरे क्षेत्र की आवश्यकता है। और पाइथन, जावास्क्रिप्ट के मिलीसेकंड के बजाय नैनोसेकंड के उपयोग को प्राथमिकता देता है, जो आमतौर पर पर्याप्त और सादे सेकंड में बेहतर होते हैं। अजगर पर, केवल dateutil.parser.parse इसे सही ढंग से पार्स करता है, और मिलीसेकंड आईएसओ लिखने के लिए "_when = when.strftime ("% Y-% m-% dT% H:% M:% S.% f% z की आवश्यकता होती है "); वापसी _when [: - 8] + _when [-5:]" नैनो को मिलिस में बदलने के लिए। यह अच्छा नहीं है।
डैनियल एफ

3
आप वास्तव में सिर्फ इस तरह प्रारूप को छोड़ सकते हैं moment(new Date()).format():। "संस्करण 1.5.0 के रूप में, बिना किसी प्रारूप के # क्षण को कॉल करना डिफ़ॉल्ट होगा ... ISO8601 प्रारूप YYYY-MM-DDTHH:mm:ssZ"। Doc: क्षणों
docs/

1
अच्छा बिंदु @ user193130 लेकिन आपको वास्तव में केयरफुल होने की आवश्यकता है क्योंकि आउटपुट देशी विधि से अलग है। moment().format() "2015-03-04T17:16:05+03:00" (new Date()).toISOString() "2015-03-04T14:16:24.555Z"
ओल्गा

1
हो सकता है कि picky हो, लेकिन ये उदाहरण UTC से वर्तमान ऑफ़सेट लौटाते हैं, समय क्षेत्र नहीं। एक समय क्षेत्र एक भौगोलिक क्षेत्र है जिसे आमतौर पर "अमेरिका / टोरंटो" के रूप में व्यक्त किया जाता है। कई बार ज़ोन वर्ष में दो बार अपनी यूटीसी ऑफसेट बदलते हैं और वर्तमान यूटीसी ऑफसेट से समय क्षेत्र (हमेशा) निर्धारित नहीं किया जा सकता है ... इस प्रकार यह उत्तर समय क्षेत्र की जानकारी भी छोड़ रहा है :-)
मार्टिन फिदो

27

कम सटीकता के साथ पूछा गया आईएसओ प्रारूप था । देखा:

 new Date().toISOString().slice(0, 19) + 'Z'
 // '2014-10-23T13:18:06Z'

अनुगामी Z मान रहा है, अन्यथा केवल छोड़ देना चाहिए।


14

सबसे छोटा, लेकिन इंटरनेट एक्सप्लोरर 8 और उससे पहले के द्वारा समर्थित नहीं:

new Date().toJSON()

12

यदि आपको IE7 का समर्थन करने की आवश्यकता नहीं है, तो निम्नलिखित एक बढ़िया, संक्षिप्त हैक है:

JSON.parse(JSON.stringify(new Date()))

IE7 के लिए यह निर्णय भी फिट है अगर json3- लाइब्रेरी ( bestiejs.github.io/json3 ) को शामिल किया गया था । धन्यवाद :)
vladimir

IE8 में भी विफल रहता है। ("'JSON' अपरिभाषित है")
Cees टिमरमैन

1
JSON के माध्यम से राउंड-ट्रिपिंग बदसूरत है, खासकर यदि आपका घोषित लक्ष्य निर्णायक है; toJSONइसके बजाय दिनांक की विधि का उपयोग करें। JSON.stringifyवैसे भी कवर के तहत इसका उपयोग कर रहा है।
मार्क अमेरी

@CeesTimmerman IE8 JSONवस्तु का समर्थन करता है, हालांकि कुछ संगतता मोड में नहीं। देखें stackoverflow.com/questions/4715373/...
मार्क Amery

3
किस तरीके से यह बेहतर है .toISOString()?
मार्टिन

7

मैं आमतौर पर UTC तारीख प्रदर्शित नहीं करना चाहता क्योंकि ग्राहक उनके सिर में रूपांतरण करना पसंद नहीं करते हैं। स्थानीय ISO दिनांक प्रदर्शित करने के लिए , मैं फ़ंक्शन का उपयोग करता हूं:

function toLocalIsoString(date, includeSeconds) {
    function pad(n) { return n < 10 ? '0' + n : n }
    var localIsoString = date.getFullYear() + '-'
        + pad(date.getMonth() + 1) + '-'
        + pad(date.getDate()) + 'T'
        + pad(date.getHours()) + ':'
        + pad(date.getMinutes()) + ':'
        + pad(date.getSeconds());
    if(date.getTimezoneOffset() == 0) localIsoString += 'Z';
    return localIsoString;
};

समय क्षेत्र से ऊपर का कार्य सूचनाओं को ऑफसेट करता है (यदि स्थानीय समय UTC हो तो को छोड़कर), इसलिए मैं स्थानीय फ़ंक्शन को किसी एकल स्थान पर दिखाने के लिए नीचे दिए गए फ़ंक्शन का उपयोग करता हूं। यदि आप प्रत्येक बार में ऑफसेट दिखाना चाहते हैं, तो आप उपरोक्त फ़ंक्शन के परिणामों के लिए इसका आउटपुट भी जोड़ सकते हैं:

function getOffsetFromUTC() {
    var offset = new Date().getTimezoneOffset();
    return ((offset < 0 ? '+' : '-')
        + pad(Math.abs(offset / 60), 2)
        + ':'
        + pad(Math.abs(offset % 60), 2))
};

toLocalIsoStringका उपयोग करता है pad। यदि आवश्यक हो, तो यह लगभग किसी भी पैड फ़ंक्शन की तरह काम करता है, लेकिन पूर्णता के लिए यह वही है जो मैं उपयोग करता हूं:

// Pad a number to length using padChar
function pad(number, length, padChar) {
    if (typeof length === 'undefined') length = 2;
    if (typeof padChar === 'undefined') padChar = '0';
    var str = "" + number;
    while (str.length < length) {
        str = padChar + str;
    }
    return str;
}

3

'T' के बाद एक '+' गायब है

isoDate: function(msSinceEpoch) {
  var d = new Date(msSinceEpoch);
  return d.getUTCFullYear() + '-' + (d.getUTCMonth() + 1) + '-' + d.getUTCDate() + 'T'
         + d.getUTCHours() + ':' + d.getUTCMinutes() + ':' + d.getUTCSeconds();
}

करना चाहिए।

अग्रणी शून्य के लिए आप इसका उपयोग यहां से कर सकते हैं :

function PadDigits(n, totalDigits) 
{ 
    n = n.toString(); 
    var pd = ''; 
    if (totalDigits > n.length) 
    { 
        for (i=0; i < (totalDigits-n.length); i++) 
        { 
            pd += '0'; 
        } 
    } 
    return pd + n.toString(); 
} 

इसे इस तरह से उपयोग करना:

PadDigits(d.getUTCHours(),2)

शानदार कैच! हालांकि यह लापता "0" को संबोधित नहीं करता है।
जेम्स ए। रोसेन

1
पूर्णांक को 2-वर्ण स्ट्रिंग में परिवर्तित करने के लिए एक फ़ंक्शन लिखें (यदि तर्क 10 से कम है, तो '0' को प्रस्तुत करना), और इसे दिनांक / समय के प्रत्येक भाग के लिए कॉल करें।
dan04

3
function timeStr(d) { 
  return ''+
    d.getFullYear()+
    ('0'+(d.getMonth()+1)).slice(-2)+
    ('0'+d.getDate()).slice(-2)+
    ('0'+d.getHours()).slice(-2)+
    ('0'+d.getMinutes()).slice(-2)+
    ('0'+d.getSeconds()).slice(-2);
}

1
IE5 मोड में मुझे इस रूट पर जाना पड़ा क्योंकि यहाँ अन्य सभी उत्तरों में ऐसे फ़ंक्शंस का इस्तेमाल किया गया है जो मौजूद नहीं हैं।
एलस्कैन्टर

3

ToISOString के साथ समस्या यह है कि यह केवल "Z" के रूप में डेटाइम देता है।

ISO-8601 भी समय और समय में अंतर के साथ डेटाटाइम को परिभाषित करता है, जैसे 2016-07-16T19: 20: 30 + 5: 30 (जब यूजेड आगे UTC है) और 2016-07-16T19: 20: 30-01 : 00 (जब टाइमजोन यूटीसी के पीछे है)।

मुझे नहीं लगता कि इस तरह के एक छोटे से काम के लिए एक और प्लगइन, क्षण.जे का उपयोग करना एक अच्छा विचार है, खासकर जब आप इसे कोड की कुछ पंक्तियों के साथ प्राप्त कर सकते हैं।



    var timezone_offset_min = new Date().getTimezoneOffset(),
        offset_hrs = parseInt(Math.abs(timezone_offset_min/60)),
        offset_min = Math.abs(timezone_offset_min%60),
        timezone_standard;

    if(offset_hrs < 10)
        offset_hrs = '0' + offset_hrs;

    if(offset_min > 10)
        offset_min = '0' + offset_min;

    // getTimezoneOffset returns an offset which is positive if the local timezone is behind UTC and vice-versa.
    // So add an opposite sign to the offset
    // If offset is 0, it means timezone is UTC
    if(timezone_offset_min < 0)
        timezone_standard = '+' + offset_hrs + ':' + offset_min;
    else if(timezone_offset_min > 0)
        timezone_standard = '-' + offset_hrs + ':' + offset_min;
    else if(timezone_offset_min == 0)
        timezone_standard = 'Z';

    // Timezone difference in hours and minutes
    // String such as +5:30 or -6:00 or Z
    console.log(timezone_standard); 

एक बार जब आपके पास समय और मिनटों में ऑफसेट होने का समय होता है, तो आप एक डेटाइम स्ट्रिंग के लिए अपील कर सकते हैं।

मैंने इस पर एक ब्लॉग पोस्ट लिखा: http://usefulangle.com/post/30/javascript-get-date-time-with-offset-hours-minutes



2

मैं बहुत ही कम कोड के साथ आउटपुट प्राप्त करने में सक्षम था।

var ps = new Date('2010-04-02T14:12:07')  ;
ps = ps.toDateString() + " " + ps.getHours() + ":"+ ps.getMinutes() + " hrs";

आउटपुट:

Fri Apr 02 2010 19:42 hrs

0
function getdatetime() {
    d = new Date();
    return (1e3-~d.getUTCMonth()*10+d.toUTCString()+1e3+d/1)
        .replace(/1(..)..*?(\d+)\D+(\d+).(\S+).*(...)/,'$3-$1-$2T$4.$5Z')
        .replace(/-(\d)T/,'-0$1T');
}

मैंने स्टैक ओवरफ्लो पर मूल बातें कहीं (मुझे विश्वास है कि यह कुछ अन्य स्टैक एक्सचेंज कोड गोल्फिंग का हिस्सा था), और मैंने इसमें सुधार किया इसलिए यह इंटरनेट एक्सप्लोरर 10 या इससे पहले भी काम करता है। यह बदसूरत है, लेकिन यह काम हो जाता है।


0

कुछ चीनी और आधुनिक सिंटैक्स के साथ सीन के शानदार और संक्षिप्त उत्तर का विस्तार करने के लिए:

// date.js

const getMonthName = (num) => {
  const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Oct', 'Nov', 'Dec'];
  return months[num];
};

const formatDate = (d) => {
  const date = new Date(d);
  const year = date.getFullYear();
  const month = getMonthName(date.getMonth());
  const day = ('0' + date.getDate()).slice(-2);
  const hour = ('0' + date.getHours()).slice(-2);
  const minutes = ('0' + date.getMinutes()).slice(-2);

  return `${year} ${month} ${day}, ${hour}:${minutes}`;
};

module.exports = formatDate;

फिर जैसे।

import formatDate = require('./date');

const myDate = "2018-07-24T13:44:46.493Z"; // Actual value from wherever, eg. MongoDB date
console.log(formatDate(myDate)); // 2018 Jul 24, 13:44
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.