ตรวจสอบว่าวันที่ถูกต้องหรือไม่


124

ต่อไปนี้เป็นสถานการณ์:

ฉันมีStringวันที่และรูปแบบวันที่ที่แตกต่างกัน เช่น
วันที่: 2016-10-19
dateFormat: "DD-MM-YYYY"

ฉันต้องการตรวจสอบว่าวันที่นี้เป็นวันที่ถูกต้องหรือไม่

ฉันได้ลองทำตามสิ่งต่างๆแล้ว

var d = moment("2016-10-19",dateFormat);

d.isValid()จะกลับมาfalseทุกครั้ง Moment.js ไม่แยกวิเคราะห์วันที่ในรูปแบบที่กำหนด?

จากนั้นฉันพยายามจัดรูปแบบวันที่DD-MM-YYYYก่อนแล้วส่งต่อไปยัง Moment.js:

var d = moment("2016-10-19").format(dateFormat);
var date = moment(d, dateFormat);

ตอนนี้date.isValid()กำลังให้ผลลัพธ์ที่ต้องการ แต่ที่นี่วัตถุวันที่ Moment.js ถูกสร้างขึ้นสองครั้ง ฉันจะหลีกเลี่ยงสิ่งนี้ได้อย่างไร? มีทางออกที่ดีกว่านี้หรือไม่?

FYI ฉันไม่ได้รับอนุญาตให้เปลี่ยนไฟล์dateFormat.


คุณไม่ได้รับอนุญาตให้เปลี่ยนค่าของ dateFormat? ในกรณีนี้คุณจะต้องเปลี่ยนรูปแบบของอินพุตเนื่องจาก 2016-10-19 คือ YYYY-MM-DD ไม่ใช่ DD-MM-YYYY คุณได้รับอนุญาตให้เปลี่ยนแปลงอะไร?
Pochen

ข้อมูลที่ป้อนมาจากเครื่องมือเลือกวันที่ เปลี่ยนไม่ได้เช่นกัน :(
Ganesh

1
ฉันขอถามว่าทำไมคุณไม่ได้รับอนุญาตให้เปลี่ยนตัวแปร dateFormat? var d = โมเมนต์ ("19-10-2016", "DD-MM-YYYY"); จะแก้ปัญหาของคุณเท่าที่ฉันกังวล
Pochen

ไม่สามารถพูดได้จริงๆ แต่นั่นไม่ได้อยู่ในการควบคุมของฉันที่จะเปลี่ยนค่านั้น
พระพิฆเนศ

1
อาจซ้ำกันได้ของHow to test a string is valid date or not using moment?
Luca Fagioli

คำตอบ:


185

ก็สามารถที่จะหาทางออก เนื่องจากวันที่ที่ฉันได้รับอยู่ในรูปแบบ ISO การระบุวันที่เป็นช่วงเวลาเท่านั้นที่จะตรวจสอบได้ไม่จำเป็นต้องผ่าน dateFormat

var date = moment("2016-10-19");

จากนั้นdate.isValid()ให้ผลลัพธ์ที่ต้องการ


15
มีใครรู้บ้างว่าตอนนี้วิธีที่นิยมใช้คืออะไร? วิธีนี้จะแสดง "คำเตือนการเลิกใช้งาน" ต่อไปนี้: ช่วงเวลาที่โครงสร้างกลับไปเป็นวันที่ js สิ่งนี้ไม่สนับสนุนและจะถูกลบออกในรุ่นใหญ่ที่กำลังจะมาถึง โปรดดูข้อมูลเพิ่มเติมที่github.com/moment/moment/issues/1407
Andrew

1
@ แอนดรูโปรดดูที่stackoverflow.com/questions/23263380/… , github.com/moment/moment/issues/2535
Ganesh

4
โปรดทราบว่าสิ่งนี้ไม่ได้ผลเสมอไป: var a = moment('12345'); a.isValid() // is trueสิ่งนี้ล้มเหลวเนื่องจากช่วงเวลาจะกลับไปที่วัตถุวันที่เริ่มต้นหากไม่สามารถแยกวิเคราะห์วันที่ได้ และวัตถุวันที่เริ่มต้นจะส่งคืนวันที่เสมอ (ไม่ใช่วันที่ที่คุณต้องการ)
Mauvis Ledford

1
ต้องเพิ่มสิ่งmoment('02').isValid() === trueนั้นดังนั้นคุณอาจต้องระวังด้วย
Bruno Finger

3
นอกจากนี้moment('abcde 1').isValid() === true
Amiram Korach

119

var date = moment('2016-10-19', 'DD-MM-YYYY', true);

คุณควรเพิ่มอาร์กิวเมนต์ที่สามเมื่อเรียกใช้momentซึ่งบังคับใช้การแยกวิเคราะห์ที่เข้มงวด นี่คือส่วนที่เกี่ยวข้องของเอกสารช่วงเวลาhttp://momentjs.com/docs/#/parsing/string-format/ซึ่งอยู่ใกล้ส่วนท้ายของส่วนนี้


สิ่งนี้ไม่มีผลกระทบ
Billal Begueradj

คำตอบนี้ควรเป็นคำตอบที่ถูกต้อง ........ @ Begueradj สิ่งนี้มีผลลองใช้ค่าต่างๆบางครั้งถูกและบางครั้งก็ผิด
Akki

และคุณสามารถอ่านเกี่ยวกับการแยกวิเคราะห์อย่างเข้มงวดได้ที่นี่
kuhr

วิธีนี้จะช่วยให้คุณป้อน 0000 ต่อปี
วน

17

จัดให้เลย: Working Fidddle

$(function(){
  var dateFormat = 'DD-MM-YYYY';
  alert(moment(moment("2012-10-19").format(dateFormat),dateFormat,true).isValid());
});

อย่างที่ฉันบอกว่า dateFormat คือ 'DD-MM-YYYY' และฉันไม่ได้รับอนุญาตให้เปลี่ยนแปลง
พระพิฆเนศ

อ้อเข้าใจแล้ว. ให้ฉันดูที่
gschambial

อนุญาตให้เปลี่ยนสตริงวันที่ที่นี่2016-10-19หรือไม่
gschambial

Nope ที่มาจากเครื่องมือเลือกวันที่
พระพิฆเนศ

1
คุณไม่สามารถแก้ไขได้หลังจากที่มาจาก datepicker และก่อนที่คุณจะป้อนข้อมูลลงในvar d = moment("2016-10-19",dateFormat);?
gschambial

14

ฉันใช้ช่วงเวลาร่วมกับวันที่ใหม่เพื่อจัดการกรณีของundefinedค่าข้อมูล:

const date = moment(new Date("2016-10-19"));

เพราะว่า: moment(undefined).isValid() == true

ที่ไหนเป็นวิธีที่ดีกว่า: moment(new Date(undefined)).isValid() == false



9

วิธีตรวจสอบว่าสตริงเป็นวันที่ที่ถูกต้องโดยใช้ Moment หรือไม่เมื่อรูปแบบวันที่และวันที่แตกต่างกัน

ขออภัยวิธีแก้ปัญหาใด ๆ ในชุดข้อความนี้ตอบคำถามที่ถามจริงหรือไม่

ฉันมีวันที่แบบสตริงและรูปแบบวันที่ซึ่งแตกต่างกัน เช่นวันที่: 2016-10-19 dateFormat: "DD-MM-YYYY" ฉันต้องการตรวจสอบว่าวันที่นี้เป็นวันที่ถูกต้องหรือไม่

ต่อไปนี้ใช้ได้ผลกับฉัน ...

const date = '2016-10-19';
const dateFormat = 'DD-MM-YYYY';
const toDateFormat = moment(new Date(date)).format(dateFormat);
moment(toDateFormat, dateFormat, true).isValid();

// Note: `new Date()` circumvents the warning that
// Moment throws (https://momentjs.com/guides/#/warnings/js-date/),
// but may not be optimal.

แต่โดยสุจริตไม่เข้าใจว่าทำไมmoment.isDate()( ตามเอกสาร ) ยอมรับเฉพาะวัตถุ ควรสนับสนุนสตริงในความคิดของฉัน


2
ถ้าเราส่ง true เป็นอาร์กิวเมนต์ที่ 3 สักครู่ก็จะตรวจสอบรูปแบบวันที่ที่แน่นอน
Raj Kumar N

2
console.log(` moment('2019-09-01', 'YYYY-MM-DD').isValid()?  ` +moment('2019-09-01', 'YYYY-MM-DD').isValid())
console.log(` moment('2019-22-01', 'YYYY-DD-MM').isValid()?  ` +moment('2019-22-01', 'YYYY-DD-MM').isValid())
console.log(` moment('2019-22-22', 'YYYY-DD-MM').isValid()?  ` +moment('2019-22-22', 'YYYY-DD-MM').isValid())
console.log(` moment('undefined', 'YYYY-DD-MM').isValid()?  ` +moment('undefined', 'YYYY-DD-MM').isValid())

 moment('2019-09-01', 'YYYY-MM-DD').isValid()?  true
 moment('2019-22-01', 'YYYY-DD-MM').isValid()?  true
 moment('2019-22-22', 'YYYY-DD-MM').isValid()?  false
 moment('undefined', 'YYYY-DD-MM').isValid()?  false

คุณช่วยเพิ่มคำอธิบายในคำตอบของคุณได้ไหม สิ่งนี้เพิ่มคุณค่าอะไรให้กับคำตอบที่มีอยู่แล้วและเป็นที่ยอมรับ
slfan

0

หากวันที่ถูกต้องgetTime()จะเท่ากับตัวมันเองเสมอ

var date = new Date('2019-12-12');
if(date.getTime() - date.getTime() === 0) {
    console.log('Date is valid');
} else {
    console.log('Date is invalid');
}

-2

ลองอันนี้. มันไม่ดี แต่จะใช้งานได้ตราบใดที่อินพุตเป็นรูปแบบคงที่จากเครื่องมือเลือกวันที่ของคุณ

เป็น badDate ที่มาจากเครื่องมือเลือกของคุณในตัวอย่างนี้

https://jsfiddle.net/xs8tvox9/

var dateFormat = 'DD-MM-YYYY'
var badDate = "2016-10-19";

var splittedDate = badDate.split('-');

if (splittedDate.length == 3) {
  var d = moment(splittedDate[2]+"-"+splittedDate[1]+"-"+splittedDate[0], dateFormat);
  alert(d.isValid())
} else {
  //incorrectFormat
}

1
ได้โปรดอย่าทำเช่นนี้
tdelam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.