233 votes

JavaScript - obtenir le premier jour de la semaine à partir de la date actuelle

J'ai besoin du moyen le plus rapide pour obtenir le premier jour de la semaine. Par exemple : aujourd'hui, nous sommes le 11 novembre et nous sommes jeudi ; et je veux le premier jour de cette semaine, qui est le 8 novembre et un lundi. J'ai besoin de la méthode la plus rapide pour la fonction map de MongoDB, des idées ?

0 votes

Si chaque petit bout de vitesse est crucial, vous pouvez vouloir tester les performances de ma réponse. J'obtiens des performances un peu meilleures avec la mienne dans les navigateurs (sauf pour IE, qui favorise le CMS). Bien sûr, vous devriez la tester avec MongoDB. Lorsque la fonction reçoit une date qui est un lundi, elle devrait être encore plus rapide, puisqu'elle renvoie simplement la date originale non modifiée.

0 votes

J'ai le même problème et parce que l'objet date de javascript a beaucoup de bugs, j'utilise maintenant datejs.com (ici code.google.com/p/datejs ), une bibliothèque qui corrige le comportement erroné de la date native.

0 votes

Le titre de la question demande le premier jour de la semaine tandis que la description de la question demande la date du dernier lundi. Il s'agit en fait de deux questions différentes. Vérifiez ma réponse qui les résout toutes les deux de manière correcte.

416voto

CMS Points 315406

Utilisation de la getDay des objets Date, vous pouvez connaître le numéro du jour de la semaine (soit 0=Dimanche, 1=Lundi, etc).

Vous pouvez ensuite soustraire ce nombre de jours plus un, par exemple :

function getMonday(d) {
  d = new Date(d);
  var day = d.getDay(),
      diff = d.getDate() - day + (day == 0 ? -6:1); // adjust when day is sunday
  return new Date(d.setDate(diff));
}

getMonday(new Date()); // Mon Nov 08 2010

4 votes

Cette fonction a-t-elle un bug ? - si la date en question est le jeudi 2, day = 4, diff = 2 - 4 + 1 = -1, et le résultat de setDate sera "le jour avant le dernier jour du mois précédent" (cf. ce ).

3 votes

@Izhaki que voulez-vous dire ? Pour le 2 mai, la fonction renvoie le 29 avril, ce qui est correct.

25 votes

Si le dimanche est le premier jour de la semaine, utilisez : diff = d.getDate() - day;

70voto

user113716 Points 143363

Je ne sais pas si les performances sont comparables, mais ça marche.

var today = new Date();
var day = today.getDay() || 7; // Get current day number, converting Sun. to 7
if( day !== 1 )                // Only manipulate the date if it isn't Mon.
    today.setHours(-24 * (day - 1));   // Set the hours to day number minus 1
                                         //   multiplied by negative 24
alert(today); // will be Monday

Ou comme une fonction :

# modifies _date_
function setToMonday( date ) {
    var day = date.getDay() || 7;  
    if( day !== 1 ) 
        date.setHours(-24 * (day - 1)); 
    return date;
}

setToMonday(new Date());

6 votes

Cela aurait dû être la réponse, c'est la seule qui répond à la question posée. Les autres sont boguées ou vous renvoient à des bibliothèques tierces.

0 votes

Cool, ça marche pour moi ! En faisant quelques ajustements, je peux obtenir les deux, lundi et vendredi de la semaine à partir d'une date donnée !

11 votes

C'est très bien, sauf que cette fonction devrait s'appeler "setToMonday", car elle modifie l'objet date qui lui est transmis. getMonday renverrait une nouvelle date qui serait le lundi basé sur la date transmise. Une différence subtile, mais qui m'a interpellé après avoir utilisé cette fonction. La solution la plus simple est de mettre date = new Date(date); comme première ligne de la fonction getMonday.

14voto

Matt Points 15107

Vérifiez Date.js

Date.today().previous().monday()

1 votes

Ou peut-être Date.parse('last monday');

0 votes

J'en ai besoin pour la base de données MongoDB. Je ne peux donc pas référencer date.js, mais je vous remercie pour votre extrait de code.

1 votes

Ah, je ne savais pas que vous pouviez exécuter des JS directement dans MongoDB. C'est plutôt astucieux. J'avais supposé que vous utilisiez le JS pour préparer les données de la requête.

5voto

Ixtinkt Points 84

J'utilise ceci

function get_next_week_start() {
   var now = new Date();
   var next_week_start = new Date(now.getFullYear(), now.getMonth(), now.getDate()+(8 - now.getDay()));
   return next_week_start;
}

-4voto

pixelfreak Points 7385

Vérifiez : moment.js

Exemple :

moment().day(-7); // last Sunday (0 - 7)
moment().day(7); // next Sunday (0 + 7)
moment().day(10); // next Wednesday (3 + 7)
moment().day(24); // 3 Wednesdays from now (3 + 7 + 7 + 7)

Bonus : fonctionne aussi avec node.js

19 votes

Mais ce n'est pas une réponse à la question de l'OP. Il a une date, disons le 08/07/14 (j/m/a). Il veut obtenir le premier jour de cette semaine (pour ma région, ce serait le lundi qui vient de passer, ou hier). moment().startOf('week')

2 votes

Notez que moment().startOf("week") peut donner la date du dimanche précédent, en fonction des paramètres locaux. Dans ce cas, utilisez moment().startOf('isoWeek') à la place : runkit.com/embed/wdpi4bjwh6rt

0 votes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X