কোনও বস্তু একটি তারিখ কিনা তা কীভাবে পরীক্ষা করবেন?


600

ওয়েবপৃষ্ঠায় আমার একটি বিরক্তিকর বাগ রয়েছে:

তারিখ.গেটমনেথ () কোনও ফাংশন নয়

সুতরাং, আমি মনে করি যে আমি কিছু ভুল করছি। ভেরিয়েবল dateকোনও ধরণের বস্তু নয় Dateআমি কীভাবে জাভাস্ক্রিপ্টে একটি ডেটাটাইপ পরীক্ষা করতে পারি? আমি একটি যুক্ত করার চেষ্টা করেছি if (date), তবে এটি কার্যকর হয় না।

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

সুতরাং, আমি যদি ডিফেন্সিভ কোড লিখতে এবং তারিখটি (যা এক নয়) ফর্ম্যাট করা যায় তবে আমি কীভাবে এটি করব?

ধন্যবাদ!

আপডেট: আমি তারিখের ফর্ম্যাটটি চেক করতে চাই না, তবে আমি নিশ্চিত হতে চাই যে পদ্ধতিটিতে পাস করা প্যারামিটারটি getFormatedDate()টাইপ রয়েছে Date


যদি এটি যাচাই করা উচিত কিনা তা তারিখ নয় একটি Invalid Date: stackoverflow.com/a/44198641/5846045
Boghyon হফম্যান

উত্তর:


1108

মাধ্যমে হাঁসের টাইপিংয়ের বিকল্প হিসাবে

typeof date.getMonth === 'function'

আপনি ব্যবহার করতে পারেন instanceofঅপারেটর, IE কিন্তু এটা খুব অবৈধ তারিখগুলি জন্য সত্য ফিরে আসবে যেমন 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থেকে frame1 এর প্রোটোটাইপ শৃঙ্খল অংশ নয় Dateframe2 থেকে দৃষ্টান্ত
ক্রিস্টোফ

9
ক্রিস্টোফ, আপনি কি "ফ্রেম" বলছেন? আইফ্রেমে, ফ্রেমসেটের প্রতিটি ফ্রেম বা অন্য কিছু (আমার অর্থ জেএস-নির্দিষ্ট, এটি এইচটিএমএল-জিনিস নয়)?
পল

12
new Date('something') instanceof Datetrueক্রোমে ফিরে আসে । এটি তখন কাজ করবে না।
krillgar

12
একটি তারিখের ধরণের অবজেক্ট (একটি সরল অবজেক্ট বা স্ট্রিংয়ের বিপরীতে) সনাক্ত করা এবং কোনও বস্তুর যা আপনি তারিখ হওয়ার প্রত্যাশা করছেন তা বৈধকরণ দুটি ভিন্ন ভিন্ন কাজ। এমন অনেকগুলি পরিস্থিতি রয়েছে যেখানে আপনার ফাংশনটির ইনপুট বিভিন্ন ডেটা ধরণের একটি হতে পারে। আমার ক্ষেত্রে, আমি বিশ্বাস করতে পারি যে আমার যে কোনও তারিখের অবজেক্টটি বৈধ হবে (এটি কোনও ক্লায়েন্টের কাছ থেকে সরাসরি আসে না) যদি বৈধতা প্রদান করা উদ্বেগজনক হয় তবে এখানে বেশ কয়েকটি বিকল্পের একটি পোস্ট রয়েছে। stackoverflow.com/questions/1353684/…
মাইকেল ব্ল্যাকবার্ন

125

আপনি নিম্নলিখিত কোড ব্যবহার করতে পারেন:

(myvar instanceof Date) // returns true or false

6
কেন এটি গৃহীত বা বেশি উত্সাহিত উত্তর নয়? তারিখটিতে .getMonth সম্পত্তি রয়েছে কিনা তা খতিয়ে দেখলে কোনও মিথ্যা ধনাত্মক সূত্রপাত হতে পারে।
doremi

24
উদাহরণস্বরূপ মিথ্যা নেতিবাচক ট্রিগার করতে পারে, ক্রিস্টফের নিজের উত্তরে মন্তব্য দেখুন।
মার্কো মারিয়ানি

2
@ ডোরেমি এখানে instanceofমিথ্যা নেতিবাচক ট্রিগারটির
বোঘিয়ান হফম্যান

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 বাDate.prototype.isPrototypeOf
  3. !isNaN(date)অবশেষে মানটি একটি ছিল কিনা তা যাচাই করে Invalid Date

1
বাহ isNaNচেক করতে ব্যবহার করা যেতে পারে Date। এটি কিছু পিএইচপি স্তরের পাগল।
নিক

@ নিক তারিখ একটি সংখ্যা যদিও।
জোশিয়াহ

@Josiah ওয়েল, নিশ্চিত, সব প্রসঙ্গ সরানোর একটা টাইমস্ট্যাম্প এর সেখানে: typeof Date.now() === "number"কিন্তু: typeof new Date() === "object"। আরও বাস্তবে, যদিও, একটি তারিখ একটি সময় এবং স্থানের স্থান।
নিক

39

ফাংশন getMonth(), না 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 এর মতো কোনও একক সংখ্যাটি পাস করেন তবে এটি বৈধ তারিখ হিসাবে বিবেচনা করে ... কোনও চিন্তা?
রিকার্ডো সানচেজ

ঠিক আছে, @ রিকার্ডো সানচেজ। আপনি যদি সম্ভবত Object.prototype.toString.call(value) === '[object Date]'নম্বর পেয়ে যাচ্ছেন তবে আপনি সম্ভবত গ্রহণযোগ্য উত্তরটি ব্যবহার করতে চান । এই উত্তরের পদ্ধতিটি আপনাকে সত্যিই বলে দেয় যে এটি valueএকটিতে রূপান্তরযোগ্য Date
বিডুকস

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

10

UnderscoreJS এবং Lodash একটি ফাংশন বলা আছে .isDate()যা ঠিক কি আপনি প্রয়োজন বলে মনে হচ্ছে। : এটা তাদের নিজ নিজ বাস্তবায়নের দিকে তাকিয়ে মূল্য Lodash isDate , UnderscoreJs


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
@ বোঘিওন মনে হচ্ছে যে ইতিমধ্যে পূর্বনির্ধারিত জাভাস্ক্রিপ্ট স্ট্যান্ডার্ড লাইব্রেরির কনস্ট্রাক্টরের নাম দিয়ে যে কেউ একটি বস্তু তৈরি করেছে তারা প্রথমে সেরা অনুশীলনগুলি অনুসরণ করছে না। এটি লড্যাশ ডাউনলোড করার পরে আপনার নিজের লড্যাশ মডিউল তৈরি করার এবং জিনিসগুলি কাজ করার প্রত্যাশার মতো হবে।
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
বোঘিয়ান হফম্যান

@ বাগিয়ান হফম্যান আইফ্রেমের ক্ষেত্রে এটি দেখতে দেখতে দেখতে এটি পছন্দ হতে পারে: 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পদ্ধতি রয়েছে
নিক্ক ওয়াং

2
@grumpy @nikkwong এবং না। মানক তারিখ অবজেক্ট নেই isValid। কেবলমাত্র moment.js এর একটি এপিআই রয়েছে।
বোঘইন হফম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.