dd-mm-yyyy文字列を日付に変換します


184

以下を使用して、dd-mm-yyyy形式の文字列をJavaScriptの日付オブジェクトに変換しようとしています:

 var from = $("#datepicker").val();
 var to = $("#datepickertwo").val();
 var f = new Date(from);
 var t = new Date(to);

("#datepicker").val()dd-mm-yyyy形式の日付が含まれます。以下を実行すると、「無効な日付」が表示されます。

alert(f);

これは「-」記号が原因ですか?どうすればこれを克服できますか?


これはすべての日付で発生しますか?
kasdega

回答:


326

「-」で分割

文字列を必要な部分に解析します。

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

正規表現を使用する

var date = new Date("15-05-2018".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3"))

なぜ正規表現を使わないのですか?

ハイフンで区切られた3つの部分で構成される文字列で作業していることがわかっているためです。

ただし、別の文字列内で同じ文字列を探している場合は、正規表現が適しています。

再利用

これをサンプルコードで、そしておそらくコードベースの別の場所で2回以上実行しているため、関数でラップします。

function toDate(dateStr) {
  var parts = dateStr.split("-")
  return new Date(parts[2], parts[1] - 1, parts[0])
}

として使用:

var from = $("#datepicker").val()
var to = $("#datepickertwo").val()
var f = toDate(from)
var t = toDate(to)

または、関数でjQueryを気にしない場合:

function toDate(selector) {
  var from = $(selector).val().split("-")
  return new Date(from[2], from[1] - 1, from[0])
}

として使用:

var f = toDate("#datepicker")
var t = toDate("#datepickertwo")

最新のJavaScript

より最近のJSを使用できる場合は、配列の構造化解除も便利です。

const toDate = (dateStr) => {
  const [day, month, year] = dateStr.split("-")
  return new Date(year, month - 1, day)
}

9
私をそれに打ち負かす...しかし、私はまだDateJsを使用しています。フェンスポストエラーのため、これは正確ではありません。月は0-11なので、1を引く必要があります。f = new Date(from [2]、from [1] -1、from [0]);
kasdega

12
間違った日付を生成するバグのある選択された回答。驚くばかり!
epascarello、2011

3
Cheers @kasdega-編集...少し前に!
エイドリアンリンチ

@AdrianLynch JavaScriptで「月dd、yyyy」を「MM / dd / yyyy」に変換する方法
dilipkumar1007

1
@Adrian Lynch最新のJavaScriptオプションは素晴らしいです!ありがとうございました。
アレクサンドルリベイロ

134

正規表現の例:

new Date( "13-01-2011".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3") );

8
同じく必要な改訂/は、区切り文字と2桁の年(または1より大きい数)です:replace( /(\d{2})[-/](\d{2})[-/](\d+)/, "$2/$1/$3")
Izhaki

1
なぜこれが@AdemirNunoの選択された回答であるべきですか?既知の形式の文字列にRegExを使用する理由 あなたはパターンを探していません。最初の数字は日、2番目は月、3番目は年です。この場合、RegExはジョブに適したツールではありません。
エイドリアンリンチ2015年

非数字区切り文字、先行ゼロなしの日付、および2桁または4桁の年を使用するnew Date( "23. 2. 15".replace( /(\d+)[^d]+(\d+)[^d]+(\d+)/, "$2/$1/$3") );
リビジョン

ありがとうございます。私の日付形式は時間に付属しているので、次のように再コード化します: 'new Date( "13-01-2011" .replace(/(\ d {2})-(\ d {2})-(\ w)/ 、 "$ 2 / $ 1 / $ 3")); ' 正しいですか?
KamuranSönecek2015

@NeerajSingh JavaScriptで「月dd、yyyy」を「MM / dd / yyyy」に変換する方法
dilipkumar1007

15

別の可能性:

var from = "10-11-2011"; 
var numbers = from.match(/\d+/g); 
var date = new Date(numbers[2], numbers[0]-1, numbers[1]);

数字を一致させて並べ替えます


また、元の質問では「mm-dd-yyyy」ではなく「dd-mm-yyyy」が指定されていたため、まだ間違っています(ただし、それだけです)。
Phil M Jones

@epascarello「月dd、yyyy」をJavaScriptで「MM / dd / yyyy」に変換する方法
dilipkumar1007

1
var date = new Date(numbers[2], numbers[1]-1, numbers[0]);
Rui Nunes


6
var from = $("#datepicker").val(); 
var f = $.datepicker.parseDate("d-m-Y", from);

3
Date.parseDateを取得していましたか?
kasdega

@kasdega申し訳ありませんが、私は$ .datepicker.parseDateを考えていました、今それを修正しました:)
Saad Imran。

あなたは使うべき$.datepicker.parseDate("dd-mm-yy", from);適切のような日付に解析するために24-01-2017、時チェク日付ピッカーのドキュメントapi.jqueryui.com/datepicker
アンドレア・マウロ・

4

Date()次のように、オブジェクトの括弧内に日付を書き込むこともできます。

new Date("Month dd, yyyy hh:mm:ss")
new Date("Month dd, yyyy")
new Date(yyyy,mm,dd,hh,mm,ss)
new Date(yyyy,mm,dd)
new Date(milliseconds)

@AmitSengar JavaScriptで「月dd、yyyy」を「MM / dd / yyyy」に変換する方法
dilipkumar1007

3

次の形式を使用します。 myDate = new Date('2011-01-03'); // Mon Jan 03 2011 00:00:00


1
そのparseDate機能はどこから手に入れたのですか?それはネイティブのJavaScript関数ですか?
ジョセフ・シルバー2011

どうすればこれを実装できますか?また、dd-mm-yyの形式が必要です
user559142

parseDateはネイティブJS関数です。詳細については、xaprb.com
javascript-

1
@Diodeus ...本当にそれはネイティブですか?ffとchromeがエラーをスローするのはなぜですか?
epascarello、2011

2
@Diodeusは、最後の編集を行っても、(少なくともChromeでは)うまく機能しません。日付を'2011-01-03'UTC時間に設定します00:00:00。したがって、ユーザーのタイムゾーンがUTC未満の場合、実際には前日になります。
マイク

3

私の場合

new Date("20151102034013".replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3T$4:$5:$6"))

結果:月2015年11月2日04:40:13 GMT + 0100(CET)次に.getTime()を使用してミリ秒を処理します


3

受け入れられた答えはちょっとバグがあります

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

日付ピッカーに「77-78-7980」が含まれているかどうかを検討してください。これは明らかに有効な日付ではありません。これは次の結果になります:

var f = new Date(7980, 77, 77);
=> Date 7986-08-15T22:00:00.000Z

これはおそらく望ましい結果ではありません。

この理由は、MDNサイトで説明されています。

Dateが複数の引数を持つコンストラクターとして呼び出される場合、値がその論理範囲より大きい場合(たとえば、月の値として13が提供されるか、分の値として70が提供される)、隣接する値が調整されます。たとえば、new Date(2013, 13, 1)と同等new Date(2014, 1, 1)です。


問題を解決するより良い方法は次のとおりです。

const stringToDate = function(dateString) {
  const [dd, mm, yyyy] = dateString.split("-");
  return new Date(`${yyyy}-${mm}-${dd}`);
};

console.log(stringToDate('04-04-2019'));
// Date 2019-04-04T00:00:00.000Z

console.log(stringToDate('77-78-7980'));
// Invalid Date

これにより、無効な入力を処理できる可能性があります。

例えば:

const date = stringToDate("77-78-7980");

if (date === "Invalid Date" || isNaN(date)) {
  console.log("It's all gone bad");
} else {
  // Do something with your valid date here
}



0

正規表現を使用できます。

var result = /^(\d{2})-(\d{2})-(\d{4})$/.exec($("#datepicker").val());
if (result) {
    from = new Date(
        parseInt(result[3], 10), 
        parseInt(result[2], 10) - 1, 
        parseInt(result[1], 10)
    );
}

間違った月を生成します!月は1ではなく0から始まります。したがって、Janを実行した場合、2月と表示されます
epascarello '

1
@epascarello-Date APIがどれほど不完全であるかを忘れました。
ChaosPandion 2011

@ChaosPandion:JavaScriptでmyDate = '20 / 06/17 'を'20 / 6/2017 00:00:00'形式に変換する方法は?
Ghanshyam Lakhani 2017

-1
new Date().toLocaleDateString();

単純に、日付をjs Dateオブジェクトに渡すだけです


次のように、Dateコンストラクタ内に日付文字列を渡すことを意味しますnew Date('30/12/2018').toLocaleDateString()か?それは無効な日付を
Ms.Tamil
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.