web-dev-qa-db-ja.com

文字列が日付値かどうかを確認

値が有効な日付であるかどうかを確認するための簡単な方法です。既知の任意の日付形式を使用できます。

たとえば、値10-11-200910/11/20092009-11-10T07:00:00+0000はすべて日付値として認識され、値20010350は日付値として認識されるべきではありません。これが可能ならば、これをチェックする最も簡単な方法は何ですか?タイムスタンプも許可されるためです。

169
Thys

Date.parse()で十分でしょうか。

その相対的な MDN Documentation page を見てください。

36
Asmor

2015年アップデート

これは古い質問ですが、他にも次のような新しい質問があります。

これと重複して閉じられるので、ここに新しい情報を追加することが重要だと思います。私が書いているのは、ここに掲載されているコードの一部を実際にコピーして貼り付けて本番で使用することを人々が怖く思っているからです。

ほとんどの答えはここにありますどちらかいくつかの非常に特定のフォーマットだけに一致し、実際にそれを誤って使用する複雑な正規表現を使用します。 - demoまたはを参照してください。 Dateコンストラクタです。

瞬間を使う

私が この答えで説明したように 現在そのために利用できるライブラリがあります: Moment.js

これは、JavaScriptで日付を解析、検証、操作、および表示するためのライブラリです。標準のJavaScript日付処理関数よりもはるかに豊富なAPIを備えています。

これは12kB縮小/ gzipされており、Node.jsやその他の場所で動作します。

bower install moment --save # bower
npm install moment --save   # npm
Install-Package Moment.js   # NuGet
spm install moment --save   # spm
meteor add momentjs:moment  # meteor

瞬間を使用すると、有効な日付を確認することについて非常に具体的になることができます。時々あなたが期待するフォーマットについていくつかの手がかりを追加することは非常に重要です。たとえば、2015年6月22日などの日付は、DD/MM/YYYYという形式を使用しない限り、有効な日付のように見えます。この場合、この日付は無効として拒否されます。 Momentにどのようなフォーマットを期待できるかを伝える方法はいくつかあります。例えば:

moment("06/22/2015", "MM/DD/YYYY", true).isValid(); // true
moment("06/22/2015", "DD/MM/YYYY", true).isValid(); // false

true引数があるので、Momentは入力が正確にでなければ入力を解析しようとしません。提供されているフォーマットの1つに準拠します(これは私の考えではデフォルトの動作であるはずです)。

内部的に提供されたフォーマットを使うことができます:

moment("2015-06-22T13:17:21+0000", moment.ISO_8601, true).isValid(); // true

そして、配列として複数のフォーマットを使うことができます。

var formats = [
    moment.ISO_8601,
    "MM/DD/YYYY  :)  HH*mm*ss"
];
moment("2015-06-22T13:17:21+0000", formats, true).isValid(); // true
moment("06/22/2015  :)  13*17*21", formats, true).isValid(); // true
moment("06/22/2015  :(  13*17*21", formats, true).isValid(); // false

DEMO を参照してください。

その他の図書館

Moment.jsを使用したくない場合は、他にもライブラリがあります。

2016年更新

私は immoment モジュールを作成しました。これはMoment(のサブセット)と似ていますが、既存のオブジェクトの変更による驚きはありません( the docs を参照)。詳細情報)。

2018年更新

今日では、Momentの代わりに Luxon を日付/時刻操作に使用することをお勧めします。これは(Momentとは異なり)すべてのオブジェクトを不変にするので、暗黙的な日付の変更に関する厄介な驚きはありません。

より詳しい情報

また見なさい:

  • Moment.js を使用した日付と時刻の管理Jay Raj著
  • Moment.js を使用してJavaScriptの日付を操作するBradley Holbrook作

Rob GravelleによるJavaScript日付解析ライブラリに関する一連の記事。

ボトムライン

もちろん、だれでも車輪の再発明を試みる、正規表現を書く(それをする前にplease実際にISO 8601およびRFC 3339を読む)、または次のようにしてbuit-inコンストラクタを呼び出すことができます。 'Invalid Date'のようなエラーメッセージを解析するためのランダムなデータ(すべてのプラットフォームでこのメッセージがまったく同じになっていますか?またはテスト済みの解決策を使用して、時間をかけて改善することができます。再発明することはできません。ここに挙げたライブラリはすべてオープンソースのフリーソフトウェアです。

202
rsp

これが、私が今取り組んでいるアプリでこの問題を解決した方法です。

krillgarからのフィードバックに基づいて更新:

var isDate = function(date) {
    return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date));
}

または...

var isDate = function(date) {
    return (new Date(date) !== "Invalid Date" && !isNaN(new Date(date)) ) ? true : false;
}

…….

56
Neil Girardi

new Date(date) === 'Invalid Date'はFirefoxとChromeでのみ動作します。 IE8(私がテスト目的で私のマシンに持っているもの)はNaNを与えます。

受け入れられた答えに述べられたように、Date.parse(date)はまた数のために働くでしょう。そのため、それを回避するために、それが数字ではないことを確認することもできます(それが確認したいものである場合)。

var parsedDate = Date.parse(date);

// You want to check again for !isNaN(parsedDate) here because Dates can be converted
// to numbers, but a failed Date parse will not.
if (isNaN(date) && !isNaN(parsedDate)) {
    /* do your work */
}
20
krillgar

このようなものはどうですか?それがDateオブジェクトか日付文字列かをテストします。

function isDate(value) {
    var dateFormat;
    if (toString.call(value) === '[object Date]') {
        return true;
    }
    if (typeof value.replace === 'function') {
        value.replace(/^\s+|\s+$/gm, '');
    }
    dateFormat = /(^\d{1,4}[\.|\\/|-]\d{1,2}[\.|\\/|-]\d{1,4})(\s*(?:0?[1-9]:[0-5]|1(?=[012])\d:[0-5])\d\s*[ap]m)?$/;
    return dateFormat.test(value);
}

これはISOフォーマットの文字列をテストするものではありませんが、RegExpにもう少し手を加えればうまくいくはずです。

8
jwerre

この関数は、返された月が元の月と同じであるかどうかをチェックし、有効な年が提示されたことを確認することによって、その問題を解決します。

//expected input dd/mm/yyyy or dd.mm.yyyy or dd-mm-yyyy
function isValidDate(s) {
  var separators = ['\\.', '\\-', '\\/'];
  var bits = s.split(new RegExp(separators.join('|'), 'g'));
  var d = new Date(bits[2], bits[1] - 1, bits[0]);
  return d.getFullYear() == bits[2] && d.getMonth() + 1 == bits[1];
} 
7
ykay

それを検証するために正規表現を使用してください。

isDate('2018-08-01T18:30:00.000Z');

isDate(_date){
        const _regExp  = new RegExp('^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$');
        return _regExp.test(_date);
    }
4
lpradhap

私はこれをやります

var myDateStr= new Date("2015/5/2");

if( ! isNaN ( myDateStr.getMonth() )) {
    console.log("Valid date");
}
else {
    console.log("Invalid date");
}

遊ぶ ここ

3
kiranvj

上記のコメントをすべて参照することによって、私は解決策を見つけました。

これは、渡された日付がISO形式の場合、または他の形式に操作する必要がある場合に機能します。

var isISO = "2018-08-01T18:30:00.000Z";

if(new Date(isISO) !== "Invalid Date" && !isNaN(new Date(isISO)) ) {
if(isISO==new Date(isISO).toISOString()){
console.log("Valid date");
} else {
    console.log("Invalid date");
    }

}
else {
    console.log("Invalid date");
}`

あなたは遊ぶことができます ここ JSFiddleで

2
Nikhil Zurunge

これはミニマリスト版です。

var isDate = function (date) {
    return!!(function(d){return(d!=='Invalid Date'&&!isNaN(d))})(new Date(date));
}
2
Mr. Polywhirl

次の回答を使用して日付を検証できます

 var year=2019;
 var month=2;
 var date=31;
 var d = new Date(year, month - 1, date);
 if (d.getFullYear() != year
    || d.getMonth() != (month - 1)
    || d.getDate() != date) {
alert("invalid date");
return false;
}

私はそれが古い質問であることを知っていますが、私は同じ問題に直面し、答えのどれもきちんと働かなかったことを見ました - 具体的に元の質問である日付から数字(1,200,345など)を除外します。これは私が考えることができるかなり正統ではない方法で、それはうまくいくようです。失敗する場合があるかどうか指摘してください。

if(sDate.toString() == parseInt(sDate).toString()) return false;

これは数字を取り除くための行です。したがって、関数全体は次のようになります。

function isDate(sDate) {  
  if(sDate.toString() == parseInt(sDate).toString()) return false; 
  var tryDate = new Date(sDate);
  return (tryDate && tryDate.toString() != "NaN" && tryDate != "Invalid Date");  
}

console.log("100", isDate(100));
console.log("234", isDate("234"));
console.log("hello", isDate("hello"));
console.log("25 Feb 2018", isDate("25 Feb 2018"));
console.log("2009-11-10T07:00:00+0000", isDate("2009-11-10T07:00:00+0000"));
1
peekolo

この呼び出し可能関数は完全に機能し、有効な日付に対してtrueを返します。 ISO形式の日付(yyyy-mm-ddまたはyyyy/mm/dd)を使用して電話してください。

function validateDate(isoDate) {

    if (isNaN(Date.parse(isoDate))) {
        return false;
    } else {
        if (isoDate != (new Date(isoDate)).toISOString().substr(0,10)) {
            return false;
        }
    }
    return true;
}
1
Peter DK

上記のすべての答えを試した後、私は次のようになりました。

var checkDateValue = function(date) {
    return date && (!(new Date(date) == "Invalid Date") && !isNaN(new Date(date)));
};

new Date(date) !== "Invalid Date"常に trueです。お役に立てれば。

0
dyatchenko

これが私がやってしまう方法です。これはすべてのフォーマットをカバーするわけではありません。それに応じて調整する必要があります。私はフォーマットを制御しているので、それは私のために働きます

function isValidDate(s) {
            var dt = "";
            var bits = [];
            if (s && s.length >= 6) {
                if (s.indexOf("/") > -1) {
                    bits = s.split("/");
                }
                else if (s.indexOf("-") > -1) {
                    bits = s.split("-");
                }
                else if (s.indexOf(".") > -1) {
                    bits = s.split(".");
                }
                try {
                    dt = new Date(bits[2], bits[0] - 1, bits[1]);
                } catch (e) {
                    return false;
                }
                return (dt.getMonth() + 1) === parseInt(bits[0]);
            } else {
                return false;
            }
        }
0
kheya

これを試して

<input type="text" id="StartDay" value="2018/01/01" maxlength="10" />

$('#StartDay').change(function () {
    if ( ($('#StartDay').val().length == 10 && new Date($('#StartDay').val()) >= new Date("2018/01/01") &&
        (new Date($('#StartDay').val()) !== "Invalid Date") && !isNaN(new Date($('#StartDay').val()))) == false) {
     .....
    }
})
0
Willie Cheng

ISOデータを確認する(ES6機能的方法)

const isISODate = date => 
  new Date(date) !== "Invalid Date" 
  && !isNaN(new Date(date)) 
  && date == new Date(date).toISOString();

console.log(
   isISODate("2018-08-01T18:30:00.000Z")
);

一行

const isISODate = date => new Date(date) !== "Invalid Date" && !isNaN(new Date(date)) && date == new Date(date).toISOString();

OK、これは古い質問ですが、ここで解決策を確認しているときに別の解決策を見つけました。私にとっては、関数getTime()が日付オブジェクトに存在するかどうかを確認するために働いています:

const checkDate = new Date(dateString);

if (typeof checkDate.getTime !== 'function') {
  return;
}
0
m.steini

それがDateオブジェクトであるかどうかを見つけるためにオブジェクトに利用可能なDate関連関数をチェックするのは良いことですか?

好き

var l = new Date();
var isDate = (l.getDate !== undefined) ? true; false;
0
Kishore Relangi