web-dev-qa-db-ja.com

文字列の日付配列をソートする

配列を昇順で並べ替えたい。日付は文字列形式です

["09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015", "18/05/2015"] 

これらの日付が連続形式であるかどうかをチェックする関数も必要です。

eg - Valid   - ["09/06/2015", "10/06/2015", "11/06/2015"] 
     Invalid - ["09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015"] 

コード例:

function sequentialDates(dates){
        var temp_date_array = [];

        $.each(dates, function( index, date ) {
            //var date_flag = Date.parse(date);
            temp_date_array.Push(date);
        });

        console.log(temp_date_array);

        var last;
        for (var i = 0, l = temp_date_array.length; i < l; i++) {

          var cur = new Date();
          cur.setTime(temp_date_array[i]);
          last = last || cur;
          //console.log(last+' '+cur);

          if (isNewSequence(cur, last)) {
            console.log("Not Sequence");
          }
        }

        //return dates;
    }

     function isNewSequence(a, b) {
          if (a - b > (24 * 60 * 60 * 1000))
              return true;
          return false;
      }
13
Suyog Sawant

シンプルなソリューション

文字列を日付に変換したり、RegExpを使用したりする必要はありません。

簡単な解決策は、Array.sort()メソッドを使用することです。 sort関数は日付形式をYYYYMMDDに設定し、文字列値を比較します。日付入力はDD/MM/YYYYの形式であると想定します。

_data.sort(function(a,b) {
  a = a.split('/').reverse().join('');
  b = b.split('/').reverse().join('');
  return a > b ? 1 : a < b ? -1 : 0;
  // return a.localeCompare(b);         // <-- alternative 
});
_

更新:

役立つコメントは、ソート関数を単純化するためにlocaleCompare()を使用することを提案しました。この代替方法は、上記のコードスニペットに示されています。

スニペットを実行してテスト

_<!doctype html>
<html>
<body style="font-family: monospace">
<ol id="stdout"></ol>
<script>
  var data = ["09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015", "18/05/2015"];

data.sort(function(a,b) {
  a = a.split('/').reverse().join('');
  b = b.split('/').reverse().join('');
  return a > b ? 1 : a < b ? -1 : 0;
  
  // return a.localeCompare(b);         // <-- alternative 
  
});

for(var i=0; i<data.length; i++) 
  stdout.innerHTML += '<li>' + data[i];
</script>
</body>
</html>_
28
Roberto

文字列を日付に変換し、並べ替える場合はそれらの日付を比較する必要があります。これを実現するために、sortメソッドが受け入れるパラメーターを使用できます。

var dateStrings = ["09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015", "18/05/2015"];
var sortedStrings = dateStrings.sort(function(a,b) {
    var aComps = a.split("/");
    var bComps = b.split("/");
    var aDate = new Date(aComps[2], aComps[1], aComps[0]);
    var bDate = new Date(bComps[2], bComps[1], bComps[0]);
    return aDate.getTime() - bDate.getTime();
});

コードの冗長性を減らし、さまざまな日付形式を処理するために、sortメソッドで必要なコンパレーターを作成する関数を追加できます。

function createSorter(dateParser) {
    return function(a, b) {
        var aDate = dateParser(a);
        var bDate = dateParser(b);
        return aDate.getTime() - bDate.getTime();
    };
}

dateStrings.sort(createSorter(function(dateString) {
    var comps = dateString.split("/");
    return new Date(comps[2], comps[1], comps[0]);
}));

次に、createSorter呼び出しに異なる関数を渡すことにより、異なる日付フォーマッターを使用できます。

2番目の質問については、文字列から日付の(ソートされた)配列を作成し、その配列に対してロジックを実行できます。

function myDateParser(dateString) {
    var comps = dateString.split("/");
    return new Date(comps[2], comps[1], comps[0]);
}

var sortedDates = dateStrings.map(myDateParser).sort();

sortedDates配列をたどることができ、2つの連続していない日付が見つかった場合、それらの間にギャップがある日付があります。

3
Cristik
var dateRE = /^(\d{2})[\/\- ](\d{2})[\/\- ](\d{4})/;
function dmyOrdA(a, b){
a = a.replace(dateRE,"$3$2$1");
b = b.replace(dateRE,"$3$2$1");
if (a>b) return 1;
if (a <b) return -1;
return 0; }
function dmyOrdD(a, b){
a = a.replace(dateRE,"$3$2$1");
b = b.replace(dateRE,"$3$2$1");
if (a>b) return -1;
if (a <b) return 1;
return 0; }
function mdyOrdA(a, b){
a = a.replace(dateRE,"$3$1$2");
b = b.replace(dateRE,"$3$1$2");
if (a>b) return 1;
if (a <b) return -1;
return 0; }
function mdyOrdD(a, b){
a = a.replace(dateRE,"$3$1$2");
b = b.replace(dateRE,"$3$1$2");
if (a>b) return -1;
if (a <b) return 1;
return 0; } 

dateArray = new Array("09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015", "18/05/2015");
var c = dateArray.sort( dmyOrdA );

console.log(c);
0
khaliq

日付文字列を昇順に変更せずに値に並べ替えるには、次のようにします。

var T = ["09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015", "18/05/2015"];

var sortedT = T.sort(s1,s2){
    var sdate1 = s1.split('/');
    var sdate2 = s2.split('/');
    var date1 = s1[1]+'/'+s1[0]+'/'+s1[2];
    var date2 = s2[1]+'/'+s2[0]+'/'+s2[2];
    if (Date.parse(date1) > Date.parse(date2)) return 1;
    else if (Date.parse(date1) < Date.parse(date2) return -1;
    else return 0;
}

結果の配列sortedTは、日付文字列のソートされた配列である必要があります。

注:

日付形式はdd/mm/yyyyに保存されますが、JavaScriptの標準の日付形式はmm/dd/yyyyです。したがって、外部日付フォーマットライブラリを使用せずにこの文字列をDateに解析するには、並べ替え時の互換性のために日付文字列を変換する必要があります。

0
TaoPR