2013-09-30 13 views
26

Mi sembra di avere un po 'di problemi nel ricevere il lunedì precedente data una data particolare. Sto cercando di utilizzare Moment js per l'attività. Ovviamente, posso farlo a mano, ma ho trovato curioso di non riuscire a farlo funzionare usando l'esempio nella documentazione moment.js sul loro sito web: http://momentjs.com/docs/#/get-set/day/.Momento js che riceve la data successiva specificata giorno della settimana

Stavo cercando qualcosa di simile:

moment([2013, 08, 15, 15, 20]).day(-1).format('ddd, MMM DD') 

che si traduce in 'due giorni fa' data, che essendo 13 settembre al posto del 9 settembre previsto.

Qualcuno ha un indizio qui? Grazie.

risposta

54

Ecco come funziona:

moment().day(1) // this monday 
moment().day(-6) // last monday, think of it as this monday - 7 days = 1 - 7 = -6 

stesso vale in direzione opposta:

moment().day(8) // next monday, or this monday + 7 days = 1 + 7 = 8 

Il codice moment().day(-1) può essere spiegato come questa Domenica - 1 giorno = 0-1 = -1 o questo sabato - 7 giorni = 6 - 7 = -1

+0

Come dell'ultimo momento è possibile utilizzare il nome del giorno stesso per esempio momento(). Giorno ("Lunedi") –

11

La risposta accettata funziona solo se sai già se il giorno in questione è in questa settimana o settimana prossima. Cosa succede se non lo sai? Hai semplicemente bisogno del prossimo giovedì disponibile dopo una data arbitraria?

In primo luogo, si desidera sapere se il giorno in questione è più piccolo o più grande del giorno desiderato. Se è più grande, vuoi usare la prossima settimana. Se è più piccolo, puoi utilizzare il lunedì o il giovedì della stessa settimana.

const dayINeed = 4; // for Thursday 
if (moment().isoWeekday() <= dayINeed) { 
    return moment().isoWeekday(dayINeed); 
} else... 

Se siamo oltre il giorno che vogliamo già (se per esempio, il nostro momento è un Venerdì, e vogliamo che il prossimo Giovedi disponibili), poi si desidera una soluzione che vi darà "il Giovedi del la settimana che segue il nostro momento ", indipendentemente dal giorno in cui è il nostro momento, senza alcuna aggiunta/sottrazione imperativa. In poche parole, vuoi entrare nella prossima settimana, usando moment().add(1, 'weeks'). Una volta che sarai nella settimana seguente, puoi selezionare qualsiasi giorno della settimana desiderata, usando moment().day(1).

Insieme, questo vi darà il giorno dopo disponibile che soddisfi le vostre esigenze, indipendentemente da dove il vostro momento iniziale si trova nella sua settimana:

const dayINeed = 4; // for Thursday 

// if we haven't yet passed the day of the week that I need: 
if (moment().isoWeekday() <= dayINeed) { 
    // then just give me this week's instance of that day 
    return moment().isoWeekday(dayINeed); 
} else { 
    // otherwise, give me next week's instance of that day 
    return moment().add(1, 'weeks').isoWeekday(dayINeed); 
} 

Vedi anche: https://stackoverflow.com/a/27305748/800457

1

Credo che il punto è utilizzando day() o isoWeekday() si ottiene una data nella settimana corrente, indipendentemente dal giorno della settimana odierna. Di conseguenza, la data che ottieni può essere passata o deve ancora venire.

Esempio:

se oggi è Mercoledì, moment().isoWeekday(5).format() sarebbe restituire la data del prossimo Venerdì.

Mentre moment().isoWeekday(1).format() restituirebbe il lunedì precedente.

Quindi quando si dice che si desidera la data di, diciamo, "martedì scorso", questa data potrebbe appartenere alla settimana corrente o alla settimana precedente, a seconda di quale giorno è oggi.

Una possibile funzione per ottenere la data dell'ultima dayOfTheWeek è

function getDateOfPreviousDay(dayOfTheWeek) { 
    currentDayOfTheWeek = moment().isoWeekday(); 
    if (currentDayOfTheWeek >= dayOfTheWeek) { 
    return moment().isoWeekday(dayOfTheWeek).format(); // a date in the current week 
    } 
    else { 
    return moment().add(-1,'weeks').isoWeekday(dayOfTheWeek).format(); // a date in the previous week 
    } 
} 
Problemi correlati