Kiểm tra xem ngày có phải là ngày hợp lệ không


124

Sau đây là kịch bản:

Tôi có một Stringngày và một định dạng ngày khác nhau. Ví dụ:
ngày: ngày 10 tháng 10 năm 2016 Định
dạng: "DD-MM-YYYY".

Tôi cần kiểm tra xem ngày này có phải là ngày hợp lệ hay không.

Tôi đã thử làm theo những điều

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

d.isValid()đang trở lại falsemọi lúc. Moment.js không phân tích cú pháp ngày theo định dạng đã cho?

Sau đó, tôi đã cố gắng định dạng ngày DD-MM-YYYYtrước rồi chuyển nó vào Moment.js:

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

Bây giờ date.isValid()là cho tôi kết quả mong muốn, nhưng ở đây đối tượng ngày Moment.js được tạo hai lần. Làm thế nào tôi có thể tránh điều này? Có giải pháp nào tốt hơn không?

FYI Tôi không được phép thay đổi dateFormat.


Bạn không được phép thay đổi giá trị của dateFormat? Trong trường hợp đó, bạn sẽ phải thay đổi định dạng của đầu vào, vì ngày 10 tháng 10 năm 2016 là YYYY-MM-DD, không phải DD-MM-YYYY. Bạn được phép thay đổi những gì?
Pochen

Đầu vào đến từ bộ chọn ngày. Cũng không thể thay đổi điều đó :(
Ganesh

1
Tôi có thể hỏi tại sao bạn không được phép thay đổi biến dateFormat? var d = moment ("19-10-2016", "DD-MM-YYYY"); sẽ giải quyết vấn đề của bạn như xa như tôi đang quan tâm
Pochen

thực sự không thể nói. Nhưng điều đó không nằm trong tầm kiểm soát của tôi để thay đổi giá trị đó.
Ganesh

Câu trả lời:


185

Đã có thể tìm ra giải pháp. Vì ngày tôi nhận được ở định dạng ISO, chỉ cung cấp ngày đến thời điểm sẽ xác thực nó, không cần phải chuyển dateFormat.

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

Và sau đó date.isValid()cho kết quả mong muốn.


15
Có ai biết phương pháp ưa thích hiện nay là gì không? Phương pháp này bây giờ ném ra "Cảnh báo không dùng nữa" sau: xây dựng thời điểm quay trở lại Ngày js. Điều này không được khuyến khích và sẽ bị loại bỏ trong bản phát hành chính sắp tới. Vui lòng tham khảo github.com/moment/moment/issues/1407 để biết thêm thông tin.
Andrew


4
Lưu ý rằng điều này không phải lúc nào cũng hoạt động: var a = moment('12345'); a.isValid() // is trueĐiều này không thành công vì thời điểm sẽ trở lại đối tượng ngày mặc định nếu nó không thể phân tích cú pháp ngày. Và các đối tượng ngày mặc định sẽ luôn luôn trả về một ngày (chỉ cần không phải là người mà bạn muốn.)
Mauvis Ledford

1
cần phải thêm điều đó moment('02').isValid() === true, vì vậy bạn có thể muốn cẩn thận với điều đó
Bruno Finger

3
Ngoài ramoment('abcde 1').isValid() === true
Amiram Korach

119

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

Bạn nên thêm đối số thứ ba khi gọi momentthực thi phân tích cú pháp nghiêm ngặt. Đây là phần có liên quan của tài liệu về thời điểm http://momentjs.com/docs/#/parsing/string-format/ Nó ở gần cuối phần.


Điều này không có hiệu lực.
Billal Begueradj

câu trả lời này phải là câu trả lời đúng ........ @ Begueradj điều này có hiệu lực, hãy thử sử dụng các giá trị khác nhau, đôi khi đúng và đôi khi sai
Akki

Và bạn có thể đọc về phân tích cú pháp nghiêm ngặt tại đây
kuhr

Điều này sẽ cho phép bạn nhập 0000 là một năm
xoáy

17

Đây là: Làm việc Fidddle

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

Giống như tôi đã nói dateFormat là 'DD-MM-YYYY' và tôi không được phép thay đổi nó.
Ganesh

Ồ, tôi hiểu rồi. Hãy để tôi xem về điều đó.
gschambial

Ở đây có được phép thay đổi chuỗi ngày 2016-10-19không?
gschambial

Không. Điều đó đến từ công cụ chọn ngày
Ganesh

1
Bạn không thể sửa đổi nó sau khi nó đến từ datepicker và trước khi bạn nhập nó vào var d = moment("2016-10-19",dateFormat);?
gschambial

14

Tôi sử dụng thời điểm cùng với Ngày mới để xử lý các trường hợp undefinedgiá trị dữ liệu:

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

bởi vì: moment(undefined).isValid() == true

đâu là cách tốt hơn: moment(new Date(undefined)).isValid() == false



8

Cách kiểm tra xem một chuỗi có phải là ngày hợp lệ hay không bằng cách sử dụng Moment, khi định dạng ngày và tháng khác nhau

Xin lỗi, nhưng có bất kỳ giải pháp nào được đưa ra trên chủ đề này thực sự trả lời câu hỏi đã được đặt ra không?

Tôi có một chuỗi ngày và một định dạng ngày khác nhau. Ví dụ: ngày: ngày 10 tháng 10 năm 2016 Định dạng: "DD-MM-YYYY". Tôi cần kiểm tra xem ngày này có phải là ngày hợp lệ hay không.

Những điều sau đây phù hợp với tôi ...

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.

Nhưng thành thật mà nói, không hiểu tại sao moment.isDate()( theo tài liệu ) chỉ chấp nhận một đối tượng. Cũng nên hỗ trợ một chuỗi theo ý kiến ​​của tôi.


1
nếu chúng tôi chuyển true làm đối số thứ 3 trong thời điểm này, nó sẽ kiểm tra định dạng ngày chính xác.
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

bạn có thể vui lòng thêm một số giải thích cho câu trả lời của bạn? Giá trị bổ sung này bổ sung gì cho câu trả lời đã tồn tại và được chấp nhận?
slfan

0

Nếu ngày là hợp lệ thì di getTime()chúc luôn bằng với chính nó.

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

Hãy thử cái này. Nó không đẹp nhưng nó sẽ hoạt động miễn là đầu vào có định dạng không đổi từ bộ chọn ngày của bạn.

Nó là xấu Ngày đến từ bộ chọn của bạn trong ví dụ này

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
Xin đừng làm điều này.
tdelam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.