229 votes

Comment soustraire la date/heure en JavaScript ?

J'ai un champ dans une grille contenant une date/heure et j'ai besoin de connaître la différence entre celle-ci et la date/heure actuelle. Quelle serait la meilleure façon de le faire ?

Les dates sont stockées comme "2011-02-07 15:13:06" .

2 votes

Quel est le format de la date et de l'heure ?

0 votes

C'est stocké comme ça "2011-02-07 15:13:06"

12 votes

Il ne s'agit pas d'un doublon. Il propose une solution différente et est beaucoup mieux expliqué. Il a également un meilleur classement dans les moteurs de recherche.

279voto

David Hedlund Points 66192

Cela vous donnera la différence entre deux dates, en millisecondes.

var diff = Math.abs(date1 - date2);

Dans votre exemple, ce serait

var diff = Math.abs(new Date() - compareDate);

Vous devez vous assurer que compareDate est valide Date objet.

Quelque chose comme ceci fonctionnera probablement pour vous

var diff = Math.abs(new Date() - new Date(dateStr.replace(/-/g,'/')));

c'est-à-dire en tournant "2011-02-07 15:13:06" en new Date('2011/02/07 15:13:06') qui est un format que le Date peut comprendre.

1 votes

Ceci ignore la gestion du DTS pour le fuseau horaire local (fonctionne bien avec UTC)

4 votes

En TypeScript, j'obtiens une erreur tslint lorsque j'essaie de faire ceci : var diff = Math.abs(new Date() - compareDate) ;

1 votes

@Ethan : Cela fonctionne. Le temps devrait être ajouté. La différence entre 1980/1/1 et 1960/1/1 correspond aux dix années entre l'époque et 1980, plus les 10 années entre 1960 et l'époque. Par contre, la différence entre 1980/1/1 et 1975/1/1 correspond aux dix années entre l'époque et 1980, moins les 5 années entre 1975 et l'époque. Les deux scénarios sont couverts.

56voto

pawel Points 7016

Vous pouvez simplement soustraire deux objets de date.

var d1 = new Date(); //"now"
var d2 = new Date("2011/02/01");  // some date
var diff = Math.abs(d1-d2);  // difference in milliseconds

0 votes

Cela ne fonctionnera pas si d2 est antérieur à 1970 ; dans ce cas, son timestamp en millisecondes sera négatif, et le temps entre l'époque unix et d2 sera en fait ajouté à d1.

4 votes

@Ethan Oui, il sera ajouté, c'est le but. La différence entre 3 et -3 est de 6, 3 - (-3) == 3 + 3 == 6

6 votes

(new Date("1970/01/02") - new Date("1969/12/29")) /1000/60/60/24 === 4

18voto

Pavel Savara Points 1745

Si vous souhaitez obtenir la différence d'heure de l'horloge murale, pour le fuseau horaire local et avec la prise de conscience de l'heure d'été.

Date.prototype.diffDays = function (date: Date): number {

    var utcThis = Date.UTC(this.getFullYear(), this.getMonth(), this.getDate(), this.getHours(), this.getMinutes(), this.getSeconds(), this.getMilliseconds());
    var utcOther = Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());

    return (utcThis - utcOther) / 86400000;
};

Test

it('diffDays - Czech DST', function () {
    // expect this to parse as local time
    // with Czech calendar DST change happened 2012-03-25 02:00
    var pre = new Date('2012/03/24 03:04:05');
    var post = new Date('2012/03/27 03:04:05');

    // regardless DST, you still wish to see 3 days
    expect(pre.diffDays(post)).toEqual(-3);
});

La différence entre les minutes et les secondes se fait de la même manière.

0 votes

Réponse brillante, j'ai cherché sur tout le web une solution au problème de l'heure d'été et enfin, vous êtes arrivé !

18voto

ShitalShah Points 2213

À moins que vous ne soustrayiez des dates sur le même client navigateur et que vous ne vous souciiez pas des cas limites comme les changements d'heure d'été, il est probablement préférable d'utiliser la fonction moment.js qui offre de puissantes API localisées. Par exemple, voici ce que j'ai dans mon utils.js :

subtractDates: function(date1, date2) {
    return moment.subtract(date1, date2).milliseconds();
},
millisecondsSince: function(dateSince) {
    return moment().subtract(dateSince).milliseconds();
},

4 votes

6 ans plus tard, moment.js est considéré comme bien trop gonflé et trop lourd pour ses utilisations avec les dates. Considérez cet article et utilisez des alternatives - dev.to/aminnairi/you-probably-don-t-need-moment-js-493m

5voto

Bharat Patil Points 622

Jetez un coup d'œil à cet exemple en direct.

http://www.jsfiddle.net/zANNt/1/

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