कैसे जांचें कि कोई वस्तु तिथि है या नहीं?


600

मेरे पास एक वेबपेज पर एक कष्टप्रद बग है:

date.GetMonth () एक फ़ंक्शन नहीं है

इसलिए, मुझे लगता है कि मैं कुछ गलत कर रहा हूं। चर dateप्रकार की वस्तु नहीं है Dateमैं जावास्क्रिप्ट में डेटाटाइप के लिए कैसे जांच कर सकता हूं? मैंने एक जोड़ने की कोशिश की if (date), लेकिन यह काम नहीं करता है।

function getFormatedDate(date) {
    if (date) {
       var month = date.GetMonth();
    }
}

इसलिए, अगर मैं रक्षात्मक कोड लिखना चाहता हूं और तारीख (जो एक नहीं है) को प्रारूपित करने से रोकना है, तो मैं यह कैसे कर सकता हूं?

धन्यवाद!

अद्यतन: मैं तारीख के प्रारूप की जांच नहीं करना चाहता, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि विधि को दिया गया पैरामीटर getFormatedDate()प्रकार का हो Date


मामले में यह भी मान्य किया जाना चाहिए कि क्या तारीख़ नहीं है Invalid Date: stackoverflow.com/a/44198641/5846045
Boghyon Hoffmann

जवाबों:


1108

के माध्यम से बतख टाइपिंग के विकल्प के रूप में

typeof date.getMonth === 'function'

आप instanceofऑपरेटर का उपयोग कर सकते हैं , अर्थात, लेकिन यह अमान्य तिथियों के लिए भी सही होगा, new Date('random_string')उदाहरण के लिए दिनांक भी है

date instanceof Date

यह विफल हो जाएगा अगर वस्तुओं को सीमा सीमाओं के पार कर दिया जाता है।

इसके लिए एक काम के आसपास वस्तु के वर्ग के माध्यम से जाँच करने के लिए है

Object.prototype.toString.call(date) === '[object Date]'

28
आउट ऑफ इंट्रेस्ट क्या आपको पता है कि इस सीमा के फेल होने का कारण क्या है?
साइमन लीशेके

85
@ साइमन: जेएस ग्लोबल्स वर्तमान वैश्विक वस्तु (उर्फ windowया self) के लिए स्थानीय हैं ; विभिन्न फ़्रेमों की अपनी वैश्विक वस्तुएँ होती हैं, और उनके गुण (अर्थात ग्लोबल्स) अलग-अलग वस्तुओं को संदर्भित करते हैं: फ्रेम 1 में फ्रेम 2 की Dateतुलना Dateमें एक अलग फ़ंक्शन ऑब्जेक्ट है ; उसी के लिए सही है Date.prototype, जो instanceofविफलता का कारण है: Date.prototypeफ्रेम 1 से फ्रेम 2 से Dateउदाहरणों के प्रोटोटाइप श्रृंखला का हिस्सा नहीं है
क्रिस्टोफ़

9
क्रिस्टोफ़, आप "फ्रेम" को क्या कहते हैं? IFRAME, FRAMESET में प्रत्येक फ्रेम या कुछ और (मेरा मतलब है JS-specific, HTML-चीज नहीं)?
पॉल

12
new Date('something') instanceof Datetrueक्रोम में रिटर्न । तब वह काम नहीं करेगा।
क्रिलगर

12
दिनांक प्रकार ऑब्जेक्ट का पता लगाना (जैसा कि किसी सादे ऑब्जेक्ट या स्ट्रिंग के विपरीत) और किसी ऑब्जेक्ट को मान्य करना जो आपको दिनांक होने की उम्मीद है, दोनों अलग-अलग कार्य हैं। ऐसी कई स्थितियाँ हैं जहाँ आपके फ़ंक्शन का इनपुट विभिन्न डेटा प्रकारों में से एक हो सकता है। मेरे मामले में, मुझे विश्वास है कि मुझे मिलने वाली कोई भी दिनांक मान्य है (यह किसी क्लाइंट से सीधे नहीं आ रही है) यदि मान्य करना चिंता का विषय है, तो यहां कई विकल्पों के साथ एक पोस्ट है। stackoverflow.com/questions/1353684/…
माइकल ब्लैकबर्न

125

आप निम्नलिखित कोड का उपयोग कर सकते हैं:

(myvar instanceof Date) // returns true or false

6
यह स्वीकृत या अधिक उत्क्रमित उत्तर क्यों नहीं है? यदि तारीख में एक .getMonth संपत्ति है, तो केवल एक सकारात्मक सकारात्मक ट्रिगर हो सकता है।
doremi

24
instof झूठी नकारात्मक को ट्रिगर कर सकता है, अपने स्वयं के उत्तर में क्रिस्टोफ़ की टिप्पणी देखें।
मार्को मरिअनी

2
@doremi यहां instanceofझूठी नकारात्मक को ट्रिगर करने का एक डेमो है : jsbin.com/vufufoq/edit?html,js,console
Boghyon Hoffmann

67

यह जाँचने के लिए कि मान मानक जेएस-दिनांक ऑब्जेक्ट का एक मान्य प्रकार है, आप इस विधेय का उपयोग कर सकते हैं:

function isValidDate(date) {
  return date && Object.prototype.toString.call(date) === "[object Date]" && !isNaN(date);
}
  1. dateजाँच करता है कि पैरामीटर नहीं था falsy मूल्य ( undefined, null, 0, "", आदि ..)
  2. Object.prototype.toString.call(date)दिए गए ऑब्जेक्ट प्रकार का एक मूल स्ट्रिंग प्रतिनिधित्व लौटाता है - हमारे मामले में "[object Date]"। क्योंकि date.toString()इसकी मूल विधि से आगे निकल जाने पर, हमें सीधे .callया .applyउस विधि की आवश्यकता होती है Object.prototypeजो ।।
    • उपयोगकर्ता-परिभाषित ऑब्जेक्ट प्रकार एक ही निर्माता के नाम के साथ बायपास करते हैं (उदाहरण के लिए: "दिनांक")
    • या इसके विपरीतinstanceof अलग-अलग JS संदर्भों (जैसे iframes) पर काम करता है Date.prototype.isPrototypeOf
  3. !isNaN(date)अंत में जाँच करता है कि क्या मूल्य नहीं था Invalid Date

1
वाह isNaNका उपयोग जांचने के लिए किया जा सकता है Date। यह कुछ PHP स्तर की निर्जीवता है।
निक

@ एक तारीख हालांकि एक संख्या है।
योशिय्याह

@ जोशिया वैसे, निश्चित रूप से, सभी संदर्भ को हटाकर वहां टाइमस्टैम्प है:, typeof Date.now() === "number"लेकिन typeof new Date() === "object":। अधिक वास्तविक रूप से, हालांकि, एक तारीख अंतरिक्ष में एक समय और एक स्थान है।
निक

39

फ़ंक्शन है getMonth(), नहीं GetMonth()

वैसे भी, आप जाँच कर सकते हैं कि क्या ऑब्जेक्ट के पास ऐसा करने से एक संपत्ति प्राप्त होती है। यह जरूरी नहीं है कि वस्तु एक दिनांक है, बस किसी भी वस्तु की एक संपत्ति है जो एक getMonth संपत्ति है।

if (date.getMonth) {
    var month = date.getMonth();
}

3
जांचें कि क्या यह if (date.getMonth && typeof date.getMonth === "function") {...}
कॉल करने

20

जैसा कि ऊपर संकेत दिया गया है, यह शायद यह जांचना सबसे आसान है कि क्या फ़ंक्शन का उपयोग करने से पहले मौजूद है। यदि आप वास्तव में परवाह करते हैं कि यह एक है Date, और एक getMonth()फ़ंक्शन के साथ सिर्फ एक वस्तु नहीं है , तो यह कोशिश करें:

function isValidDate(value) {
    var dateWrapper = new Date(value);
    return !isNaN(dateWrapper.getDate());
}

यह या तो मान का एक क्लोन Dateबनाएगा, यदि यह एक है , या एक अमान्य दिनांक बना सकता है। आप तब जांच सकते हैं कि नई तिथि का मान अमान्य है या नहीं।


1
यह मेरे लिए काम किया, धन्यवाद। हालाँकि, यदि आप 0, या 1 जैसे किसी एक अंक को पास करते हैं, तो यह एक मान्य दिनांक ... किसी भी विचार के रूप में व्यवहार करता है?
रिकार्डो सांचेज

यह सही है, @RicardoSanchez। आप शायद स्वीकार किए गए उत्तर ( Object.prototype.toString.call(value) === '[object Date]') का उपयोग करना चाहते हैं यदि यह संभव है तो आपको नंबर मिलेंगे। इस उत्तर में विधि वास्तव में आपको बताती है कि क्या valueयह परिवर्तनीय है Date
bdukes

18

सभी प्रकार के लिए मैंने एक ऑब्जेक्ट प्रोटोटाइप फ़ंक्शन पकाया। यह आपके काम आ सकता है

Object.prototype.typof = function(chkType){
      var inp        = String(this.constructor),
          customObj  = (inp.split(/\({1}/))[0].replace(/^\n/,'').substr(9),
          regularObj = Object.prototype.toString.apply(this),
          thisType   = regularObj.toLowerCase()
                        .match(new RegExp(customObj.toLowerCase()))
                       ? regularObj : '[object '+customObj+']';
     return chkType
            ? thisType.toLowerCase().match(chkType.toLowerCase()) 
               ? true : false
            : thisType;
}

अब आप किसी भी प्रकार की जाँच कर सकते हैं :

var myDate     = new Date().toString(),
    myRealDate = new Date();
if (myRealDate.typof('Date')) { /* do things */ }
alert( myDate.typof() ); //=> String

[ मार्च 2013 को संपादित करें ] अंतर्दृष्टि बढ़ाने के आधार पर यह एक बेहतर तरीका है:

Object.prototype.is = function() {
        var test = arguments.length ? [].slice.call(arguments) : null
           ,self = this.constructor;
        return test ? !!(test.filter(function(a){return a === self}).length)
               : (this.constructor.name ||
                  (String(self).match ( /^function\s*([^\s(]+)/im)
                    || [0,'ANONYMOUS_CONSTRUCTOR']) [1] );
}
// usage
var Some = function(){ /* ... */}
   ,Other = function(){ /* ... */}
   ,some = new Some;
2..is(String,Function,RegExp);        //=> false
2..is(String,Function,Number,RegExp); //=> true
'hello'.is(String);                   //=> true
'hello'.is();                         //-> String
/[a-z]/i.is();                        //-> RegExp
some.is();                            //=> 'ANONYMOUS_CONSTRUCTOR'
some.is(Other);                       //=> false
some.is(Some);                        //=> true
// note: you can't use this for NaN (NaN === Number)
(+'ab2').is(Number);                 //=> true


8

सबसे अच्छा तरीका मैंने पाया है:

!isNaN(Date.parse("some date test"))
//
!isNaN(Date.parse("22/05/2001"))  // true
!isNaN(Date.parse("blabla"))  // false

यह काम नहीं करता है। आपकी असली लाइन वास्तव में झूठी है और सवाल यह है कि अगर कोई ऑब्जेक्ट डेट ऑब्जेक्ट है तो जाँच के बारे में ...
क्लिंट

1
यदि स्ट्रिंग एक तारीख है या नहीं, तो @jspassov उत्तर अधिक सटीक है। कि मैं ढूंढ रहा था। धन्यवाद!!
अनंत

यह जाँचने के लिए सबसे अच्छा उत्तर है कि क्या स्ट्रिंग एक तारीख है या नहीं
जेम्स जेंटेस

3

आप देख सकते हैं कि क्या दिनांक ऑब्जेक्ट के लिए विशिष्ट कोई फ़ंक्शन मौजूद है:

function getFormatedDate(date) {
    if (date.getMonth) {
        var month = date.getMonth();
    }
}

3

सभी वर्कअराउंड के बजाय आप निम्नलिखित का उपयोग कर सकते हैं:

dateVariable = new Date(date);
if (dateVariable == 'Invalid Date') console.log('Invalid Date!');

मुझे यह हैक बेहतर लगा!


2

इसके अलावा, आप संक्षिप्त रूप का उपयोग कर सकते हैं

function getClass(obj) {
  return {}.toString.call(obj).slice(8, -1);
}
alert( getClass(new Date) ); //Date

या इस तरह का कुछ:

(toString.call(date)) == 'Date'

2

मैं बहुत सरल तरीके से उपयोग कर रहा हूं लेकिन यह सुनिश्चित नहीं है कि यह केवल ES6 में उपलब्ध है या नहीं।

let a = {name: "a", age: 1, date: new Date("1/2/2017"), arr: [], obj: {} };
console.log(a.name.constructor.name); // "String"
console.log(a.age.constructor.name);  // "Number"
console.log(a.date.constructor.name); // "Date"
console.log(a.arr.constructor.name);  // "Array"
console.log(a.obj.constructor.name);  // "Object"

हालांकि, यह शून्य या अपरिभाषित पर काम नहीं करेगा क्योंकि उनके पास कोई निर्माता नहीं है।


निर्माता के नाम "दिनांक" के साथ कोई भी कस्टम बनाया गया ऑब्जेक्ट "Date"भी रिटर्न करता है जो कि पैरामीटर की getMonthसंपत्ति होने पर सिर्फ जाँच करने जैसा ही जोखिम भरा है।
बोगीयन हॉफमैन

2
@boghyon लगता है, जो पहले से ही एक निर्धारित जावास्क्रिप्ट मानक पुस्तकालय के निर्माता के नाम के साथ एक वस्तु बनाता है पहली जगह में सर्वोत्तम प्रथाओं का पालन नहीं कर रहा है। यह लॉश डाउनलोड करने जैसा होगा, फिर अपना खुद का लॉशैश मॉड्यूल बनाना और काम करने के लिए चीजों की अपेक्षा करना।
mjwrazor

1

trueयदि यह दिनांक है या falseनहीं तो यह फ़ंक्शन वापस आ जाएगा :

function isDate(myDate) {
    return myDate.constructor.toString().indexOf("Date") > -1;
} 

1
isDate(new (function AnythingButNotDate(){ })())रिटर्नtrue
बोगीयन हॉफमैन

1

अभी तक एक और संस्करण:

Date.prototype.isPrototypeOf(myDateObject)

अच्छा और छोटा! लेकिन दुर्भाग्य से, यह एक ही मुद्दा हैinstanceof
बजे बोगायन हॉफमैन

@BoghyonHoffmann iFrame के मामले में ऐसा लग सकता है: iWindow.Date.prototype.isPrototypeOf(iWindow.date); // true iWindow.date instanceof iWindow.Date; // true
वादिम

1

एक कोशिश / पकड़ का उपयोग कर एक दृष्टिकोण

function getFormatedDate(date = new Date()) {
  try {
    date.toISOString();
  } catch (e) {
    date = new Date();
  }
  return date;
}

console.log(getFormatedDate());
console.log(getFormatedDate('AAAA'));
console.log(getFormatedDate(new Date('AAAA')));
console.log(getFormatedDate(new Date(2018, 2, 10)));


0

दरअसल तारीख टाइप की होगी Object। लेकिन आप जांच सकते हैं कि क्या वस्तु में getMonthविधि है और अगर यह कॉल करने योग्य है।

function getFormatedDate(date) {
    if (date && date.getMonth && date.getMonth.call) {
       var month = date.getMonth();
    }
}

2
क्रिस्टोफ का जवाब अधिक सटीक है। 'कॉल' संपत्ति होने का मतलब यह नहीं है कि यह एक फ़ंक्शन है!
चेतन शास्त्री

-1

हम इसे नीचे दिए गए कोड द्वारा भी मान्य कर सकते हैं

var a = new Date();
a.constructor === Date
/*
true
*/

यहाँ छवि विवरण दर्ज करें


का कंस्ट्रक्टर function Date() {/*...*/}भी है Date। यानी कंस्ट्रक्टर फंक्शन की तुलना करना बहुत अधिक त्रुटि वाला है, जिसका परिणाम अक्सर गलत सकारात्मकता के रूप में सामने आता है। साथ उपयोगकर्ता परिभाषित ऑब्जेक्ट प्रकार बाईपास stackoverflow.com/a/44198641/5846045
Boghyon हॉफमन

-1

इस उत्तर से प्रेरित होकर , यह समाधान मेरे मामले में काम करता है (मुझे यह जांचने की आवश्यकता है कि क्या एपीआई से प्राप्त मूल्य एक तारीख है या नहीं):

!isNaN(Date.parse(new Date(YourVariable)))

इस तरह, अगर यह किसी क्लाइंट, या किसी अन्य ऑब्जेक्ट से आने वाली कुछ यादृच्छिक स्ट्रिंग है, तो आप यह पता कर सकते हैं कि क्या यह डेट-जैसी वस्तु है।


-2

आप सिर्फ इस्तेमाल नहीं कर सकते

function getFormatedDate(date) {
    if (date.isValid()) {
       var month = date.GetMonth();
    }
}

1
नहीं, केवल दिनांक ऑब्जेक्ट की isValidविधि है
nikk wong

2
@grumpy @nikkwong नहीं और नहीं। मानक दिनांक ऑब्जेक्ट नहीं है isValid। केवल क्षण . js में ऐसा एपीआई होता है।
बोगीयन हॉफमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.