ජාවාස්ක්‍රිප්ට් හි “අවලංගු දිනයක්” සොයා ගැනීම


1534

JS හි වලංගු සහ අවලංගු දින වස්තු අතර වෙනස පැවසීමට මා කැමතිය, නමුත් කෙසේ දැයි සිතාගත නොහැක:

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දින නූල් විග්‍රහ කිරීම සඳහා අළු නිර්දේශ කර ඇති අතර, එමඟින් දිනය නූල වලංගු දැයි පරීක්ෂා කිරීමට බලයලත් ක්‍රමයක් ලබා දේ.
  • මා කැමති නම්, හැකි නම්, මගේ ඒපීඅයි දිනය නිදසුනක් පිළිගෙන එය වලංගු ද නැද්ද යන්න පරීක්ෂා කිරීමට / තහවුරු කිරීමට හැකි වීම. බෝර්ගර්ගේ විසඳුම එය කරයි, නමුත් මට එය බ්‍රව්සර් හරහා පරීක්ෂා කිරීමට අවශ්‍යය. ඊටත් වඩා අලංකාර ක්‍රමයක් තිබේදැයි මම කල්පනා කරමි.
  • මගේ API පිළිගැනීමේ Dateඅවස්ථා කිසිසේත් නොතිබීම ගැන Ash ෂ් මට සලකා බැලීය , මෙය වලංගු කිරීම පහසුම වේ.
  • බෝර්ගර් යෝජනා කළේ Dateනිදසුනක් සඳහා පරීක්‍ෂා කර , පසුව Dateකාල අගය පරීක්ෂා කිරීමයි . දිනය අවලංගු නම්, කාල අගය වේ NaN. මම ECMA-262 සමඟ පරීක්ෂා කළ අතර මෙම හැසිරීම ප්‍රමිතියෙන් යුක්ත වන අතර එය මා සොයන දේමයි.

18
ශ්‍රිතයේ සිරුර වෙනස් කිරීමෙන් ඔබට if ප්‍රකාශය ඉවත් කළ හැකිය:return ( Object.prototype.toString.call(d) === "[object Date]" && !isNaN(d.getTime()) );
ස්ටයිෆල්

3
ystyfle - එය ශෛලීය මනාපයක් යැයි අනුමාන කරන්න: සමානාත්මතා තර්කනයෙන් වර්ග චෙක්පත වෙන් කිරීම වඩාත් පැහැදිලි බව මට පෙනේ.
orip

26
@orip කතිකාව යනු ප්‍රශ්න වලින් දැඩි ලෙස අධෛර්යමත් වන දෙයයි. එය පිටුපස ඇති තාර්කිකත්වය දැන ගැනීමට කරුණාකර අදාළ මෙටා මාතෘකා වෙත යොමු වන්න. ප්‍රශ්නයට තමන්ගේම ප්‍රශ්නයකට පිළිතුරක් තැබීම අඩවි ප්‍රතිපත්තියට පටහැනිය. OTOH, ප්‍රතිචාර වලට ස්තූති කිරීම සහ ඔබේ පිළිතුරෙහි "සංස්කරණය" කිරීම සාමාන්‍ය ද්‍රවයකි. SO යනු කුමක්ද සහ එය භාවිතා කරන්නේ කෙසේද යන්න නොදන්නා සහ එය ඉගෙන ගැනීමට අකමැති පුද්ගලයෙකු ලෙස ඔබව හඳුනා ගැනීමට ඔබට ඉහළ මට්ටමේ ප්‍රශ්නයක් අවශ්‍ය නම් - මගේ ආගන්තුකයා වන්න.

14
@orip: එය "නැති වී නැත"; ඔබට එය නැවත දැකීමට අවශ්‍ය නම් එය තවමත් ප්‍රශ්නයේ සංශෝධන ඉතිහාසය අවුල් කරමින් සිටී. නමුත් එය ප්‍රශ්නයකට අයත් නොවේ. 37k rep හි ඔබ මෙය දැනගත යුතුය.
කක්ෂයේ සැහැල්ලු ධාවන තරඟ

6
කරුණාකර සංස්කරණ යුද්ධය නවත්වන්න. මෙම ප්‍රශ්නයේ සංස්කරණ මෙටා මත සාකච්ඡා කෙරේ . කරුණාකර මෙම ලිපිය තවදුරටත් සංස්කරණය / පෙරළීම නොකරන්න. ඔබ පෙර සංස්කරණ / පෙරළීම් සමඟ එකඟ නොවන්නේ නම් හෝ ඒවා පිළිබඳව අදහස් දැක්වීමක් ඇත්නම්, කරුණාකර එම මෙටා ත්‍රෙඩ් එකේ පළ කරන්න.
ලුන්ඩින්

Answers:


1341

මෙන්න මම එය කරන්නේ කෙසේද:

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] : ඔබ වෙනත් JS සන්දර්භයන්ගෙන් (බාහිර කවුළු, රාමු, හෝ අයිෆ්‍රේම්) දිනය වස්තු ගැන සැලකිලිමත් නොවන්නේ නම්, මෙම සරල ආකෘතිය වඩාත් සුදුසු වේ:

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

22
නිදසුනක් ලෙස රාමු හරහා කැඩී යයි. තාරා-ටයිප් කිරීමද හොඳින් ක්‍රියාත්මක විය හැකිය: validDate == d && d.getTime &&! IsNaN (d.getTime ()); - ප්‍රශ්නය සාමාන්‍ය උපයෝගිතා ශ්‍රිතයක් සඳහා වන බැවින් මම වඩාත් දැඩි වීමට කැමැත්තෙමි.
බෝර්ගර්

11
Or බෝර්ගර්, මගේ පිළිතුර සොයා ගත්තේය: "බහු රාමු DOM පරිසරයන් තුළ ස්ක්‍රිප්ටින් කිරීමේදී ගැටළු පැන නගී. කෙටියෙන් කිවහොත්, එක් අයිෆ්‍රේම් එකක් තුළ නිර්මාණය කරන ලද අරා වස්තූන් [[මූලාකෘති]] වෙනත් අයිෆ්‍රේම් තුළ සාදන ලද අරා සමඟ බෙදා නොගනී. ඒවායේ ඉදිකිරීම්කරුවන් විවිධ වස්තූන් වන අතර එම නිසා නිදර්ශන සහ ඉදිකිරීම් පරීක්ෂාවන් දෙකම අසාර්ථක වේ.
අළු

64
ඔබ පවා අවශ්ය නැහැ d.getTimeපමණක්isNan(d)
TecHunter

9
මේ ආකාරයට සරල කළ හැකිය:d instanceof Date && !isNaN(d.getTime())
සෝර්ගටෝන්

6
පිළිතුරට ස්තූතියි, නමුත් org බෝර්ගර් සහ l බ්ලූප්‍රින්ට් ක්‍රිස්ගේ අදහස් අවධාරණය කිරීමට මම කැමැත්තෙමි: 1උදාහරණයක් ලෙස මම අංකනය විග්‍රහ කළහොත් වලංගු දිනයක් මා සතුව ඇත, එහි ප්‍රති ing ලයක් වශයෙන් Mon Jan 01 2001 00:00:00ඇත්ත වශයෙන්ම දිනයක් වේ, කෙසේ වෙතත් මගේ යෙදුමේ අරමුණ සඳහා එය සම්පූර්ණයෙන්ම නිෂ් less ල ය . මේ අනුව, අවම වශයෙන් මගේ නඩුවේ තවත් ආදාන වලංගු භාවයක් අවශ්‍ය වේ. මෙම පිළිතුර වලංගු dateObjectනොවන බව වලංගු වේ Date!
dnhyde

271

භාවිතා කිරීම වෙනුවට new Date()ඔබ භාවිතා කළ යුත්තේ:

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

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

Date.parse()01 / ජනවාරි / 1970 සිට මිලි තත්පර ගණන නියෝජනය කරන පූර්ණ සංඛ්‍යාවක් වන කාලරාමුව නැවත ලබා දෙයි. NaNසැපයූ දින නූල විග්‍රහ කිරීමට නොහැකි නම් එය නැවත පැමිණේ .


125
-1 ඩන්නෝ මෙයට මෙතරම් ඉහළ ඡන්ද ප්‍රමාණයක් ඇත්තේ ඇයි, Date.parseක්‍රියාත්මක කිරීම මත රඳා පවතින අතර සාමාන්‍ය දින නූල් විග්‍රහ කිරීමට විශ්වාස නොකළ යුතුය. ජනප්‍රිය බ්‍රව්සර්වල නිවැරදිව විග්‍රහ කර ඇති තනි ආකෘතියක් නොමැත, භාවිතයේ ඇති සියල්ලට වඩා බෙහෙවින් අඩුය (අවසානයේදී ES5 හි නිශ්චිතව දක්වා ඇති ISO8601 ආකෘතිය හරි විය යුතුය).
රොබ්ජී

1
ඔබ එය new Date('foo')මූලික වශයෙන් Date.parse('foo')ක්‍රමයට සමාන ලෙස භාවිතා කරන්නේ නම් . බලන්න: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... ඒ නිසා @RobG කී දේ, එය ද එය අදාළ වේ.
golddragon007

2
මෙම පරීක්ෂණය Chrome හි අසාර්ථක වනු ඇත. උදාහරණයක් ලෙස, Chrome හි Date.parse ('AAA-0001') මට අංකයක් ලබා දෙයි.
නික්

අසමත් විය ... සියලු සංඛ්‍යාත්මක අගයන් හඳුනා ගන්න
හෝස් මර්කරි

110

ඔබට Dateවස්තුවක වලංගුභාවය පරීක්ෂා කළ dහැකිය

d instanceof Date && isFinite(d)

හරස් රාමු ගැටළු වළක්වා ගැනීම සඳහා යමෙකුට instanceofචෙක්පත ආදේශ කළ හැකිය

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

බෝර්ගර්ගේ පිළිතුරටgetTime() මෙන් ඇමතුමක් අනවශ්‍ය වන අතර දෙකම ව්‍යංගයෙන් අංකයට පරිවර්තනය වේ.isNaN()isFinite()


මෙය chrome වලින් උත්සාහ කරන්න - Object.prototype.toString.call (නව දිනය ("2013-07-09T19: 07: 9Z")). එය "[වස්තු දිනය]" නැවත ලබා දෙනු ඇත. ඔබට අනුව, එබැවින්, "2013-07-09T19: 07: 9Z", වලංගු දිනයක් විය යුතුය. නමුත් එය එසේ නොවේ. Var dateStr = නව දිනය ("2013-07-09T19: 07: 9Z") කිරීමෙන් ඔබට එය නැවත ක්‍රෝම් මගින් සත්‍යාපනය කළ හැකිය; dateStr එය අවලංගු දිනයකි.
ටින්ටින්

2
Int ටින්ටින්: ඒ සඳහා isFinite()වන්නේ - චෙක්පතෙහි කොටසක් toString.call()ආදේශ කිරීම පමණිinstanceof
ක්‍රිස්ටෝෆ්

'[වස්තු දිනය]' සමඟ සංසන්දනය කිරීම ඉංග්‍රීසි නොවන බ්‍රව්සර් සමඟ ක්‍රියා කරයිද? මම එය සැක කළා.
kristianp

2
ristkristianp ඇත්ත වශයෙන්ම එය බොහෝ විට සිදුවනු ඇති අතර එය බොහෝ විට ECMAScript පිරිවිතරයේ කොටසක් විය හැකිය. එහෙත්, ඔව්, එය කැතයි.
බින්කි

මට මෙහි පළමු ප්‍රවේශය හොඳම විකල්පයයි, නමුත් isFiniteඅධික ලෙස භාවිතා කිරීමේ සැබෑ ලෝක වාසියක් තිබේදැයි මට විශ්වාස නැත isNaN(දෙකම හොඳින් ක්‍රියාත්මක වේ Date(Infinity)). තවද, ඔබට ප්‍රතිවිරුද්ධ තත්වය අවශ්‍ය නම්, එය ටිකක් සරල වේ : if (!(date instanceof Date) || isNaN(date)).
ඇන්ඩෲ

87

මගේ විසඳුම වන්නේ ඔබට වලංගු දින වස්තුවක් ලැබේද යන්න පරීක්ෂා කිරීමයි:

ක්‍රියාත්මක කිරීම

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

29
isNaNනන් සඳහා පරීක්ෂණ කිරීමට වඩා පැහැදිලි ක්රමයක්
orip

1
එහෙත්, ඔබ සැමවිටම මිනිසුන් තමන්ගේම අනුවාදයන් ලියන බව පෙනේ :) documentcloud.github.com/underscore/docs/…
Ash ෂ් ක්ලාක්

4
මම underscore.js වලට ගරු කරන බැවින් මෙය යම් පර්යේෂණයක් කිරීමට හේතු විය. isNaN("a") === trueඅතර ("a" !== "a") === false. ඒ ගැන සිතීම වටී. +1
orip

8
මම මෙහි සොයාගත් ප්‍රධාන විසඳුම් 3 සඳහා කාර්ය සාධනය පරීක්ෂා කළෙමි. සුභ පැතුම්, ඔබ ජයග්‍රාහකයා! jsperf.com/detecting-an-invalid-date
zVictor

2
Li අලි එය වලංගු දිනය වස්තුවකි. new Date("02-31-2000") // Thu Mar 02 2000 00:00:00 GMT+0000 (GMT Standard Time). ඔබ දිනය සාදන්නා වෙත නූලකින් ගමන් කරන්නේ නම්, විශ්වාසදායක ප්‍රති .ලයක් ලබා ගැනීම සඳහා ඔබ ප්‍රමිතිගත නූලකින් සමත් විය යුතුය. නිශ්චිතවම, "නූල් Date.parse () ක්‍රමය මගින් හඳුනාගත් ආකෘතියකින් විය යුතුය". developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
අලු ක්ලාක්

72

වලංගු දිනය පරීක්ෂා කිරීමට කෙටිම පිළිතුර

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

2
එකම ගැටළුව දිනය දිනය නොවේ නම්; ඔබට JS දෝෂයක් ලැබේ.
ඇන්ඩෲ

And ඇන්ඩ rew ඔබට දිනය වස්තුව නිර්මාණය කළ යුතු අතර ඔබට දැනටමත් වස්තුවක් තිබේ නම් භාවිතා කරන්නdate && !isNaN(date.getTime())
abhirathore2006

dateදිනය දිනය නොවේ නම් එය තවමත් ඔබට JS දෝෂයක් ලබා දෙයි . උදාහරණයක් ලෙස : var date = 4; date && !isNaN(date.getTime());.
ඇන්ඩෲ

Nd ඇන්ඩ rew භාවිතය date instanceof Date && !isNaN(date.getTime())
abhirathore2006

3
හරි, අවුරුදු 8 කට පෙර ලැබුණු අනෙක් පිළිතුරු මෙන්. : P stackoverflow.com/a/1353945/2321042
ඇන්ඩෲ

46

ඔබට moment.js භාවිතා කළ හැකිය

මෙන්න උදාහරණයක්:

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

මෙම වලංගු කොටස ලේඛගතකිරීම දී ඉතා පැහැදිලිය.

තවද, පහත දැක්වෙන විග්‍රහ කිරීමේ ධජ වලංගු නොවන දිනයකට හේතු වේ:

  • overflow: 13 වන මාසය, මාසයේ 32 වන දිනය (හෝ පිම්ම නොවන වර්ෂවල පෙබරවාරි 29), වසරේ 367 වන දිනය වැනි දින ක්ෂේත්‍රයක් පිටාර ගැලීම වලංගු නොවන ඒකකයේ දර්ශකය අඩංගු වේ. #invalidAt ගැලපීමට (පහත බලන්න); -1 යනු පිටාර ගැලීමක් නැත.
  • invalidMonth: මොහොත වැනි අවලංගු මාසයක නමක් ('මාර්තු', 'එම්.එම්.එම්.එම්');. අවලංගු මාස ​​නූලක් අඩංගු වේ, නැතිනම් ශුන්‍ය වේ.
  • empty: මොහොත වැනි '' මෙය විකාරයකි ') වැනි විග්‍රහ කළ හැකි කිසිවක් අඩංගු නොවන ආදාන නූල; බූලියන්.
  • ආදිය.

මුලාශ්‍රය: http://momentjs.com/docs/


6
හොඳම විසඳුම, ක්‍රියාත්මක කිරීමට අතිශයින්ම පහසුය, ඕනෑම හැඩතල ගැන්වීමක් සමඟ ක්‍රියා කරයි (මගේ නඩුව dd / MM / yyyy), අධික වසර ද දන්නා අතර අවලංගු දිනයන් (එනම් 29/02/2015) වලංගු ඒවා බවට පරිවර්තනය නොකරයි (එනම් 30/03/2015). Dd / MM / yyyy ආකෘතියේ දිනයක් පරීක්ෂා කිරීම සඳහා මට දැන් භාවිතා කිරීමට සිදුවියmoment("11/06/1986", "DD/MM/YYYY").isValid();
රෆායෙල් මර්ලින්

3
මේ මොහොතේ භාවිතය අවලංගු කර ඇත :(
ජේම්ස් සමනර්ස්

2
මෙම භාවිතය ක්ෂය වී නොමැත. ආකෘති මාලාවක් නොමැතිව ඇමතුම් මොහොත (ආදානය) ක්ෂය වේ (ආදානය ISO ආකෘතිකරණය කර නොමැති නම්).
චෙට්

2
බොහෝ දින සැකසීමේදී මෙම ක්‍රමය අතිශයින් මන්දගාමී විය හැකිය. එවැනි අවස්ථාවන්හිදී රීජෙක්ස් භාවිතා කිරීම වඩා හොඳය.
ග්‍රිඩ් ට්‍රෙකෝර්

2
Moment.js භාවිතය සරල විය හැකි නමුත් අතිවිශාල පොදු කාර්යයකි. මෙම පුස්තකාලය විශාලයි. මම ඔබේ පිළිතුර පහත් කොට සැලකුවෙමි.
මික්

38

JQuery UI DatePicker widget හි ඉතා හොඳ දිනය වලංගු කිරීමේ උපයෝගීතා ක්‍රමයක් ඇති අතර එය ආකෘතිය සහ වලංගුභාවය පරීක්ෂා කරයි (උදා: 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 'නිශ්චිත ආකෘතියේ දින දර්ශනයට වලංගු දිනයක් බැවින් ඔබට අනතුරු ඇඟවීමේ පණිවිඩය නොපෙනේ. කෙසේ වෙතත්, ඔබ 'stringval' '13 / 04/2013 'ට සමාන කර ඇත්නම්, උදාහරණයක් ලෙස, '13 / 04/2013' අගය දින දර්ශනයට වලංගු නොවන බැවින් ඔබට අනතුරු ඇඟවීමේ පණිවිඩය ලැබෙනු ඇත.

සම්මත කළ නූල් අගයක් සාර්ථකව විග්‍රහ කර ඇත්නම්, 'ටෙස්ට් ඩේට්' හි අගය සම්මත සම්මත අගය නියෝජනය කරන ජාවාස්ක්‍රිප්ට් දිනය වස්තුවකි. එසේ නොවේ නම්, එය නිර්වචනය නොකෙරේ.


3
ඉංග්‍රීසි නොවන / ස්ථානීය දින ආකෘති සමඟ වැඩ කරන පළමු පිළිතුර වීම සඳහා උසස් කරන්න.
පොරව.

26

මම ක්‍රිස්ටෝෆ්ගේ ප්‍රවේශයට ඇත්තෙන්ම කැමතියි (නමුත් එය ඡන්දය ප්‍රකාශ කිරීමට තරම් කීර්තියක් නොතිබුණි). මගේ භාවිතය සඳහා, මම සෑම විටම දින වස්තුවක් ඇති බව මම දනිමි, එබැවින් වලංගු () ක්‍රමයක් සමඟ දිනය දීර් extended කළෙමි.

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

දැන් මට මෙය ලිවිය හැකි අතර එය කේතයේ isFinite පරික්ෂා කිරීමට වඩා විස්තරාත්මක වේ ...

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

10
මූලාකෘතිය දීර් ing කරනවාද? ඒක ලොකු ජාවාස්ක්‍රිප්ට් නෑ නෑ!
ජස්දීප් ඛල්සා

isFiniteමා වෙනුවෙන් පරිපූර්ණව වැඩ කිරීම නිසා ඉහළ නැංවීම . නමුත් ඔව්, මූලාකෘතිය දිගු කිරීම තේරුමක් නැති වැඩකි. !isFiniteමත Dateබව යන කරුණ අල්ලා ඇත Dateවේ Invalid Date. මගේ සන්දර්භය සටහන් කිරීම වටී.
ස්ටැග්හවුස්


17

ඔබට මෙම පිටපත සමඟ txDate.value වලංගු ආකෘතිය පරීක්ෂා කළ හැකිය. එය වැරදි ආකෘතියකින් නම් දිනය පරමාර්ථය ක්ෂණිකව සකසා නැති අතර dt වෙත ආපසු හරවන්න.

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

@ මිෆ් යෝජනා කළ පරිදි කෙටියෙන්

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

isNaN (නව දිනය (...)) - සරල හා කෙටි ක්‍රමය
MiF

1
I මිෆ් ඔව්, මම ඔබේ යෝජනාව සමඟ මගේ පිළිතුර යාවත්කාලීන කරමි;) ස්තූතියි
යුසේෆෙරි

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;
}

වැඩි විස්තර සඳහා, javascript හි චෙක් දිනය බලන්න


strභාවිතා නොවේ.
samis

13

මෙම කුඩා ස්නිපටයට ආසන්නව පිළිතුරු කිහිපයක් මම දුටුවෙමි.

ජාවාස්ක්‍රිප්ට් ක්‍රමය:

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
මට යමක් මග හැරී ඇත්දැයි විශ්වාස නැත, නමුත් නව දිනය () දෙවරක් කිරීම තේරුමක් නැතිද?
ජෝන් කැට්මුල්

3
දෙවැන්න ටයිප්ස්ක්‍රිප්ට් සමඟ කිසිදු සම්බන්ධයක් නැත . එය සම්පූර්ණයෙන්ම වලංගු JS වේ.
හැක්

12

දැනටමත් මෙහි සංකීර්ණ පිළිතුරු ඕනෑවටත් වඩා ඇත, නමුත් සරල රේඛාවක් ප්‍රමාණවත් (ES5):

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

හෝ ES6 හි පවා:

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

1
MDN වෙතින්: "Date.parse () ක්‍රමය මඟින් දිනයක තන්තු නිරූපණයක් විග්‍රහ කරන අතර 1970 ජනවාරි 1 සිට 00:00:00 UTC හෝ NaN ... ශ්‍රිතය පූර්ණ සංඛ්‍යාවක් හෝ NaN එකක් ලබා දෙයි. එවිට isNaN () ශ්‍රිතය මඟින් මුල් අගය වලංගු දින වස්තුවක් ද නැද්ද යන්න ඔබට පිරිසිදු බූලියන් ලබා දෙනු ඇත. ස්ථාන පරීක්‍ෂා කිරීම සඳහා මෙය ප්‍රමාණවත් වේ, නමුත් ඉහත උදාහරණය මඟින් ඔබේ වැඩසටහන පුරා ක්‍රියාකාරීත්වය පහසුවෙන් ලබා ගත හැකි සහ කියවිය හැකි වන පරිදි දිනය වස්තුවට සම්බන්ධ කරයි.
මැක්ස් විල්ඩර්

d බූලියන් නම් ඔබට නාන් නොවන 0 හෝ 1 ලැබෙනු ඇත !!
davcup

avdavcup භාවිතා කර පරීක්ෂා කර බැලූ විට Date.parse(true), මට නිවැරදිව NaN එකක් ලැබේ.
සෙබස්තියන් එච්.

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
මෙය බ්‍රව්සරය මත රඳා පවතින බව මම විශ්වාස කරමි.
බැරිපිකර්

@barrypicker ඔබ අදහස් කරන්නේ මෙය බ්‍රව්සරය මත රඳා පවතින බවයි.
අජිල් ඕ.

ඔබට කළ හැකිය: `${new Date('foo')}` === 'Invalid Date'
ඩැනියෙල් වර්ට්

9

Angular.js ව්‍යාපෘති සඳහා ඔබට භාවිතා කළ හැකිය:

angular.isDate(myDate);

3
අවලංගු දිනයක් සමඟ ආරම්භ කර ඇති දින වස්තුවක් පරීක්ෂා කිරීමේදී මෙය සත්‍ය වේ.
dchhetri

6

2/31/2012 වැනි දිනයක් වලංගු කිරීමට උත්සාහ කරන විට මෙම පිළිතුරු කිසිවක් මා වෙනුවෙන් ක්‍රියාත්මක නොවීය (සෆාරි 6.0 හි පරීක්ෂා කර ඇත), කෙසේ වෙතත්, 31 ට වඩා වැඩි දිනයක් උත්සාහ කිරීමේදී ඒවා හොඳින් ක්‍රියාත්මක වේ.

ඒ නිසා මට ටිකක් තිරිසන් කිරීමට සිදු විය. දිනය උපකල්පනය කර ඇත mm/dd/yyyy. මම භාවිතා කරන්නේ @broox පිළිතුර:

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

(නව දිනය ('2/30/2014')). වලංගු () නැවත සත්‍ය වේ
ඇන්ඩ්‍රේ ෆිගියිරෙඩෝ

1
මා මෙයට පිළිතුරු දී ටික කලක් ගතවී ඇතත් ඔබට ආපසු පැමිණීමේ කොන්දේසි දෙකම අවශ්‍ය විය හැකිය&& value.split('/')[0] == (d.getMonth()+1);
ඩෙක්ස්

භාවිතා new Date('string date')කිරීම සමාන වේ Date.parse('string date'), බලන්න: developper.mozilla.org/en-US/docs/Web/JavaScript/Reference/… එවිට ඔබට ව්‍යාජ සත්‍ය හෝ අසත්‍ය අගයන් ලැබෙනු ඇත.
golddragon007

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);
    }

ඉහත කේතය JS 02/31/2012 03/02/2012 බවට පත් කළ විට එය වලංගු නොවන බව පෙනෙනු ඇත


3
හරි, නමුත් මෙය පරීක්‍ෂා කරන්නේ නූලක් M / D / Y ආකෘතියෙන් දිනයක් නම් මිස "වලංගු සහ අවලංගු දින වස්තු අතර වෙනස" නොවේ. මෙය ඇත්ත වශයෙන්ම මෙය පිළිබඳ ප්‍රශ්නය නොවේ.
බෝර්ගර්

එය ආකෘතියට එරෙහිව පරීක්ෂා කිරීමට හේතුව එය විග්‍රහ කිරීමෙන් පසු දිනය වෙනස් වී ඇත්දැයි පරීක්ෂා කිරීමයි
ජෝන්

OP විසින් බූලියන් ආපසු ලබා දීමට ක්‍රමයක් ඉල්ලා සිටිනවාද?
බැරිපිකර්

1
නියැදි කේතය මඟින් බූලියන් නැවත ලබා දෙයි, සමහර අවලංගු අවස්ථා සඳහා පරීක්ෂා කිරීමේදී ආකෘතිකරණය දායක වේ.
ජෝන්


4

බෝර්ගර්ගේ ප්‍රවේශය මගින් දේවානුභාවයෙන් මම කේතය දිනය වලංගු කිරීම පමණක් නොව, දිනය නියම දිනයක් බව සහතික කර ඇත්තෙමි, එයින් අදහස් වන්නේ 31/09/2011 සහ 29/02/2011 වැනි දිනයන් සඳහා අවසර නොමැති බවයි.

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!";
}

නමුත් ... ඉහත ක්‍රම (org බෝර්ගර් සහ වෙනත්) දැනටමත් මෙම වර්ගයේ වලංගු භාවය පරීක්ෂා කරයි ... මට ගැටලුව ලබා ගත නොහැක.
නිල් පැහැති

බෝර්ගර්ගේ නැත - ඔහුගේ පිළිතුරට ඔහුගේම අදහස් බලන්න.
ඊඑම්එල්

1
මෙම විසඳුම ක්‍රියාත්මක වන්නේ ඔබේ රට dd/MM/yyyyඅංකනය භාවිතා කරන විට පමණි . එසේම, එය trueවලංගු වූ විට එය නැවත පැමිණෙන අතර එය 'Invalid date!'එසේ නොවේ නම්, වඩා හොඳ ආපසු 1 වර්ගයක් පමණි.
A1rPun

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(EAFP) අවශ්‍ය නොවනු ඇත. එසේ නොමැති නම්:

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

1
ECMA-262 අර්ථ දැක්වීම අනුව දෝෂයක් විසි කරන එකම ශ්‍රිතය එය බව පෙනේ. 15.9.5.43 Date.prototype.toISOString () මෙම ශ්‍රිතය මඟින් නූල් අගයක් ලබා දෙන අතර මෙම දිනය වස්තුව නියෝජනය කරන වේලාව නිරූපණය කරයි. නූල් වල ආකෘතිය 15.9.1.15 හි අර්ථ දක්වා ඇති දිනය කාල නූල් ආකෘතියයි. සියලුම ක්ෂේත්‍ර නූල් තුළ ඇත. කාල කලාපය සැමවිටම UTC වේ, එය Z උපසර්ගය මගින් දැක්වේ. මෙම වස්තුවේ කාල අගය සීමිත අංකයක් නොවේ නම්, පරාස දෝෂ ව්‍යතිරේකයක් විසි කරනු ලැබේ.
හෙන්රි ලියු

3

දී ඇති වස්තුවක් නම්, එම චෙක්පත වටා මා සොයාගත් හොඳම කාර්ය සාධන ප්‍රති results ල මම ඒකාබද්ධ කළෙමි:

ප්රති result ලය පහත දැක්වේ:

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

දිනයක int 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)

2

තෝරාගත් පිළිතුර විශිෂ්ටයි, මම එයද භාවිතා කරමි. කෙසේ වෙතත්, ඔබ පරිශීලක දිනය ආදානය වලංගු කිරීමට ක්‍රමයක් සොයන්නේ නම්, වලංගු නොවන ඉදිකිරීම් තර්ක ලෙස පෙනෙන දේ වලංගු ඒවා බවට පත් කිරීම සඳහා දිනය වස්තුව ඉතා ස්ථීර බව ඔබ දැන සිටිය යුතුය. පහත දැක්වෙන ඒකක පරීක්ෂණ කේතය මඟින් කාරණය පැහැදිලි කරයි:

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-validation-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 මේ ආකාරයෙන් සුචිගත කර ඇති බව සලකන්න. එය නිවැරදිව පෙළගැස්වීම සඳහා එකක් අඩු කිරීමට සිදුවනු ඇත.
වික්‍රමාන්විත

2

කිසිවෙකු තවම එය සඳහන් කර නැත, එබැවින් සංකේත ද යා යුතු මාර්ගයක් වනු ඇත:

Symbol.for(new Date("Peter")) === Symbol.for("Invalid Date") // true

Symbol.for(new Date()) === Symbol.for("Invalid Date") // false

console.log('Symbol.for(new Date("Peter")) === Symbol.for("Invalid Date")', Symbol.for(new Date("Peter")) === Symbol.for("Invalid Date")) // true

console.log('Symbol.for(new Date()) === Symbol.for("Invalid Date")', Symbol.for(new Date()) === Symbol.for("Invalid Date")) // false

දැනුවත් වන්න: https://caniuse.com/#search=Symbol

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.