2016-02-10 10 views
5

Dire che ho una serie di date di nascitaottenere l'elenco delle persone che hanno compleanno entro 1 settimana

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

Metterò ciascuno attraverso una funzione che restituirà quelle date che hanno un compleanno entro 7 giorni a partire da oggi (o da adesso?). Quello che ho al momento è questo:

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

Il valore ,01995183087435 stato determinato dal prendere il numero di millisecondi a 51 settimane e dividendo per il numero di millisecondi a 52 settimane, quindi meno uno che rapporto dovrebbe essere il ' variabile sevenDayDiff '.

Il mio JSFIDDLE, sfortunatamente, non ha proprio ragione. Ci sono molte cose che non vanno in questo. Il mio sevenDayDiff potrebbe essere il valore sbagliato. Inoltre c'è anche il problema degli anni bisestili, anche se sto dividendo per 365.25. Potrei semplicemente andare su questo nel modo sbagliato.

Questo sta andando in una web app in modo che un amministratore può sparare via e-mail a coloro che hanno un compleanno entro 7 giorni. Eventuali suggerimenti o suggerimenti sono benvenuti.

+1

Devi aver fatto un errore da qualche parte. Quando sottrai le due date, converti il ​​risultato in giorni, (1000 * 60 * 60 * 24) e verifica se è inferiore a 8 (7 giorni). – Ibu

+0

Crikey questo sembra un modo convulso di fare questo. Suggerisco di utilizzare questa libreria http://momentjs.com/docs/#/query/ – dwjohnston

+0

@dwjohnston Ottimo suggerimento! –

risposta

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

non è corretto. considera 'ora' è 2017-12-27 e un compleanno è il 2018-01-01 – YardenST

+0

@ YardenST Grazie per la segnalazione. È meglio adesso? –

+0

non ancora, alcuni anni il 29 febbraio no, potresti ottenere un'eccezione lì – YardenST

Problemi correlati