জাভাস্ক্রিপ্টে একটি "অবৈধ তারিখ" তারিখের উদাহরণ সনাক্ত করা


1492

আমি জেএসে বৈধ এবং অবৈধ তারিখের অবজেক্টের মধ্যে পার্থক্য বলতে চাই, তবে কীভাবে তা বের করতে পারলাম না:

var d = new Date("foo");
console.log(d.toString()); // shows 'Invalid Date'
console.log(typeof d); // shows 'object'
console.log(d instanceof Date); // shows 'true'

একটি isValidDateফাংশন লেখার জন্য কোন ধারণা ?

  • অ্যাশ Date.parseতারিখের স্ট্রিংগুলি বিশ্লেষণের জন্য প্রস্তাবিত , যা তারিখের স্ট্রিংটি বৈধ কিনা তা যাচাই করার একটি অনুমোদিত উপায় দেয়।
  • আমি যদি পছন্দ করি তবে যদি সম্ভব হয় তবে আমার এপিআই-তে কোনও তারিখের উদাহরণ গ্রহণ করা এবং এটি বৈধ কিনা না তা যাচাই / প্রতিস্থাপন করতে সক্ষম হব। বোরগার এর সমাধানটি তা করে তবে আমার এটি ব্রাউজারগুলিতে পরীক্ষা করা দরকার। আরও চমকপ্রদ উপায় আছে কিনা তাও আমি ভাবছি।
  • অ্যাশ আমাকে আমার এপিআইয়ের Dateদৃষ্টান্তগুলি গ্রহণ না করার বিষয়টি বিবেচনা করিয়েছে , এটি যাচাইকরণ করা সবচেয়ে সহজ।
  • বোরগার একটি Dateউদাহরণের জন্য পরীক্ষা করার পরামর্শ দিয়েছিল এবং তারপরে Dateতার সময়ের মান পরীক্ষা করার পরামর্শ দেয়। তারিখটি অবৈধ হলে সময় মান NaN। আমি ECMA-262 দিয়ে পরীক্ষা করেছি এবং এই আচরণটি স্ট্যান্ডার্ডে রয়েছে, যা ঠিক আমি খুঁজছি।

18
আপনি যদি বিবৃতিটি ফাংশনটির বডি পরিবর্তন করে এটি সরিয়ে ফেলতে পারেন:return ( Object.prototype.toString.call(d) === "[object Date]" && !isNaN(d.getTime()) );
স্টাইলফেল

3
@ স্টাইফ্লে - অনুমান করুন এটি একটি শৈলীর পছন্দ: সমতা যুক্তি থেকে প্রকারের চেকটি আলাদা করা আমি আরও স্পষ্ট মনে করি।
অরিপ

26
@ ইউরিপ ডিসকোর্স হ'ল প্রশ্নগুলিতে ভারী নিরুৎসাহিত করা। এর পিছনে যুক্তি শিখতে দয়া করে প্রাসঙ্গিক মেটা বিষয়গুলি পড়ুন। প্রশ্নে নিজের প্রশ্নের নিজের উত্তর দেওয়া সাইট নীতিবিরোধী। ওটিওএহ, প্রতিক্রিয়াগুলির জন্য ধন্যবাদ জানানো এবং আপনার উত্তরে "এডিআইটি" থাকাটাই সাধারণত ফ্লাফ। যদি আপনি শীর্ষস্থানীয় প্রশ্নটি চান এমন একজন ব্যক্তি হিসাবে আপনাকে সনাক্ত করতে পারেন যিনি কী জানেন যে এসও কী এবং কীভাবে এটি ব্যবহার করবেন এবং এটি শিখতে চান না - আমার অতিথি হোন।

14
@ ইউরিপ: এটি "হারানো" ছিল না; যদি আপনি এটি আবার দেখতে চান তবে এটি এখনও প্রশ্নের পুনর্বিবেচনার ইতিহাসকে বিশৃঙ্খলা করছে। তবে এটি কোনও প্রশ্নের অন্তর্গত নয়। 37k rep এ আপনার এটি জানা উচিত।
অরবিটে হালকাতা রেস

6
দয়া করে সম্পাদনা যুদ্ধ বন্ধ করুন। এই প্রশ্নের সম্পাদনাগুলি মেটা নিয়ে আলোচনা করা হয় । দয়া করে এই পোস্টটি আরও সম্পাদনা / রোলব্যাক করবেন না। আপনি যদি পূর্ববর্তী সম্পাদনা / রোলব্যাকগুলির সাথে একমত না হন বা সেগুলি সম্পর্কে কোনও মন্তব্য করেন তবে দয়া করে সেই মেটা থ্রেডটিতে পোস্ট করুন এবং এখানে নয়।
লন্ডিন

উত্তর:


1301

আমি এখানে এটি কীভাবে করব:

if (Object.prototype.toString.call(d) === "[object Date]") {
  // it is a date
  if (isNaN(d.getTime())) {  // d.valueOf() could also work
    // date is not valid
  } else {
    // date is valid
  }
} else {
  // not a date
}

আপডেট [2018-05-31] : আপনি অন্যান্য জেএস প্রসঙ্গে (বাহ্যিক উইন্ডো, ফ্রেম বা আইফ্রেমেস) তারিখের বিষয়গুলি নিয়ে উদ্বিগ্ন না থাকলে, এই সহজ ফর্মটি পছন্দ করা যেতে পারে:

function isValidDate(d) {
  return d instanceof Date && !isNaN(d);
}

21
উদাহরণস্বরূপ ফ্রেম জুড়ে বিরতি। হাঁস-টাইপিং ঠিক ঠিক কাজ করতে পারে: বৈধ তারিখ == d && d.getTime &&! IsNaN (d.getTime ()); - যেহেতু প্রশ্নটি সাধারণ ইউটিলিটি ফাংশনের জন্য আমি আরও কঠোর হতে পছন্দ করি।
বোরগার

11
@ বার্গার, আমার উত্তরটি সবেমাত্র খুঁজে পেয়েছেন: "মাল্টি-ফ্রেম ডিওএম পরিবেশে স্ক্রিপ্টিংয়ের কথা উঠলে সমস্যাগুলি দেখা দেয় a সংক্ষেপে, যদি একটি আইফ্রামের মধ্যে তৈরি অ্যারে অবজেক্টগুলি [[প্রোটোটাইপ]] অন্য আইফ্রেমে তৈরি অ্যারের সাথে ভাগ করে না? তাদের কন্সট্রাক্টররা বিভিন্ন বস্তু এবং সুতরাং উদাহরণস্বরূপ এবং নির্মাণকারী উভয় চেকই ব্যর্থ। "
অ্যাশ

64
আপনি এমনকি প্রয়োজন হবে না d.getTimeশুধুisNan(d)
TecHunter

8
এভাবে সরলীকৃত করা যেতে পারে:d instanceof Date && !isNaN(d.getTime())
জর্জিটোন

5
উত্তরের জন্য ধন্যবাদ, তবে আমি @ বার্গার এবং @ ব্লুপ্রিন্টক্রিসের মন্তব্যগুলিকে জোর দিতে চাই: 1উদাহরণস্বরূপ আমি যদি সংখ্যাটি পার্স করি তবে আমার কাছে এখনও একটি বৈধ তারিখ থাকবে Mon Jan 01 2001 00:00:00যা ফলস্বরূপ একটি তারিখ, তবে আমার আবেদনের প্রয়োজনে এটি সম্পূর্ণরূপে অকেজো । সুতরাং, আমার ক্ষেত্রে কমপক্ষে আরও কিছু ইনপুট বৈধতা প্রয়োজন। এই উত্তরটি একটি dateObjectনয় একটি বৈধতা দেয় Date!
dnhyde

264

পরিবর্তে new Date()আপনার ব্যবহার করা উচিত:

var timestamp = Date.parse('foo');

if (isNaN(timestamp) == false) {
  var d = new Date(timestamp);
}

Date.parse()০১ / জানুয়ারী / ১৯ 1970০ সাল থেকে একটি মিলসেকেন্ডের প্রতিনিধিত্ব করে এমন একটি পূর্ণসংখ্যা একটি টাইমস্ট্যাম্প দেয়। NaNসরবরাহিত তারিখের স্ট্রিংটিকে পার্স করতে না পারলে এটি ফিরে আসবে ।


119
-1 ডান্নো কেন এটিতে এত বেশি ভোট রয়েছে, Date.parseতা বাস্তবায়ন নির্ভরতা এবং অবশ্যই সাধারণ তারিখের স্ট্রিংগুলিকে পার্স করার জন্য বিশ্বাসযোগ্য নয়। কোন একক বিন্যাসে জনপ্রিয় ব্রাউজার সঠিকভাবে পার্স করা হয়, অনেক কম সমস্ত ব্যবহারে (যদিও অবশেষে ISO8601 ফরম্যাট ES5 উল্লেখিত ঠিক হতে উচিত)।
রবিজি

1
আপনি যদি এটি ব্যবহার করেন তবে new Date('foo')এটি মূলত Date.parse('foo')পদ্ধতির সাথে সমান । দেখুন: ডেভেলপার.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েবে / জাভা স্ক্রিপ্ট / রেফারেন্স / So সুতরাং @ রবজি যা বলেছিল, এটি এটিও প্রযোজ্য।
স্বর্ণড্রাগন 7007

2
এই পরীক্ষাটি ক্রোমে ব্যর্থ হবে। উদাহরণস্বরূপ, Chrome এ ডেট.পার্স ('AAA-0001') আমাকে একটি নম্বর দেয়।
নিক

ব্যর্থ হয়েছে ... সমস্ত সংখ্যার মান সনাক্ত করুন
হোস বুধ

109

আপনি একটি বৈধতা পরীক্ষা করতে পারবেন Dateবস্তুর dমাধ্যমে

d instanceof Date && isFinite(d)

ক্রস-ফ্রেম সমস্যা এড়াতে, কেউ instanceofচেকটি প্রতিস্থাপন করতে পারে

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

বোরগরের উত্তরেরgetTime() মতো কল করা অপ্রয়োজনীয় এবং উভয়ই সংখ্যায় সুস্পষ্টভাবে সংখ্যায় রূপান্তর করে।isNaN()isFinite()


ক্রোমে এটি চেষ্টা করুন - অবজেক্ট.প্রোটোটাইপ.টোস্ট্রিং.ক্যাল (নতুন তারিখ ("2013-07-09T19: 07: 9Z"))। এটি "[অবজেক্টের তারিখ]" ফিরিয়ে দেবে। আপনার মতে, অতএব, "2013-07-09T19: 07: 9Z", একটি বৈধ তারিখ হওয়া উচিত। তবে তা নয়। আপনি ক্রোমে আবার var তারিখের মাধ্যমে তা যাচাই করতে পারবেন = নতুন তারিখ ("2013-07-09T19: 07: 9Z"); তারিখএসটিআর এটি অবৈধ তারিখ ফিরে আসবে।
টিনটিন

2
@ টিনটিন: এটাই যা isFinite()- চেকটির অংশের toString.call()প্রতিস্থাপনinstanceof
ক্রিস্টফ

অ-ইংলিশ ব্রাউজারগুলির সাথে '[অবজেক্টের তারিখ]' এর সাথে তুলনা করা হবে? আমি এটাকে সন্দেহ করি.
ক্রিস্টিয়ানপ

2
@ ক্রিস্টিয়ানপ আসলে এটি সম্ভবত এটি করবে এবং সম্ভবত এটি ইসমাস্ক্রিপ্ট অনুচ্ছেদের একটি অংশ। তবে, হ্যাঁ, এটি কুরুচিপূর্ণ বলে মনে হচ্ছে।
বিনকি

আমার কাছে এখানে প্রথম পদ্ধতির সবচেয়ে ভাল বিকল্প, যদিও আমি নিশ্চিত না যে isFiniteওভার ব্যবহারের কোনও আসল-জগত সুবিধা আছে কিনা isNaN(উভয়ই ঠিকঠাক কাজ করে Date(Infinity))। উপরন্তু, যদি আপনি বিপরীত অবস্থা চাই, একটু সহজ পায়: if (!(date instanceof Date) || isNaN(date))
অ্যান্ড্রু

86

আমার সমাধানটি আপনি বৈধ তারিখের অবজেক্টটি পান কিনা তা খতিয়ে দেখার জন্য:

বাস্তবায়ন

Date.prototype.isValid = function () {
    // An invalid date object returns NaN for getTime() and NaN is the only
    // object not strictly equal to itself.
    return this.getTime() === this.getTime();
};  

ব্যবহার

var d = new Date("lol");

console.log(d.isValid()); // false

d = new Date("2012/09/11");

console.log(d.isValid()); // true

28
isNaNNaN
orip

1
এবং তবুও, আপনি সর্বদা লোকদের নিজের সংস্করণগুলি লিখতে খুঁজে পান :) ডকুমেন্টক্লাউড.
অ্যাশ ক্লার্ক

4
যেহেতু আমি আন্ডারস্কোর.জেএসসকে সম্মান করি এটি কিছু গবেষণা প্রেরণা দেয়। isNaN("a") === trueযখন ("a" !== "a") === false। এটি সম্পর্কে চিন্তা করা মূল্যবান। +1

8
আমি এখানে 3 টি মূল সমাধানের সন্ধান পেয়েছি performance অভিনন্দন, আপনি বিজয়ী! jsperf.com/detecting-an-inuthor-date
zVictor

2
@ অলি এটি একটি বৈধ তারিখ অবজেক্ট। new Date("02-31-2000") // Thu Mar 02 2000 00:00:00 GMT+0000 (GMT Standard Time)। আপনি যদি তারিখ নির্মাতার কাছে স্ট্রিং দিয়ে যাচ্ছেন তবে একটি নির্ভরযোগ্য ফলাফল পেতে আপনাকে অবশ্যই একটি মানক স্ট্রিংয়ে পাস করতে হবে। বিশেষত, "স্ট্রিংটি তারিখ.পার্স () পদ্ধতি দ্বারা স্বীকৃত বিন্যাসে হওয়া উচিত"। বিকাশকারী.মোজিলা.আর.ইন-
অ্যাশ ক্লার্ক

71

বৈধ তারিখ চেক করার জন্য সংক্ষিপ্ত উত্তর

if(!isNaN(date.getTime()))

2
সমস্যাটি কেবল যদি তারিখটি তারিখের মতো না হয়; আপনি একটি জেএস ত্রুটি পান।
অ্যান্ড্রু

@ অ্যান্ড্রু আপনার তারিখ অবজেক্ট তৈরি করতে হবে এবং আপনার যদি ইতিমধ্যে কোনও অবজেক্ট থাকে তবে ব্যবহার করুনdate && !isNaN(date.getTime())
abhirathore2006

এটি এখনও dateতারিখের মতো না হলে আপনাকে একটি জেএস ত্রুটি দেয় । উদাহরণস্বরূপ: var date = 4; date && !isNaN(date.getTime());
অ্যান্ড্রু

@ অ্যান্ড্রু ব্যবহার date instanceof Date && !isNaN(date.getTime())
অভিহিতোর2006

3
ঠিক আছে, 8 বছর আগে থেকে অন্যান্য উত্তর মত। : পি স্ট্যাকওভারফ্লো.com
অ্যান্ড্রু 17

45

আপনি কেবল moment.js ব্যবহার করতে পারেন

এখানে একটি উদাহরণ:

var m = moment('2015-11-32', 'YYYY-MM-DD');
m.isValid(); // false

বৈধতা অধ্যায় ডকুমেন্টেশন বেশ স্পষ্ট।

এবং এছাড়াও, নিম্নলিখিত পার্সিং পতাকাগুলির ফলে একটি অবৈধ তারিখ হয়:

  • overflow: একটি তারিখের ক্ষেত্রের ওভারফ্লো, যেমন 13 তম মাস, মাসের 32 তম দিন (বা অবধি 31 ফেব্রুয়ারী), বছরের 367 তম দিন ইত্যাদিতে ওভারফ্লো অবৈধ ইউনিটের সূচক ধারণ করে #inuthorAt (নীচে দেখুন) সাথে মেলে; -1 অর্থ কোনও ওভারফ্লো নয়।
  • invalidMonth: একটি অবৈধ মাসের নাম, যেমন মুহুর্তের ('মার্চ ফেব্রুয়ারী', 'এমএমএমএম');। এতে অবৈধ মাসের স্ট্রিং থাকে বা অন্যথায় শূন্য থাকে।
  • empty: একটি ইনপুট স্ট্রিং যাতে পার্সেবল কিছুই থাকে না যেমন মুহুর্ত ('এটি বাজে কথা');। বুলিয়ান।
  • প্রভৃতি

সূত্র: http://momentjs.com/docs/


6
চূড়ান্ত সমাধান, প্রয়োগ করা অত্যন্ত সহজ, যে কোনও বিন্যাসের সাথে কাজ করে (আমার কেসটি ডিডি / এমএম / ইয়াই), লিপ বছরগুলিও জানে এবং অবৈধ তারিখগুলি (যেমন ২৯/০২/২০১৫) নিজে বৈধ হিসাবে রূপান্তর করে না (যেমন, 30/03/2015)। ফরমেড ডিডি / এমএম / ইয়াহিতে একটি তারিখ পরীক্ষা করতে আমার কেবলমাত্র ব্যবহার করতে হয়েছিলmoment("11/06/1986", "DD/MM/YYYY").isValid();
রাফায়েল মেরলিন

3
মুহুর্তের এই ব্যবহারটি অবচিত করা হয়েছে :(
জেমস সামনার্স

2
এই ব্যবহার হ্রাস করা হয়নি। বিন্যাসের স্ট্রিং ছাড়া কলিং মুহুর্ত (ইনপুট) অবমূল্যায়ন করা হয় (যদি না ইনপুটটি আইএসও ফর্ম্যাট না হয়)।
চেত

2
অনেক তারিখ প্রক্রিয়া করার সময় এই পদ্ধতিটি অত্যন্ত ধীর হতে পারে। এই ক্ষেত্রে একটি রেজেক্স ব্যবহার করা ভাল।
গ্রিড ট্রেকোর

2
Moment.js এর ব্যবহার সহজ হতে পারে তবে এটি একটি প্রচুর ওভারহেড। এই গ্রন্থাগারটি বিশাল। আমি আপনার উত্তরকে অগ্রাহ্য করেছি।
মিক

38

উল্লেখ করতে চাই যে jQuery UI তারিখপিকার উইজেটের একটি খুব ভাল তারিখ যাচাইকারী ইউটিলিটি পদ্ধতি রয়েছে যা বিন্যাস এবং বৈধতার জন্য পরীক্ষা করে (যেমন, 01/33/2013 তারিখ অনুমোদিত নয়)।

এমনকি আপনি যদি নিজের পৃষ্ঠায় ইউআই উপাদান হিসাবে ডেটপিকার উইজেটটি ব্যবহার করতে না চান তবে আপনি সর্বদা এটির .js গ্রন্থাগারটি আপনার পৃষ্ঠায় যুক্ত করতে পারেন এবং তারপরে আপনি যে মানটি যাচাই করতে চান তা পেরিয়ে যাচাইকরণ পদ্ধতিতে কল করতে পারেন। জীবনকে আরও সহজ করার জন্য, এটি ইনপুট হিসাবে একটি স্ট্রিং নেয়, কোনও জাভাস্ক্রিপ্টের তারিখ অবজেক্ট নয়।

দেখুন: http://api.jqueryui.com/datepicker/

এটি কোনও পদ্ধতি হিসাবে তালিকাভুক্ত নয়, তবে এটি সেখানে রয়েছে - একটি ইউটিলিটি ফাংশন হিসাবে। "পার্সেটেট" এর জন্য পৃষ্ঠাটি অনুসন্ধান করুন এবং আপনি পাবেন:

d .datepicker.parseDate (ফর্ম্যাট, মান, সেটিংস) - একটি নির্দিষ্ট বিন্যাসের সাথে স্ট্রিং মান থেকে একটি তারিখ বের করুন।

ব্যবহারের উদাহরণ:

var stringval = '01/03/2012';
var testdate;

try {
  testdate = $.datepicker.parseDate('mm/dd/yy', stringval);
             // Notice 'yy' indicates a 4-digit year value
} catch (e)
{
 alert(stringval + ' is not valid.  Format must be MM/DD/YYYY ' +
       'and the date value must be valid for the calendar.';
}

(তারিখের ফর্ম্যাটগুলি নির্দিষ্ট করে সম্পর্কিত আরও তথ্য http://api.jqueryui.com/datepicker/#utility-parseDate এ পাওয়া যায় )

উপরের উদাহরণে, আপনি সতর্কতা বার্তাটি দেখতে পাবেন না কারণ '01 / 03/2012 'নির্দিষ্ট ফর্ম্যাটে ক্যালেন্ডার-বৈধ তারিখ। তবে আপনি যদি 'স্ট্রিংওয়াল' '13 / 04/2013 'এর সমান করেন তবে উদাহরণস্বরূপ, আপনি সতর্কতা বার্তাটি পাবেন কারণ '13 / 04/2013' মানটি ক্যালেন্ডার-বৈধ নয়।

যদি পাস-ইন স্ট্রিংয়ের মানটি সফলভাবে পার্স করা হয় তবে 'টেস্টডেট' এর মান জাভাস্ক্রিপ্টের তারিখের অবজেক্ট যা পাস-ইন স্ট্রিংয়ের মান উপস্থাপন করে। যদি তা না হয় তবে এটি সংজ্ঞায়িত হবে।


3
ইংরেজী / স্থানীয় স্থানীয় তারিখের ফর্ম্যাটগুলির সাথে প্রথম উত্তর কাজ করার জন্য আপভোট।
কুড়াল

26

আমি ক্রিস্টোফের মতামতটি সত্যিই পছন্দ করেছি (তবে এটির পক্ষে ভোট দেওয়ার মতো খ্যাতি আমার নেই)। আমার ব্যবহারের জন্য, আমি জানি আমার সর্বদা একটি তারিখ অবজেক্ট থাকবে তাই আমি একটি বৈধ () পদ্ধতি দিয়ে সবেমাত্র তারিখ বাড়িয়েছি।

Date.prototype.valid = function() {
  return isFinite(this);
}

এখন আমি এটি লিখতে পারি এবং কোডে কেবলমাত্র চিরস্থায়ী পরীক্ষা করা তার চেয়ে অনেক বেশি বর্ণনামূলক ...

d = new Date(userDate);
if (d.valid()) { /* do stuff */ }

10
প্রোটোটাইপ বাড়ানো? এটি একটি বড় জাভাস্ক্রিপ্ট নং!
জসদীপ খালসা

isFiniteআমার পক্ষে নিখুঁতভাবে কাজ করার কারণে উত্সাহ দেওয়া । তবে হ্যাঁ, প্রোটোটাইপটি প্রসারিত করার অর্থহীন। !isFiniteএকটি উপর Dateযে ফেলবো Dateহয় Invalid Date। আমার প্রসঙ্গটি নোডের মধ্যেও লক্ষণীয়।
স্টাহাউজ


17

আপনি এই স্কিরিপটির সাথে txDate.value এর বৈধ বিন্যাসটি পরীক্ষা করতে পারেন। যদি এটি ভুল ফর্ম্যাটে থাকে তবে তারিখের আদেশটি নজরে না আসে এবং তারিখটি বাতিল হয়।

 var dt = new Date(txtDate.value)
 if (isNaN(dt))

এবং @ এমআইএফ এর সংক্ষিপ্ত উপায়ে পরামর্শ দেওয়া হয়েছে

 if(isNaN(new Date(...)))

isNaN (নতুন তারিখ (...)) - সহজ এবং সংক্ষিপ্ত পদ্ধতি
MiF

1
@ এমআইএফ হ্যাঁ, আমি আপনার পরামর্শটি দিয়ে আমার উত্তর আপডেট করছি;) ধন্যবাদ
ইউসেফেরি

16

আমি বছর, মাস এবং তারিখের মানগুলি যাচাই করতে নীচের কোডটি ব্যবহার করি।

function createDate(year, month, _date) {
  var d = new Date(year, month, _date);
  if (d.getFullYear() != year 
    || d.getMonth() != month
    || d.getDate() != _date) {
    throw "invalid date";
  }
  return d;
}

বিশদ জন্য, জাভাস্ক্রিপ্ট চেক তারিখ দেখুন


strব্যবহার করা হচ্ছে না।
সামিস

12

ইতিমধ্যে এখানে অনেক জটিল উত্তর, তবে একটি সরল রেখা যথেষ্ট (ES5):

Date.prototype.isValid = function (d) { return !isNaN(Date.parse(d)) } ;

বা এমনকি ES6 এ:

Date.prototype.isValid = d => !isNaN(Date.parse(d));

1
এমডিএন থেকে: "তারিখ.পার্স () পদ্ধতিটি একটি তারিখের একটি স্ট্রিং উপস্থাপনা পার্স করে এবং 1 জানুয়ারী, 1970, 00:00:00 ইউটিসি বা এনএএন ... থেকে মিলসেকেন্ডের সংখ্যা ফেরত দেয় ..." সুতরাং এর মাধ্যমে একটি সম্ভাব্য তারিখ চালানো হচ্ছে ফাংশনটি একটি পূর্ণসংখ্যা বা NaN দেয়। তারপরে isNaN () ফাংশনটি একটি পরিষ্কার বুলিয়ান দেয় যা আপনাকে জানায় যে আসল মানটি বৈধ তারিখের বস্তু ছিল কিনা। এটি একটি স্পট চেক করার জন্য যথেষ্ট, তবে উপরের উদাহরণটি আপনার প্রোগ্রামের কার্যকারিতা সহজেই উপলব্ধ এবং পঠনযোগ্য করার জন্য ডেট অবজেক্টের সাথে এই পদ্ধতিটি সংযুক্ত করে।
ম্যাক্স ওয়াইল্ডার

যদি ডি বুলিয়ান হয় তবে আপনি 0 বা 1 পাবেন যা নান নয়!
ডেভ্যাকআপ

@ ড্যাভকআপটি স্রেফ ব্যবহার করে পরীক্ষা করা হয়েছে Date.parse(true), আমি সঠিকভাবে একটি এনএএন পেয়েছি।
সেবাস্তিয়ান এইচ।

12

আমি কিছু উত্তর দেখেছি যা এই ছোট স্নিপেটের কাছে আসল।

জাভাস্ক্রিপ্ট উপায়:

function isValidDate(dateObject){ return new Date(dateObject).toString() !== 'Invalid Date'; }
isValidDate(new Date('WTH'));

টাইপস্ক্রিপ্ট উপায়:

const isValidDate = dateObject => new Date(dateObject ).toString() !== 'Invalid Date';
isValidDate(new Date('WTH'));

1
আমি কিছু মিস করছি কিনা তা নিশ্চিত নন তবে নতুন তারিখটি () দুবার অর্থহীন নয় কি?
জন ক্যাটমুল

2
পরেরটির টাইপস্ক্রিপ্টের সাথে কোনও সম্পর্ক নেই । এটি পুরোপুরি বৈধ জেএস।
হ্যাকেল

9

চমৎকার সমাধান! সহায়ক ফাংশনগুলির আমার লাইব্রেরিতে অন্তর্ভুক্ত, এখন এটির মতো দেখাচ্ছে:

Object.isDate = function(obj) {
/// <summary>
/// Determines if the passed object is an instance of Date.
/// </summary>
/// <param name="obj">The object to test.</param>

    return Object.prototype.toString.call(obj) === '[object Date]';
}

Object.isValidDate = function(obj) {
/// <summary>
/// Determines if the passed object is a Date object, containing an actual date.
/// </summary>
/// <param name="obj">The object to test.</param>

    return Object.isDate(obj) && !isNaN(obj.getTime());
}

9

এটি কেবল আমার জন্য কাজ করেছে

new Date('foo') == 'Invalid Date'; //is true

তবে এটি কার্যকর হয়নি

new Date('foo') === 'Invalid Date'; //is false

5
আমি বিশ্বাস করি এটি ব্রাউজার নির্ভর।
ব্যারিপিকার

@ বাররিপিকার এই ব্রাউজার নির্ভর কি বলতে চান?
আজিল ও।

আপনি এটি করতে পারেন: `${new Date('foo')}` === 'Invalid Date'
ড্যানিয়েল ভ্রুট

9

Angular.js প্রকল্পের জন্য আপনি ব্যবহার করতে পারেন:

angular.isDate(myDate);

3
এটি কোনও অবৈধ তারিখের সাথে সূচনা হওয়া কোনও তারিখের অবজেক্টের পরীক্ষার সময় সত্য হয়।
chেচেত্রি

6

2/31/2012 এর মতো কোনও তারিখ বৈধ করার চেষ্টা করার সময় এই উত্তরগুলির কোনওটিই আমার পক্ষে কার্যকর হয়নি (সাফারি .0.০-তে পরীক্ষিত), তবে, ৩১ এর বেশি তারিখের চেয়ে কোনও তারিখের চেষ্টা করার সময় তারা ভাল কাজ করে।

তাই আমাকে কিছুটা জোর করে চাপাতে হয়েছিল। তারিখটি ধরে রেখে ফরম্যাটে mm/dd/yyyy। আমি @ ব্রুক্স উত্তরটি ব্যবহার করছি:

Date.prototype.valid = function() {
    return isFinite(this);
}    

function validStringDate(value){
    var d = new Date(value);
    return d.valid() && value.split('/')[0] == (d.getMonth()+1);
}

validStringDate("2/29/2012"); // true (leap year)
validStringDate("2/29/2013"); // false
validStringDate("2/30/2012"); // false

(নতুন তারিখ ('২/৩০/২০১৪'))। বৈধ () সত্য ফেরায়
আন্দ্রে ফিগুয়েরেদো

1
কিছুক্ষণ হয়ে গেছে আমি এর জবাব দিয়েছি তবে আপনার && value.split('/')[0] == (d.getMonth()+1);
ডেটর

ব্যবহারটি new Date('string date')সমান Date.parse('string date'), দেখুন: বিকাশকারী.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েব / জাভা স্ক্রিপ্ট / রেফারেন্স / so যাতে আপনি মিথ্যা সত্য বা মিথ্যা মান পেতে পারেন।
স্বর্ণড্রাগন 7007

5

উপরের সমাধানগুলির কোনওটিই আমার পক্ষে কাজ করে নি তবে যা কাজ করে তা হল

function validDate (d) {
        var date = new Date(d);
        var day = ""+date.getDate();
        if( day.length == 1)day = "0"+day;
        var month = "" +( date.getMonth() + 1);
        if( month.length == 1)month = "0"+month;
        var year = "" + date.getFullYear();

        return ((month + "/" + day + "/" + year) == d);
    }

উপরের কোডটি দেখতে পাবে যে জেএস 02/31/2012 কে 03/02/2012 এ দেয় যে এটি বৈধ নয়


3
ঠিক আছে, তবে এই পরীক্ষাগুলি যদি স্ট্রিংয়ের একটি এম / ডি / ওয়াই ফর্ম্যাটে তারিখ হয় তবে "বৈধ ও অবৈধ তারিখের অবজেক্টের মধ্যে পার্থক্য" নয়। এটি আসলে কী তা নিয়ে প্রশ্ন নয়।
বোরগার

ফর্ম্যাটের বিপরীতে এটি পরীক্ষা করা হয়েছে তার কারণ পরীক্ষা করার পরে তারিখটি পরিবর্তন হয়েছে কিনা তা পরীক্ষা করা
জন

ওপি কি কোনও বুলিয়ান ফেরত দেওয়ার জন্য কোনও পদ্ধতি জিজ্ঞাসা করছে না, বিন্যাসিত স্ট্রিং নয়?
ব্যারিপিকার

1
নমুনা কোডটি একটি বুলিয়ান ফেরত দেয়, ফর্ম্যাটিং কিছু অবৈধ মামলার জন্য পরীক্ষায় অংশ নেয়।
জন


4

আমি এই ফাংশন লিখেছি। এটি একটি স্ট্রিং প্যারামিটারটি পাস করুন এবং এটি নির্ধারণ করবে এটি বৈধ তারিখ কিনা এই ফর্ম্যাট "dd / MM / yyyy" এর উপর ভিত্তি করে না।

এখানে একটি পরীক্ষা

ইনপুট: "হাহাহা", আউটপুট: মিথ্যা।

ইনপুট: "29/2/2000", আউটপুট: সত্য।

ইনপুট: "29/2/2001", আউটপুট: মিথ্যা।

function isValidDate(str) {
    var parts = str.split('/');
    if (parts.length < 3)
        return false;
    else {
        var day = parseInt(parts[0]);
        var month = parseInt(parts[1]);
        var year = parseInt(parts[2]);
        if (isNaN(day) || isNaN(month) || isNaN(year)) {
            return false;
        }
        if (day < 1 || year < 1)
            return false;
        if(month>12||month<1)
            return false;
        if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day > 31)
            return false;
        if ((month == 4 || month == 6 || month == 9 || month == 11 ) && day > 30)
            return false;
        if (month == 2) {
            if (((year % 4) == 0 && (year % 100) != 0) || ((year % 400) == 0 && (year % 100) == 0)) {
                if (day > 29)
                    return false;
            } else {
                if (day > 28)
                    return false;
            }      
        }
        return true;
    }
}

4

Date.prototype.toISOStringRangeErrorঅবৈধ তারিখগুলিতে (কমপক্ষে ক্রোমিয়াম এবং ফায়ারফক্সে) ছুড়ে দেয় । আপনি এটিকে বৈধতার মাধ্যম হিসাবে ব্যবহার করতে পারেন এবং এর isValidDateমতো (ইএএফপি) প্রয়োজন নেই। অন্যথায় এটি:

function isValidDate(d)
{
  try
  {
    d.toISOString();
    return true;
  }
  catch(ex)
  {
    return false;    
  }    
}

1
দেখে মনে হচ্ছে এটি একমাত্র ফাংশন যা ECMA-262 সংজ্ঞা দ্বারা ত্রুটি ছুড়ে ফেলে। 15.9.5.43 তারিখ.প্রোটোটাইপ.আইটিআইএসএসআর্টিং () এই ফাংশনটি একটি স্ট্রিং মান দেয় যা এই তারিখের অবজেক্ট দ্বারা প্রতিনিধিত্ব করে সময় উপস্থাপন করে। স্ট্রিংয়ের ফর্ম্যাটটি হ'ল তারিখের স্ট্রিং বিন্যাসটি 15.9.1.15 এ সংজ্ঞায়িত করা হয়। সমস্ত ক্ষেত্র স্ট্রিংয়ে উপস্থিত রয়েছে। সময় অঞ্চলটি সর্বদা ইউটিসি থাকে, প্রত্যয়টি জেড দ্বারা চিহ্নিত করা হয় this যদি এই বস্তুর সময় মান সীমাবদ্ধ না হয় তবে একটি রেঞ্জেরর ব্যতিক্রম নিক্ষেপ করা হয়।
হেনরি লিউ

3

বোরগারের পদ্ধতির দ্বারা অনুপ্রাণিত হয়ে আমি নিশ্চিত হয়েছি যে কোডটি কেবল তারিখটিকে বৈধতা দেয় না, তবে আসলে এটি নিশ্চিত করে যে তারিখটি একটি আসল তারিখ, যার অর্থ 31/09/2011 এবং 29/02/2011 এর মতো তারিখ অনুমোদিত নয় allowed

function(dateStr) {
    s = dateStr.split('/');
    d = new Date(+s[2], s[1]-1, +s[0]);
    if (Object.prototype.toString.call(d) === "[object Date]") {
        if (!isNaN(d.getTime()) && d.getDate() == s[0] && 
            d.getMonth() == (s[1] - 1)) {
            return true;
        }
    }
    return "Invalid date!";
}

তবে ... উপরের পদ্ধতিগুলি (@ বোরগার এবং অন্যান্য) ইতিমধ্যে এই ধরণের বৈধতা পরীক্ষা করে ... আমি সমস্যাটি পেতে পারি না।
ব্লু করুন

বোরগার এর নয় - তার উত্তরের নিজস্ব মন্তব্য দেখুন।
EML

1
এই সমাধানটি তখনই কার্যকর হয় যখন আপনার দেশ dd/MM/yyyyস্বরলিপি ব্যবহার করে । এছাড়াও, এটি trueকার্যকর হবে এবং 'Invalid date!'এটি না হলে এটি ফিরে আসে, কেবল 1 প্রকারের থেকে ভাল return
আরপুন

3

আমি সেই পরীক্ষার চারপাশে সেরা পারফরম্যান্সের ফলাফলগুলি মিলিত করেছিলাম যদি কোনও প্রদত্ত বস্তু:

ফলাফল নিম্নলিখিত:

function isValidDate(input) {
  if(!(input && input.getTimezoneOffset && input.setUTCFullYear))
    return false;

  var time = input.getTime();
  return time === time;
};

2

উভয় ক্ষেত্রের বৈধ তারিখ কিনা তা সনাক্ত করার জন্য স্ট্রিংয়ের তারিখ অবজেক্টটি আরও সহজ এবং নির্ভরযোগ্য উপায়। উদাহরণস্বরূপ, আপনি তারিখ ইনপুট ক্ষেত্রে এটি "-------" লিখুন। উপরের উত্তরগুলির কয়েকটি কার্যকর হবে না।

jQuery.validator.addMethod("greaterThan", 

    function(value, element, params) {
        var startDate = new Date($(params).val());
        var endDate = new Date(value);

        if(startDate.toString() === 'Invalid Date' || endDate.toString() === 'Invalid Date') {
            return false;
        } else {
            return endDate > startDate;
        }
    },'Must be greater than {0}.');

2

নির্বাচিত উত্তরটি দুর্দান্ত, এবং আমি এটিও ব্যবহার করছি। তবে, যদি আপনি ব্যবহারকারীর তারিখ ইনপুটকে বৈধতা দেওয়ার উপায় খুঁজছেন, আপনার সচেতন হওয়া উচিত যে তারিখ অবজেক্টটি বৈধ ব্যক্তির মধ্যে অবৈধ নির্মাণের যুক্তি হিসাবে উপস্থিত হতে পারে তা তৈরি করার বিষয়ে খুব দৃ pers় থাকে। নিম্নলিখিত ইউনিট পরীক্ষার কোডটি পয়েন্টটি তুলে ধরে:

QUnit.test( "valid date test", function( assert ) {
  //The following are counter-examples showing how the Date object will 
  //wrangle several 'bad' dates into a valid date anyway
  assert.equal(isValidDate(new Date(1980, 12, 15)), true);
  d = new Date();
  d.setFullYear(1980);
  d.setMonth(1);
  d.setDate(33);
  assert.equal(isValidDate(d), true);
  assert.equal(isValidDate(new Date(1980, 100, 150)), true);
  //If you go to this exterme, then the checker will fail
  assert.equal(isValidDate(new Date("This is junk")), false);
  //This is a valid date string
  assert.equal(isValidDate(new Date("November 17, 1989")), true);
  //but is this?
  assert.equal(isValidDate(new Date("November 35, 1989")), false);  
  //Ha!  It's not.  So, the secret to working with this version of 
  //isValidDate is to pass in dates as text strings... Hooboy
  //alert(d.toString());
});

2
function isValidDate(strDate) {
    var myDateStr= new Date(strDate);
    if( ! isNaN ( myDateStr.getMonth() ) ) {
       return true;
    }
    return false;
}

এটিকে কল করুন

isValidDate(""2015/5/2""); // => true
isValidDate(""2015/5/2a""); // => false

2

শীর্ষ রেট দেওয়া উত্তরের ভিত্তিতে একটি প্রস্তুত ফাংশন:

  /**
   * Check if date exists and is valid.
   *
   * @param {String} dateString Date in YYYY-mm-dd format.
   */
  function isValidDate(dateString) {
  var isValid = false;
  var date;

  date =
    new Date(
      dateString);

  if (
    Object.prototype.toString.call(
      date) === "[object Date]") {

    if (isNaN(date.getTime())) {

      // Date is unreal.

    } else {
      // Date is real if month and day match each other in date and string (otherwise may be shifted):
      isValid =
        date.getUTCMonth() + 1 === dateString.split("-")[1] * 1 &&
        date.getUTCDate() === dateString.split("-")[2] * 1;
    }
  } else {
    // It's not a date.
  }

  return isValid;
}

2

সহজ এবং মার্জিত সমাধান:

const date = new Date(`${year}-${month}-${day} 00:00`)
const isValidDate = (Boolean(+date) && date.getDate() == day)

উত্স:

[1] https://medium.com/@esganzerla/simple-date-ificationsation-with-javascript-caea0f71883c

[2] জাভাস্ক্রিপ্টে নতুন তারিখে () ভুল তারিখ দেখানো হয়েছে


1
date.getDate() == dayতারিখটি বৈধ কিনা তা নির্ধারণের জন্য অপর্যাপ্ত। আসল তারিখের ফর্ম্যাটটি কিছু বাস্তবায়নে একটি অবৈধ তারিখ ফিরিয়ে দেবে তারিখটি বৈধ কিনা। এছাড়াও "1970-01-01 00:00" সঠিকভাবে পার্স করা হলে মিথ্যা (যেমন Boolean(+new Date("1970-01-01"))মিথ্যা প্রত্যাবর্তন করে) ফিরে আসবে ।
রবজি

সতর্কতা: এটি সাফারিতে কাজ করবে না
প্রাণবন্ত

আপনি সাফারিটিতে কাজ করবে যদি আপনি const date = new Date(year, month, day); নোটটি যে ফর্ম্যাটটি 0 টি এভাবে সূচকযুক্ত ব্যবহার করেন তাই এটি সঠিকভাবে রেখার জন্য আপনাকে একটি বিয়োগ করতে হতে পারে।
প্রাণবন্ত

1

আমি মনে করি এর কিছু একটি দীর্ঘ প্রক্রিয়া। আমরা এটি নীচে প্রদর্শিত হিসাবে সংক্ষিপ্ত কাটা করতে পারেন:

 function isValidDate(dateString) {
        debugger;
        var dateStringSplit;
        var formatDate;

        if (dateString.length >= 8 && dateString.length<=10) {
            try {
                dateStringSplit = dateString.split('/');
                var date = new Date();
                date.setYear(parseInt(dateStringSplit[2]), 10);
                date.setMonth(parseInt(dateStringSplit[0], 10) - 1);
                date.setDate(parseInt(dateStringSplit[1], 10));

                if (date.getYear() == parseInt(dateStringSplit[2],10) && date.getMonth()+1 == parseInt(dateStringSplit[0],10) && date.getDate() == parseInt(dateStringSplit[1],10)) {
                    return true;
                }
                else {
                    return false;
                }

            } catch (e) {
                return false;
            }
        }
        return false;
    }

3
প্রশ্নটি কীভাবে অবৈধ তারিখের উদাহরণগুলি খুঁজে পেতে পারে তার জন্য স্ট্রিং নয় এবং এর বাইরেও জিজ্ঞাসা করা হয়েছিল: কে বলে যে একটি তারিখ ফরওয়ার্ড-স্ল্যাশ ছাড়া অন্য কিছু দ্বারা বিস্মৃত করা যায় না?
জন z

1

কোনও তারিখের 1 ভিত্তিক উপাদানগুলির জন্য:

var is_valid_date = function(year, month, day) {
    var d = new Date(year, month - 1, day);
    return d.getFullYear() === year && (d.getMonth() + 1) === month && d.getDate() === day
};

পরীক্ষা:

    is_valid_date(2013, 02, 28)
&&  is_valid_date(2016, 02, 29)
&& !is_valid_date(2013, 02, 29)
&& !is_valid_date(0000, 00, 00)
&& !is_valid_date(2013, 14, 01)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.