回答:
思いDate.parse()
で十分?
Date.parse("4.3")
です986270400000
。
これは古い質問ですが、次のような他の新しい質問です。
これの複製として閉じられるので、ここに新しい情報を追加することが重要だと思います。私が書いているのは、ここに投稿されたコードの一部を実際にコピーアンドペーストして、本番環境で使用する人がいるのではないかと思って怖がったからです。
ここでの回答のほとんどはどちらかのみいくつかの非常に特定のフォーマットに一致するいくつかの複雑な正規表現を使用すると、(宣伝と実際の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を使用したくない場合は、他のライブラリもあります。
Moment(のサブセット)に似ているが、既存のオブジェクトの変更によって引き起こされる驚きがないimmomentモジュールを作成しました(ドキュメントを参照)をください)。
今日は、Momentの代わりにLuxonを日付/時刻の操作に使用することをお勧めします。これにより、(Momentとは異なり)すべてのオブジェクトが不変になるため、日付の暗黙的な変更に関連する厄介な驚きはありません。
以下も参照してください。
JavaScript日付解析ライブラリに関するRob Gravelleによる一連の記事:
もちろん、誰もが、正規表現を書き、車輪の再発明をしようとする(ただし、することができますしてください実際にあなたがそれを行う前に、ISO 8601およびRFC 3339を読んで)、またはコールBUITインのようなパースエラーメッセージにランダムなデータを持つコンストラクタ'Invalid Date'
(あなたは必ずこのメッセージがありますすべてのプラットフォームでまったく同じですか?すべてのロケールで?将来は?)または、テスト済みのソリューションを使用して、時間をかけて改善することができます。ここにリストされているすべてのライブラリーはオープンソースのフリーソフトウェアです。
moment("whatever 123").isValid()
を返しますtrue
。
moment("06/22/2015", "DD/MM/YYYY", true).isValid();
です。明示的に提供される期待される日付形式と、true
厳密なチェックを意味する引数を使用します。私はより多くの情報とより良い例で私の答えを更新しました。
これは私が今取り組んでいるアプリでこの問題を解決した方法です:
krillgarからのフィードバックに基づいて更新:
var isDate = function(date) {
return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date));
}
new Date(date)
「無効な日付」は表示されません。
new Date(date) !== "Invalid Date"
う、常に返す真左の式はのTIMEVALUEでDateオブジェクトを返しますので、NaNになることはありません、===
文字列に。==
型変換のため「作品」を使用します。しかし、日付文字列の解析は依然として大部分が実装に依存しているため、ランダムな形式を解析するためにそれに依存すると、深刻な欠陥が生じます。
isDate('Mac OS X 10.14.2')
ここではtrueを返します。
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 */
}
isNan
、機能ではありません。最初のインスタンスの大文字と小文字が正しくありません。
date
でFoostreet 1
、あなたの条件が真と評価されます。
このようなものはどうですか?それが日付オブジェクトか日付文字列かをテストします:
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にもう少し作業を加えることで、問題はなくなります。
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];
}
上記のコメントをすべて参照することで、解決策を見つけました。
これ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に。
YYYY-MM-DD
はなので、このソリューションは私にとって最も効果的でしたT00:00:00.000Z
。このソリューションを添付して使用し、有効な文字列を確認するのは簡単です。
以下は、のみを使用する改善された関数ですDate.parse()
。
function isDate(s) {
if(isNaN(s) && !isNaN(Date.parse(s)))
return true;
else return false;
}
注: Date.parse()は数値を解析します。たとえばDate.parse(1)
、日付を返します。だからここs
では、それが日付であるかどうか、数値でないかどうかを確認します。
こちらがミニマリスト版です。
var isDate = function (date) {
return!!(function(d){return(d!=='Invalid Date'&&!isNaN(d))})(new Date(date));
}
isDate(" 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;
}
return !isNaN(Date.parse(isoDate)) || isoDate == new Date(isoDate).toISOString().substr(0,10);
私はそれが古い質問であることを知っていますが、同じ問題に直面し、元の質問である日付から数値(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"));
console.log("hello 1 ", isDate("hello 1 "));
trueを返します
これは私がそれをやってしまう方法です。これはすべてのフォーマットをカバーするわけではありません。それに応じて調整する必要があります。私はフォーマットを制御しているので、うまくいきます
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;
}
}
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
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");
}
これを試して:
if (var date = new Date(yourDateString)) {
// if you get here then you have a valid date
}