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


207

値が有効な日付か、既知の日付形式が許可されているかどうかを確認する簡単な方法は何ですか。

たとえば、私は値を持っている10-11-200910/11/20092009-11-10T07:00:00+0000すべての日付値、および値として認識されるべきである20010350日付値として認識されるべきではありません、。これが可能な場合でも、これを確認する最も簡単な方法は何ですか?タイムスタンプも許可されるからです。


回答:


41

思いDate.parse()で十分?

関連するMDNドキュメントのページを参照してください


24
たとえば、2月に無効な日付のリターンが返されるため、これには注意してください。例:2013-02-31
leojh

58
注意すべきもう1つの理由-数値は日付として解析されます。Date.parse("4.3")です986270400000
Mogsdad 2013

上記の「注意」の両方のケースでいじくり回しました:console.log(Date.parse( "2013-02-31")); console.log(Date.parse( "4.3")); 両方の場合(Firefoxの場合)はNaNを返したので、私にとっては、Date.parseは問題ないようです(とにかく、解析の前にダッシュと正しい長さを事前検証しています)。
Cloudranger 2013

55
@Asmorさん、申し訳ありませんが、これは正解ではありません。Date.parseは数その中で任意の文字列を解析します。
jwerre

11
Date.parse( "My Name 8")は99662040000として返されますが、これは誤りです。私はこれを使って今苦しんでいます。
Rohith

250

2015年の更新

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

これの複製として閉じられるので、ここに新しい情報を追加することが重要だと思います。私が書いているのは、ここに投稿されたコードの一部を実際にコピーアンドペーストして、本番環境で使用する人がいるのではないかと思って怖がったからです。

ここでの回答のほとんどはどちらかのみいくつかの非常に特定のフォーマットに一致するいくつかの複雑な正規表現を使用すると、(宣伝と実際のISO日付一致しないが、1月第32回に一致するように-を参照して、実際に間違ってそれを行うデモをまたは、彼らはに何かを渡すためにしてみてください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("06/22/2015", "MM/DD/YYYY", true).isValid(); // true
moment("06/22/2015", "DD/MM/YYYY", true).isValid(); // false

true引数は、その瞬間は、それがない場合は、入力を解析しようとはしませんがあり、正確に(それは私の意見では、デフォルトの動作でなければなりません)提供のいずれかのフォーマットに準拠しています。

内部で提供される形式を使用できます。

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

参照:デモ

その他の図書館

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

2016年アップデート

Moment(のサブセット)に似ているが、既存のオブジェクトの変更によって引き起こされる驚きがないimmomentモジュールを作成しました(ドキュメントを参照)をください)。

2018年アップデート

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

より詳しい情報

以下も参照してください。

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

ボトムライン

もちろん、誰もが、正規表現を書き、車輪の再発明をしようとする(ただし、することができますしてください実際にあなたがそれを行う前に、ISO 8601およびRFC 3339を読んで)、またはコールBUITインのようなパースエラーメッセージにランダムなデータを持つコンストラクタ'Invalid Date'(あなたは必ずこのメッセージがありますすべてのプラットフォームでまったく同じですか?すべてのロケールで?将来は?)または、テスト済みのソリューションを使用して、時間をかけて改善することができます。ここにリストされているすべてのライブラリーはオープンソースのフリーソフトウェアです。


4
これをどのように使用すればよいですか?moment("whatever 123").isValid()を返しますtrue
krivar

4
@krivar次のように使用するのが最適moment("06/22/2015", "DD/MM/YYYY", true).isValid();です。明示的に提供される期待される日付形式と、true厳密なチェックを意味する引数を使用します。私はより多くの情報とより良い例で私の答えを更新しました。
rsp 2015年

2
同じことですが、ユーザー入力を検証していますが、予期される日付形式がわかりません...
Jan Van der Haegen

3
@JanVanderHaegen 3/4/5が有効な日付であり、2015年4月1日も有効であると想定できる場合は、サポートされている形式の明示的なリストにそれらの形式(および場合によってはそれ以上)を追加することをお勧めします。あなたが述べた3/4/5は明確なフォーマットなしでは曖昧であることに注意してください。
rsp

3
これは、私がSOで見た中で最もよく最もよく維持されている答えになる可能性があります
Phil3992

63

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

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

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

5
ノードに(new Date(date))。toString()!== "Invalid Date"を返す必要がありました。また、注意してください?true:falseは冗長です。ここでは式を返すだけで十分です。
domenukk 2014

IE8では、new Date(date)「無効な日付」は表示されません。
クリルガー、2014

13
これは良い答えではありません。new Date(date) !== "Invalid Date"、常に返す左の式はのTIMEVALUEでDateオブジェクトを返しますので、NaNになることはありません、===文字列に。==型変換のため「作品」を使用します。しかし、日付文字列の解析は依然として大部分が実装に依存しているため、ランダムな形式を解析するためにそれに依存すると、深刻な欠陥が生じます。
RobG

4
新しい日付( "469")の結果は火曜日1月1日469 00:00:00 GMT + 0200(EET)
Dan Ochiana 2016年

3
これは、誤って受け入れられた正解に似ています。isDate('Mac OS X 10.14.2')ここではtrueを返します。
BradStell

24

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 */
}

2
数年後のことですがisNan、機能ではありません。最初のインスタンスの大文字と小文字が正しくありません。
Tim Lewis

動作しません。場合dateFoostreet 1、あなたの条件が真と評価されます。
ファビアンピコーネ

9

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

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にもう少し作業を加えることで、問題はなくなります。


7

2月31日など、日付が無効であるかどうかの確認については、ここでは回答していません。この関数は、返された月が元の月と等しいかどうかを確認し、有効な年が提示されていることを確認することで対処します。

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

質問は文字列が「有効な」日付かどうかを確認するかどうかではなく、文字列が日付形式を表すかどうかを確認するだけなのでです。
Thizzer

@シザー良い点。私は修正してもかまいませんが、質問を再読すると、10は検証すべきではないがタイムスタンプは許可されるべきだと言うので困惑しています。
イケイはモニカを復活させる2016

xDはそれに気づきませんでした。日付/タイムスタンプに関する私の以前の質問です。今日は後で質問を編集してみます。
Thizzer

なぜ月1で、次に月+1なのですか?
Kapil Raghuwanshi

あなたが適切な日付を作成するために1を減算し、それが元の月と等価であるかどうかを確認するために1を追加する必要があるので、@KapilRaghuwanshi JavaScriptの日付は、ゼロベースヶ月使用
ykayは回復モニカ言う

5

正規表現を使用して検証します。

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

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

これDateは、渡されたものが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に。


1
アプリがサポートする日付文字列の形式YYYY-MM-DDはなので、このソリューションは私にとって最も効果的でしたT00:00:00.000Z。このソリューションを添付して使用し、有効な文字列を確認するのは簡単です。
加速

javascriptの場合、これは機能しますが、typescriptで使用する方法は?
Sae

3

以下は、のみを使用する改善された関数ですDate.parse()

function isDate(s) {
    if(isNaN(s) && !isNaN(Date.parse(s)))
        return true;
    else return false;
}

注: Date.parse()は数値を解析します。たとえばDate.parse(1)、日付を返します。だからここsでは、それが日付であるかどうか、数値でないかどうかを確認します。


1
これは、「テスト2」に合格すると実際の日付として合格するため機能しません。chromeの最新バージョンでテスト済み
user1751287

2

私はこれをします

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

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

ここで遊ぶ


2
これは現在のChrome、おそらく他のブラウザでは機能しません。提供された文字列を変更するEXAMPLE STRING 12345と、「有効な日付」が返されます。

1

こちらがミニマリスト版です。

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

1
それでも私の例では機能しません:isDate("  1")
Tomas

@Tom日付かどうかを判断する前に、値に空白文字が含まれているかどうかを確認する必要があります。問題は、コントローラーロジックで処理する必要がある特殊なケースです。
Polywhirl氏2017

1
文字列2020年1月1日は空白を含む有効な日付であるため、空白文字のチェックは必要ありません。メソッドはこれを考慮していません。
カースティンウォルシュ

1

この呼び出し可能関数は完全に機能し、有効な日付に対して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
それは良いですが、質問に完全には答えません。具体的には、例の1つである「2009-11-10T07:00:00 + 0000」では機能しません。
アマダン

validateDate( '2016-12-30T08:00:00.000Z')// false
Jose Browne

これが機能するかどうかに関係なく、次のように簡略化できますreturn !isNaN(Date.parse(isoDate)) || isoDate == new Date(isoDate).toISOString().substr(0,10);
Michel Jung

1

私はそれが古い質問であることを知っていますが、同じ問題に直面し、元の質問である日付から数値(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
console.log("hello 1 ", isDate("hello 1 "));trueを返します
John

あなたが正しいです!解決策はありますか?これまでのところ、私はここでの答えのどれも実際には問題に適切に対処していないと思います!
-peekolo

パーセンテージの「100%」はtrueを返します
toddmo

0

オブジェクトが日付オブジェクトであるかどうかを見つけるために、オブジェクトに使用できる日付関連関数を確認しても問題ありませんか?

お気に入り

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

0

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

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

-1

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

const checkDate = new Date(dateString);

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

-1

document.getElementById('r1').innerHTML = dayjs('sdsdsd').isValid()

document.getElementById('r2').innerHTML = dayjs('2/6/20').isValid()
<script src="https://unpkg.com/dayjs@1.8.21/dayjs.min.js"></script>

<p>'sdsdsd' is a date: <span id="r1"></span></p>
<p>'2/6/20' is a date: <span id="r2"></span></p>

軽量ライブラリはあなたのための準備ができている:Day.js


1
これは基本的にStackOverflowでアドバタイズしているため、実行しないでください。
c4sh

-4
SimpleDateFormat sdf = new SimpleDateFormat(dateFromat);
sdf.setLenient(false);

デフォルトでは、これはTRUEに設定されています。したがって、誤った形式の文字列でも、適切な値が返されます。

私はそれを次のように使用しました:

SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
formatter.setLenient(false);
String value = "1990/13/23"; 

try {
      Date date = formatter.parse(value);
      System.out.println(date);
    }catch (ParseException e) 
  {
    System.out.println("its bad");
  }

5
... javascript ?!
artparks 2016年

-5

これを試して:

if (var date = new Date(yourDateString)) {
    // if you get here then you have a valid date       
}

6
これは私にはうまくいきません。最初に、条件のvarは解析されませんが、それを削除して次のようなことを試みると、if(date = new Date( "rubbish")){alert(date); 日付がごみである場合でも、Date関数が「Firefoxでは少なくとも」「無効な日付」を返すため、条件はtrueと評価されるため、アラートは引き続き実行されます。一部のブラウザが無効な日付にnullを返す場合、それはそれらのブラウザで動作するでしょう。ここにブラウザの不一致があるかもしれません。
Cloudranger 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.