„Neteisingos datos“ datos aptikimas „JavaScript“

Norėčiau pasakyti skirtumą tarp galiojančių ir negaliojančių datos objektų JS, tačiau negalėjau suprasti, kaip:

 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 yra isValidDate funkcijos rašymo idėjos?

  • Pelenai rekomenduojami Date.parse analizuoti, kuri suteikia patikimą būdą patikrinti datų eilutės teisingumą.
  • Jei įmanoma, norėčiau, kad mano API priimtų datą ir patikrintų / patvirtintų, ar ji galioja, ar ne. Borgar sprendimas tai daro, bet turiu jį išbandyti naršyklėse. Taip pat įdomu, ar yra elegantiškesnis būdas.
  • Pelenai privertė mane galvoti, kad mano API nepriima Date atvejų, tai būtų lengviausia patikrinti.
  • „Borgar“ pasiūlė išbandyti „ Date egzempliorių ir išbandyti „ Date time“ reikšmę. Jei data negalioja, laiko vertė yra NaN . Aš patikrinau ECMA-262 , ir šis elgesys yra standartinis, ir tai, ko aš ieškau.
1034
30 авг. nustatykite orip 30 rug . 2009-08-30 14:34 '09 ne 14:34 2009-08-30 14:34
@ 36 atsakymai
  • 1
  • 2

Štai kaip tai padaryti:

 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 } 
836
30 авг. atsakymas pateikiamas Borgar 30 rug . 2009-08-30 14:48 '09 ne 14:48 2009-08-30 14:48

Užuot naudoję new Date() turėtumėte naudoti:

 var timestamp = Date.parse('foo'); if (isNaN(timestamp) == false) { var d = new Date(timestamp); } 
border=0

Date.parse() grąžina laiko žymą, sveikąjį skaičių, Date.parse() milisekundžių skaičių nuo Date.parse() . Sausio 1 d. Jis grąžins „ NaN jei jis negali analizuoti pateiktos datos eilutės.

205
30 авг. atsakymas pateikiamas Ash 30 rug. 2009-08-30 14:47 '09, 14:47, 2009-08-30 14:47

Per d objekto tikslumą galite patikrinti

 d instanceof Date  isFinite(d) 

Norėdami išvengti problemų su keliais rėmeliais, galite pakeisti instanceof

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

Skambinimas į getTime() kaip ir Borgar atsakyme, nėra reikalingas, nes isNaN() ir isFinite() abu yra netiesiogiai konvertuojami į skaičių.

86
30 авг. Christoph atsakymas, pateiktas rugpjūčio 30 d 2009-08-30 17:07 '09, 17:07 2009-08-30 17:07

Mano sprendimas yra tik patikrinti, ar turite galiojantį datos objektą:

Įgyvendinimas

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

Naudojimas

 var d = new Date("lol"); console.log(d.isValid()); // false d = new Date("2012/09/11"); console.log(d.isValid()); // true 
62
11 сент. Ash Clarke, rugsėjo 11 d. Atsakymas 2012-09-11 18:03 '12, 18:03 2012-09-11 18:03

trumpiausias atsakymas už galiojantį datos patvirtinimą

 if(!isNaN(date.getTime())) 
45
04 июля '16 в 13:10 2016-07-04 13:10 atsakymas pateikiamas abhirathore2006 m. liepos 4 d., 16 d. 1:10 2016-07-04 13:10

Norėčiau paminėti, kad „jQuery UI DatePicker“ valdiklis turi labai naudingą datų patvirtinimo metodą, kuris tikrina formatą ir galiojimą (pvz., 2013 01 01 datos neleidžiamos).

Net jei nenorite naudoti duomenų atvaizdavimo valdiklio kaip naudotojo sąsajos elemento, visada galite pridėti savo .js biblioteką į savo puslapį ir paskambinti patvirtinimo metodu, išlaikydami vertę, kurią norite patikrinti. , ji užima eilutę kaip įvestį, o ne „JavaScript“ datos objektą.

Žr. Http://api.jqueryui.com/datepicker/

Jis nėra nurodytas kaip metodas, bet jis yra kaip naudingumo funkcija. Raskite puslapį, skirtą „parsedate“, ir rasite:

$ datepicker.parseDate (formatas, vertė, nustatymai) - ištrauka datą iš eilutės vertės nurodytu formatu.

Naudojimo pavyzdys:

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

(Išsamesnės informacijos ieškokite datų formatų aprašyme šiuo adresu: http://api.jqueryui.com/datepicker/#utility-parseDate )

Pirmiau pateiktame pavyzdyje nematysite įspėjamojo pranešimo, nes „01/03/2012“ yra kalendoriaus data nurodytu formatu. Tačiau, jei, pavyzdžiui, padarėte „stringval“ lygią „04/13/2013“, gausite įspėjimo pranešimą, nes reikšmė „13/04/2013“ netinka kalendoriui.

Jei perduodama eilutės reikšmė sėkmingai analizuojama, „testdate“ reikšmė bus „Javascript Date“ objektas, atitinkantis perduotos eilutės reikšmę. Jei ne, tai bus neapibrėžta.

34
15 февр. Atsakymą pateikė Matt Campbell , vasario 15 d. 2013-02-15 22:30 '13, 10:30 val. 2013-02-15 22:30

Galite tiesiog naudoti moment.js

Štai pavyzdys:

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

Dokumentų patikros skyrius yra pakankamai aiškus.

Be to, toliau pateiktos analizuoti vėliavos nurodo neteisingą datą:

  • overflow : datos lauko perpildymas, pvz., 13-asis mėnuo, mėnesio 32-oji diena (arba vasario 29 d. ne piko metu), 367-oji metų diena ir tt perpildymas yra netinkamo vieneto indeksas, kad atitiktų #invalidAt (žr. žemiau); -1 reiškia perpildymą.
  • invalidMonth : negaliojantis mėnesio pavadinimas, pavyzdžiui, momentas („Marbruary“, „MMMM“); Yra negaliojanti mėnesio eilutė, kitaip null.
  • empty : įvesties eilutė, kurioje nėra nieko sulankstomo, pavyzdžiui, momento („tai yra nesąmonė“); Būlio.
  • Ir tt

Šaltinis: http://momentjs.com/docs/

33
14 окт. atsakymą pateikė Yves M. 14 a. 2013-10-14 23:18 '13, 23:18, 2013-10-14 23:18

Man tikrai patiko Christophe požiūris (bet nepakankamai geras balsavimas). Mano naudojimui aš žinau, kad visada turėsiu datos objektą, todėl tiesiog pridėjau datą, naudodamas galiojančią () metodą.

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

Dabar galiu tik parašyti, ir tai yra daug labiau apibūdinantis, nei tik patikrinimas, ar yra baigtinis kodas ...

 d = new Date(userDate); if (d.valid()) {  } 
21
23 нояб. atsakymas duotas brooksams . 2010-11-23 22:47 '10, 22:47, 2010-11-23 22:47

Naudoju šį kodą, kad patikrintumėte metų, mėnesio ir datos reikšmes.

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

Daugiau informacijos žr .

14
27 окт. Atsakymas Jingguo Yao spalis 27 2011-10-27 12:55 '11 at 12:55 2011-10-27 12:55
 // check whether date is valid var t = new Date('2011-07-07T11:20:00.000+00:00x'); valid = !isNaN(t.valueOf()); 
13
07 июля '11 в 0:27 2011-07-07 00:27 atsakymą pateikė „ faridz “ liepos 7 d. 11 d. 0:27 2011-07-07 00:27

Geras sprendimas! Mano pagalbininkų funkcijų bibliotekoje dabar atrodo taip:

 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
03 мая '11 в 19:44 2011-05-03 19:44 atsakymą pateikė Dmytro Ševčenka 03 gegužės 11 d. 19:44 2011-05-03 19:44

Su šiuo apdaila galite patikrinti faktinį formatą txDate.value. jei jis buvo tam tikru formatu, tada data obejct nebuvo nustatyta ir grąžina null in dt.

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

Ir kaip @MiF pasiūlė per trumpiausią įmanomą laiką

  if(isNaN(new Date(...))) 
9
14 мая '12 в 22:39 2012-05-14 22:39 atsakymą pateikė Zhilevanas gegužės 14 d. 12 d. 10:39 2012-05-14 22:39

„Angular.js“ projektams galite naudoti:

 angular.isDate(myDate); 
9
18 сент. Nicko Taro atsakymas, pateiktas rugsėjo 18 d 2015-09-18 03:27 '15 at 3:27 2015-09-18 03:27

Yra per daug sudėtingų atsakymų, tačiau pakanka paprastos linijos (ES5):

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

arba netgi ES6:

 Date.prototype.isValid = d => !isNaN(Date.parse(d)); 
8
11 мая '17 в 12:17 2017-05-11 12:17 atsakymas duotas Shide gegužės 11 d., 17 val. 12:17 2017-05-05 12:17

Jis tik dirbo man.

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

Tačiau jis neveikė.

 new Date('foo') === 'Invalid Date'; //is false 
6
06 янв. atsakymą pateikė vartotojo1296274 06 sausis 2014-01-06 05:36 '14 at 5:36 2014-01-06 05:36

Nė vienas iš minėtų sprendimų nepadėjo man tai, kas dirbo

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

Pirmiau nurodytas kodas bus rodomas, kai JS 2012-02-03 bus paskelbtas negaliojančiu

5
31 авг. atsakymas duotas Jono 31 d. 2012-08-31 09:25 '12 at 9:25 am 2012-08-31 09:25

Nė vienas iš šių atsakymų man nepadarė (patikrintas „Safari 6.0“), kai bandžiau patikrinti datą, pvz., 2012 2 31, bet jie dirba gerai, kai bandau bet kurią datą, didesnę nei 31.

Taigi turėjau eiti per toli. Darant prielaidą, kad data yra mm/dd/yyyy formatu. Naudoju atsakymą @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 
5
09 сент. atsakymas Dex 09 Sep 2012-09-09 12:25 '12 12:25 PM 2012-09-09 12:25
 IsValidDate: function(date) { var regex = /\d{1,2}\/\d{1,2}\/\d{4}/; if (!regex.test(date)) return false; var day = Number(date.split("/")[1]); date = new Date(date); if (date  date.getDate() != day) return false; return true; } 
5
14 сент. Michael Goldshmidt atsakymas rugsėjo 14 d 2012-09-14 21:52 '12, 09:52 PM 2012-09-14 21:52

Aš parašiau šią funkciją. Perkelkite jį eilutės parametru ir nustatys, ar tai yra galiojanti data, ar ne pagal šį formatą "dd / MM / yyyy".

čia yra testas

įvestis: "hahaha", išėjimas: false.

įvestis: "29/2/2000", išėjimas: tiesa.

įvestis: "29/2/2001", išvestis: klaidinga.

 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
25 февр. atsakymas pateikiamas Yaseen 25 vasario mėn. 2014-02-25 14:22 '14, 14:22, 2014-02-25 14:22

Suderindavau geriausius rezultatus, kuriuos rado šis patikrinimas, jei šis objektas:

  • - pavyzdžio data ( čia )
  • turi galiojančią datą ( čia)

Rezultatas yra toks:

 function isValidDate(input) { if(!(input  input.getTimezoneOffset  input.setUTCFullYear)) return false; var time = input.getTime(); return time === time; }; 
3
25 июля '14 в 13:00 2014-07-25 13:00 atsakymas pateikiamas zVictor liepos 25 d. 14 val. 13:00 2014-07-25 13:00

Įkvėptas „Borgar“ metodo, aš įsitikinau, kad kodas ne tik patikrina datą, bet ir iš tikrųjų garantuoja, kad data yra tikra data, ty datos, pvz., 2011 m.

 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!"; } 
3
18 авг. atsakymas pateikiamas Raz 18 rug. 2011-08-18 17:48 „11 at 17:48 PM 2011-08-18 17:48

Stygos datos objektas yra paprastesnis ir patikimesnis būdas nustatyti, ar abu laukai yra galiojanti data. Pavyzdžiui, jei įvesite šį įrašą „-------“ datos įrašo lauke. Kai kurie pirmiau pateikti atsakymai neveiks.

 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
12 авг. atsakymas duotas 12 d. 2013-08-12 23:28 '13, 23:28 2013-08-12 23:28

Baigta funkcija, pagrįsta geriausiu atsakymu:

   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 not a date. } return isValid; } 
2
20 марта '17 в 19:55 2017-03-20 19:55 atsakymas pateikiamas Zon 20 d. 17 val. 19:55 2017-03-20 19:55
 function isValidDate(strDate) { var myDateStr= new Date(strDate); if( ! isNaN ( myDateStr.getMonth() ) ) { return true; } return false; } 

Skambinkite taip:

 isValidDate(""2015/5/2""); // => true isValidDate(""2015/5/2a""); // => false 
2
23 авг. atsakymas duotas kiranvj 23 rug . 2015-08-23 06:50 '15 at 6:50 am 2015-08-23 06:50

Pasirinktas atsakymas yra puikus ir aš taip pat naudoju. Tačiau, jei ieškote būdų, kaip patvirtinti vartotojo datos įvedimą, turėtumėte žinoti, kad datos objektas yra labai patikimas atsižvelgiant į tai, kas gali atrodyti negaliojančiais kūrimo argumentais. Toliau pateiktas vieneto bandymo kodas parodo tašką:

 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 not. So, the secret to working with this version of //isValidDate is to pass in dates as text strings... Hooboy //alert(d.toString()); }); 
2
18 июня '14 в 21:14 2014-06-18 21:14 atsakymas pateikiamas dolphus333 birželio 18 d. 14, 14:14 2014-06-18 21:14

Manau, kad kai kurie iš jų yra ilgas procesas. Mes galime jį sumažinti, kaip parodyta toliau:

  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; } 
2
11 авг. vartotojo889209 atsakymas 11 rug . 2011-08-11 07:32 '11 at 7:32 2011-08-11 07:32

galite konvertuoti datas ir laiką milisekundėmis getTime ()

this getTime() Grąžina metodą Not Number NaN jei jis negalioja.

 if(!isNaN(new Date("2012/25/255").getTime())) return 'valid date time'; return 'Not a valid date time'; 
2
23 нояб. Atsakymą Mina Gabriel pateikė lapkričio 23 d. 2013-11-23 05:50 '13, 5:50, 2013-11-23 05:50
1
23 апр. Joel Kornbluh atsakymas balandžio 23 d 2015-04-23 20:25 '15, 20:25, 2015-04-23 20:25

Paprastai aš laikauosi to, kad datos implantavimas yra naršyklės kamino. Tai reiškia, kad visuomet gausite „Invalid Date“, kai „Chrome“, „Firefox“ ir „Safari“ paskambinsite į „DateString“ () nuo šios atsakymo datos.

 if(!Date.prototype.isValidDate){ Date.prototype.isValidDate = function(){ return this.toDateString().toLowerCase().lastIndexOf('invalid') == -1; }; } 

Nenaudojau to IE.

1
26 авг. atsakymas duotas „ pixelbacon“ 26 rug . 2014-08-26 21:51 '14 at 21:51 2014-08-26 21:51

Taigi, man patiko „@Ask Clarke“ atsakymas su nedideliu patobulinimu, pridėjus bandomąjį sugavimo bloką datos, kurios negali praeiti per var d = new Date (d) -

 function checkIfDateNotValid(d) { try{ var d = new Date(d); return !(d.getTime() === d.getTime()); //NAN is the only type which is not equal to itself. }catch (e){ return true; } } 
1
25 апр. Atsakymą pateikė Saurabh Gupta 25 Bal. 2017-04-25 20:40 '17 at 8:40 pm 2017-04-25 20:40
  • 1
  • 2

Kiti klausimai dėl žymų arba Užduoti klausimą