2016-02-10 10 views
5

は、私が今日から7日以内に誕生日を持ってこれらの日付を返す関数を介して1を出してあげる私は生年月日1週間以内に誕生日を持っている人のリストを取得

var bdates = ['1956-12-03', '1990-03-09',...] 

の配列を持っていると言います(または今からですか?)私は現時点で持っていることはこれです:

var bdays = _.map(bdates, function(date) { 
    var birthDate = new Date(date); 
    var current = new Date(); 
    var diff = current - birthDate; // Difference in milliseconds 
    var sevenDayDiff = Math.ceil(diff/31557600000) - (diff/31557600000); //1000*60*60*24*365.25 
    if (sevenDayDiff <= 0.01916495550992) 
    return date; 
    else 
    return false; 
}); 

値0.01995183087435はその後、1を51週間でミリ秒数を取り、52週間でミリ秒単位の数で割ることから決定したマイナスその比率はする必要があります " sevenDayDiff '変数。

私のJSFIDDLEは、残念なことに、それほど正しくはありません。これにはいくつかの問題があります。私のsevenDayDiffは間違った価値かもしれません。私が365.25で割っても、うるう年問題もあります。私はちょうどこれについて間違った方法で行くことができます。

これはウェブアプリケーションで行われているため、管理者は7日以内に誕生日のある人に電子メールを送信できます。ヒントや提案は大歓迎です。

+1

あなたはどこかでミスを犯している必要があります。 2つの日付を減算する場合は、結果を日(1000 * 60 * 60 * 24)に変換し、8(7days)より小さいかどうかを確認します。 – Ibu

+0

これは、これを行うための厄介な方法のようです。私はこのライブラリを使用することをお勧めしますhttp://momentjs.com/docs/#/query/ – dwjohnston

+0

@ dwjohnston素晴らしい提案! –

答えて

1

var bdates = ['1956-12-03', '1990-03-09', '1970-02-14']; 
 

 
var now = moment('2015-02-10'); 
 
var birthDates = []; 
 

 
bdates.forEach(function(birthDate) { 
 
    var birthDay = moment(birthDate).year(now.year()); 
 
    var birthDayNextYear = moment(birthDate).year(now.year() + 1); 
 
    var daysRemaining = Math.min(Math.abs(birthDay.diff(now, 'days')), Math.abs(birthDayNextYear.diff(now, 'days'))); 
 
    
 
    if((daysRemaining >= 0) && (daysRemaining <= 7)) { 
 
    birthDates.push(birthDate); 
 
    } 
 
}); 
 

 
document.write(JSON.stringify(birthDates));
<script src="http://momentjs.com/downloads/moment.min.js"></script>

+0

これは間違っています。 「今」は2017-12-27で、いくつかの誕生日は2018-01-01だと考えてください – YardenST

+0

@YardenST報告していただきありがとうございます。今はいいですか? –

+0

まだ、いくつかの年は2月29日にいくつかありますが、あなたはそこで例外を得るかもしれません。 – YardenST