new Date () क्रोम में काम कर रहा है लेकिन फ़ायरफ़ॉक्स नहीं


89

मैं एक डेटाइम स्ट्रिंग बना रहा हूँ जो इस तरह दिखती है: 2010-07-15 11:54:21

और निम्न कोड के साथ मुझे फ़ायरफ़ॉक्स में अवैध तारीख मिलती है लेकिन क्रोम में बस ठीक काम करता है

var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds;
var date1 = new Date(todayDateTime);

फ़ायरफ़ॉक्स में तारीख 1 मुझे एक अमान्य तारीख दे रहा है, लेकिन क्रोम में इसका काम ठीक है कि मुख्य कारण क्या होगा?


2
यदि आप इसे किसी भी तरह से खेलना चाहते हैं, तो आप datejs.com के
सिनान

सभी कार्यान्वयन ECMA-262 में प्रारूप का समर्थन नहीं करते हैं, इसलिए हमेशा मैन्युअल रूप से पार्स स्ट्रिंग्स (एक पुस्तकालय मदद कर सकता है, लेकिन संभवत: अन्य प्रारूपों के लिए आवश्यक नहीं है)।
23

यह अब फ़ायरफ़ॉक्स काम करता है।
एस.एम. यमाशिता

जवाबों:


78

आप किसी भी तरह से किसी तिथि वस्तु को तुरंत नहीं भेज सकते। यह एक विशिष्ट तरीके से होना है। यहाँ कुछ मान्य उदाहरण दिए गए हैं:

new Date() // current date and time
new Date(milliseconds) //milliseconds since 1970/01/01
new Date(dateString)
new Date(year, month, day, hours, minutes, seconds, milliseconds)

या

d1 = new Date("October 13, 1975 11:13:00")
d2 = new Date(79,5,24)
d3 = new Date(79,5,24,11,33,0)

क्रोम को बस अधिक लचीला होना चाहिए।

स्रोत: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

से apsillers टिप्पणी:

EMCAScript विनिर्देश के लिए ठीक एक तिथि प्रारूप (यानी, YYYY-MM-DDTHH: mm: ss.sssZ) की आवश्यकता होती है , लेकिन कस्टम तिथि स्वरूपों को क्रियान्वयन द्वारा स्वतंत्र रूप से समर्थित किया जा सकता है : " यदि स्ट्रिंग उस" ECMAScript- परिभाषित] प्रारूप के अनुरूप नहीं है फ़ंक्शन किसी भी कार्यान्वयन-विशिष्ट उत्तराधिकार या कार्यान्वयन-विशिष्ट दिनांक स्वरूपों पर वापस आ सकता है। "Chrome और FF के पास" कार्यान्वयन-विशिष्ट दिनांक प्रारूप अलग-अलग हैं। "


3
मुझे एक समाधान मिला जो फ़ायरफ़ॉक्स सहित सभी ब्राउज़रों में काम करता है: stackoverflow.com/a/21984717/586051
राहुल देसाई

7
जैसा कि यह ब्राउज़र अंतर क्यों मौजूद है: EMCAScript विनिर्देशन को ठीक एक दिनांक स्वरूप की आवश्यकता होती है (यानी YYYY-MM-DDTHH:mm:ss.sssZ) की , लेकिन कार्यान्वयन के लिए कस्टम तिथि स्वरूपों का स्वतंत्र रूप से समर्थन किया जा सकता है : " यदि स्ट्रिंग उस [ECMAScript- परिभाषित] प्रारूप के अनुरूप नहीं है तो फ़ंक्शन हो सकता है" किसी भी कार्यान्वयन-विशिष्ट उत्तराधिकार या कार्यान्वयन-विशिष्ट दिनांक स्वरूपों पर वापस जाएं। "Chrome और FF के पास" कार्यान्वयन-विशिष्ट-विशिष्ट प्रारूप हैं। "
अप्सिलर्स

दिनांक प्रारूप का एक उदाहरण (महीना जिसमें "" शामिल है) जो क्रोम में काम करता है लेकिन फ़ायरफ़ॉक्स में नहीं: 'फ़रवरी। 14, 2019 '
codecribblr

23

यह सभी ब्राउज़रों में काम करता है -

नई तिथि ('2001/01/31 12:00:00 पूर्वाह्न')

new Date('2001-01-31 12:00:00')

प्रारूप: YYYY-MM-DDTHH: मिमी: ssssss

विवरण: http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15


क्योंकि हम सभी जानते हैं कि यह एक अंतरराष्ट्रीय मानक है। w3.org/International/questions/qa-date-format
बॉबी टेबल्स

6
तो आपने वास्तव में सभी ब्राउज़रों का परीक्षण किया है ? और आपके पास यह मानते हुए, आप यह भी जानते हैं कि भविष्य में सभी ब्राउज़र भी (गैर-मानक) प्रारूप का समर्थन करेंगे?
RobG

1
यह मेरे लिए काम करता है। इसलिए यदि आपको पहले से ही '2001-1-31 12:00:00' का तार मिल जाता है, तो हम बस यह कर सकते हैं: नई तिथि (str.replace (/ - / g, '/'));
जियानव्यू चेन

@JianwuChen आप जानबूझकर एक मानक प्रारूप को गैर-मानक में संशोधित कर रहे हैं। अच्छा विचार नहीं।
जेजे

2
3 साल बाद, यह एज और विंडो सफारी पर काम नहीं कर रहा है।
Mg थार

13

विकल्प 1 :

मान लीजिए कि आपके टाइमस्ट्रिंग में एक प्रारूप है जो इस तरह दिखता है:

'2016-03-10 16:00:00.0'

उस स्थिति में, आप इसे बदलने के लिए एक सरल रीगेक्स कर सकते हैं ISO 8601 :

'2016-03-10 16:00:00.0'.replace(/ /g,'T')

यह निम्न आउटपुट की घोषणा करेगा:

'2016-03-10T16:00:00.0'

यह मानक डेटाटाइम प्रारूप है, और इस प्रकार सभी ब्राउज़रों द्वारा समर्थित है:

document.body.innerHTML = new Date('2016-03-10T16:00:00.0') // THIS IS SAFE TO USE

विकल्प 2 :

मान लीजिए कि आपके टाइमस्ट्रिंग में एक प्रारूप है जो इस तरह दिखता है:

'02-24-2015 09:22:21 PM'

यहाँ, आप निम्नलिखित regex कर सकते हैं:

'02-24-2015 09:22:21 PM'.replace(/-/g,'/');

यह भी, सभी ब्राउज़रों द्वारा समर्थित एक प्रारूप का उत्पादन करता है:

document.body.innerHTML = new Date('02/24/2015 09:22:21 PM') // THIS IS SAFE TO USE

विकल्प 3:

मान लीजिए कि आपके पास एक समय स्ट्रिंग है जो अच्छी तरह से समर्थित मानकों में से एक को समायोजित करना आसान नहीं है।

उस स्थिति में, अपने टाइम स्ट्रिंग को अलग-अलग टुकड़ों में विभाजित करना और उन्हें अलग-अलग मापदंडों के रूप में उपयोग करना सबसे अच्छा है Date:

document.body.innerHTML = new Date(2016, 2, 26, 3, 24, 0); // THIS IS SAFE TO USE


1
var d = नई तिथि ('2017-08-28 08:02 PM'.replace (/ - / g,' / ')); यह पूरी तरह से क्रोम के साथ-साथ मोज़िला में भी काम करता है।
राहुल मानकर

13

यह अधिकांश ब्राउज़रों में भी काम करता है

new Date('2001/01/31 12:00:00')

का प्रारूप है

"yyyy/MM/dd HH:mm:ss"

3
इस बात की कोई गारंटी नहीं है कि प्रारूप किसी भी ब्राउज़र में काम करेगा, बहुत कम "सभी"।
रोब

आप इसके बारे में सही हैं, इसका जवाब मेरे अनुभव पर आधारित है।
अल्विस

8

यदि आप अभी भी डैश का उपयोग करके दिनांक बनाना चाहते हैं, तो आप इस प्रारूप का उपयोग कर सकते हैं:

var date = new Date('2013-08-31T17:00:00Z')

लेकिन ध्यान रखें, कि यह यूटीसी के अनुसार समय बनाता है। मतलब, यदि आप GMT + 3 (GMT से 3 घंटे आगे) timezone में रहते हैं, तो यह समय के साथ इस timezone को जोड़ देगा। तो उपरोक्त उदाहरण का यह मान होगा, यदि GMT + 3 (ध्यान दें कि यह 20:00 बजे घंटे और 17:00 नहीं है):

Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time)

अंत में 'Z' अक्षर जोड़ना सुनिश्चित करें, क्योंकि अन्यथा क्रोम और फ़ायरफ़ॉक्स स्ट्रिंग को अलग तरह से पार्स करेंगे (एक समय ऑफसेट जोड़ देगा और दूसरा नहीं होगा)।


1
यदि आप टाइमजोन की आपूर्ति नहीं करते हैं, तो क्रोम और फ़ायरफ़ॉक्स अलग तरीके से व्यवहार करते हैं। और, मुझे लगता है कि फायरफॉक्स गलत है। यदि समय क्षेत्र अनुपस्थित है तो इसे GMT मान लेना चाहिए। क्रोम करता है, फ़ायरफ़ॉक्स नहीं करता है। ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
जूलियन जेफल्स

@ जूलियनजेल्फ़्स- " यह जीएमटी को मान लेना चाहिए यदि समय क्षेत्र अनुपस्थित है ", केवल तारीख के लिए (आईएसओ 8601 के विपरीत)। तिथि और समय के तार के लिए, इसे स्थानीय (आईएसओ 8601 के अनुरूप) मान लेना चाहिए। लेकिन किसी भी मामले में, मैनुअल पार्सिंग जाने का एकमात्र सुरक्षित तरीका है।
रॉब

5

मुझे AngularJS के साथ काम करते समय फ़ायरफ़ॉक्स और सफारी दोनों में एक समान समस्या हो रही थी। उदाहरण के लिए, अगर एंगुलर से लौटी तारीख इस तरह दिखती है:

2014-06-02 10:28:00

इस कोड का उपयोग करना:

new Date('2014-06-02 10:28:00').toISOString();

फ़ायरफ़ॉक्स और सफारी में एक अमान्य दिनांक त्रुटि देता है। हालांकि क्रोम में यह ठीक काम करता है। जैसा कि एक अन्य उत्तर में कहा गया है कि, पार्सिंग डेट स्ट्रिंग के साथ क्रोम अधिक लचीला है।

मेरा अंतिम लक्ष्य तारीख को एक निश्चित तरीके से प्रारूपित करना था। मुझे एक उत्कृष्ट पुस्तकालय मिला जिसने क्रॉस ब्राउज़र संगतता समस्या और दिनांक स्वरूपण समस्या दोनों को संभाला। पुस्तकालय को क्षण कहा जाता है

इस लाइब्रेरी का उपयोग करते हुए, निम्नलिखित कोड उन सभी ब्राउज़रों पर सही ढंग से काम करता है, जिन्हें मैंने परीक्षण किया था:

moment('2014-06-02 10:28:00').format('MMM d YY')

यदि आप इस अतिरिक्त पुस्तकालय को अपने ऐप में शामिल करने के इच्छुक हैं तो आप संभावित ब्राउज़र संगतता के मुद्दों से बचते हुए आसानी से अपनी तारीख स्ट्रिंग का निर्माण कर सकते हैं। बोनस के रूप में आपके पास जरूरत पड़ने पर आसानी से फॉर्मेट करने, जोड़ने, घटाने आदि के लिए एक अच्छा तरीका होगा।


आप चाहिए हमेशा के लिए प्रारूप पारित moment.js जब तार को पार्स, अन्यथा यह सिर्फ जब तक यह एक है कि कोई मान्य दिनांक बनाता है पाता अनुमान लगाता है।
रॉब

4

यह आपके लिए काम करना चाहिए:

var date1 = new Date(year, month, day, hour, minute, seconds);

मुझे तारीख बनाने के लिए एक स्ट्रिंग बनानी थी इसलिए मैंने इसे इस तरह किया है:

var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2), d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));

याद रखें कि जावास्क्रिप्ट में महीने 0 से 11 तक हैं, इसलिए आपको महीने के मूल्य को 1 से कम करना चाहिए, जैसे:

var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2) - 1, d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));

2

सरल समाधान, यह सभी ब्राउज़रों के साथ काम करता है,

var StringDate = "24-11-2017"   
var DateVar = StringDate.split("-");
var DateVal = new Date(DateVar[1] + "/" + DateVar[0] + "/" + DateVar[2]);
alert(DateVal);

1

जब मैं मिलीसेकंड के साथ काम कर रहा था तो एक स्थिति। एफएफ और आईई इस तिथि स्ट्रिंग को सही ढंग से पार्स नहीं करेंगे, जब एक नई तारीख बनाने की कोशिश की जाएगी। "2014/11/24 17:38:20.177Z" उन्हें नहीं पता कि कैसे संभालना है .177Z। क्रोम हालांकि काम करेगा।


0

वास्तव में, क्रोम विभिन्न स्ट्रिंग प्रारूप से निपटने के लिए अधिक लचीला है। यहां तक ​​कि अगर आप इसके स्ट्रिंग प्रारूप का पता नहीं लगाते हैं, तब भी क्रोम त्रुटि के बिना स्ट्रिंग को सफलतापूर्वक तिथि में बदल सकता है। ऐशे ही:

  var outputDate = new Date(Date.parse(inputString));

लेकिन फ़ायरफ़ॉक्स और सफारी के लिए, चीजें अधिक जटिल हो जाती हैं। वास्तव में, फ़ायरफ़ॉक्स के दस्तावेज़ में, यह पहले से ही कहता है: ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse )

RFC2822 या ISO 8601 तारीख का प्रतिनिधित्व करने वाला एक स्ट्रिंग (अन्य प्रारूपों का उपयोग किया जा सकता है, लेकिन परिणाम अप्रत्याशित हो सकते हैं)।

इसलिए, जब आप फ़ायरफ़ॉक्स और सफारी में Date.parse का उपयोग करना चाहते हैं, तो आपको सावधान रहना चाहिए। मेरे लिए, मैं इससे निपटने के लिए एक ट्रिक विधि का उपयोग करता हूं। (नोट: यह हमेशा सभी मामलों के लिए सही नहीं हो सकता है)

if (input.indexOf("UTC") != -1) {
  var tempInput = inputString.substr(0, 10) + "T" + inputString.substr(11, 8) + "Z";
  date = new Date(Date.parse(tempInput));
}

यहां यह 2013-08-08 11:52:18 यूटीसी से 2013-08-08T11: 52: 18Z पहले परिवर्तित हो गया , और फिर इसका प्रारूप फ़ायरफ़ॉक्स के दस्तावेज़ में शब्द फिट है। इस समय, किसी भी ब्राउज़र में Date.parse हमेशा सही रहेगा।


0

इसने मेरे लिए क्या काम किया Firefoxऔर Chrome:

// The format is 'year-month-date hr:mins:seconds.milliseconds'
const d = new Date('2020-1-4 12:00:00.999') 
// we use the `.` separator between seconds and milliseconds.

शुभ लाभ...


-1

फ़ायरफ़ॉक्स में, किसी भी अमान्य दिनांक को दिनांक के रूप में दिनांक ऑब्जेक्ट के रूप में लौटाया जाता है 1899-11-29T19:00:00.000Z, इसलिए जांचें कि क्या ब्राउज़र फ़ायरफ़ॉक्स है तो स्ट्रिंग का दिनांक ऑब्जेक्ट प्राप्त करें "1899-11-29T19:00:00.000Z".getDate()। अंत में तारीख के साथ तुलना करें।


यह समस्या का कारण नहीं बताता है, बल्कि समस्या का परिणाम क्या होगा।
Rytis

-1

मैंने निम्नलिखित प्रारूप का उपयोग किया है और यह सभी ब्राउज़र में काम कर रहा है।

var target_date = new Date("Jul 17, 2015 16:55:22").getTime();

var days, hours, minutes, seconds;

var countdown = document.getElementById("countdown");

remaining = setInterval(function () {

    var current_date = new Date().getTime();
    var seconds_left = (target_date - current_date) / 1000;
    days = parseInt(seconds_left / 86400);
    seconds_left = seconds_left % 86400;
    hours = parseInt(seconds_left / 3600);
    seconds_left = seconds_left % 3600;
    minutes = parseInt(seconds_left / 60);
    seconds = parseInt(seconds_left % 60);
    countdown.innerHTML = "<b>"+days + " day, " + hours + " hour, "
        + minutes + " minute, " + seconds + " second.</b>";  
}, 1000);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.