J'ai utilisé la fonction suivante,
function datediff()
{
var dat1 = document.getElementById('date1').value;
alert(dat1);//i get 2010-04-01
var dat2 = document.getElementById('date2').value;
alert(dat2);// i get 2010-04-13
var oneDay = 24*60*60*1000; // hours*minutes*seconds*milliseconds
var diffDays = Math.abs((dat1.getTime() - dat2.getTime())/(oneDay));
alert(diffDays);
}
j'obtiens l'erreur dat1.getTime()
n'est pas une fonction ....
C'est parce que vos variables dat1
Et dat2
Ne sont que des chaînes.
Vous devez les analyser pour obtenir un objet Date
, pour ce format j'utilise toujours la fonction suivante:
// parse a date in yyyy-mm-dd format
function parseDate(input) {
var parts = input.match(/(\d+)/g);
// new Date(year, month [, date [, hours[, minutes[, seconds[, ms]]]]])
return new Date(parts[0], parts[1]-1, parts[2]); // months are 0-based
}
J'utilise cette fonction car la méthode Date.parse(string)
(ou new Date(string)
) dépend de l'implémentation , et le format aaaa-MM-jj fonctionnera sur un navigateur moderne mais pas sur IE, donc je préfère le faire manuellement.
Pour utiliser cette fonction/méthode, vous avez besoin d'une instance de la classe Date .
Cette méthode est toujours utilisée conjointement avec un objet Date .
Voir le code ci-dessous:
var d = new Date();
d.getTime();
Pour tous ceux qui sont venus ici et qui ont en effet utilisé des variables de type Date, voici la solution que j'ai trouvée. Il s'applique également à TypeScript.
J'étais confronté à cette erreur car j'ai essayé de comparer deux dates en utilisant la méthode suivante
var res = dat1.getTime() > dat2.getTime(); // or any other comparison operator
Cependant, je suis sûr d'avoir utilisé un objet Date, car j'utilise angularjs avec TypeScript, et j'ai obtenu les données d'un appel d'API typé.
Je ne sais pas pourquoi l'erreur est déclenchée, mais je suppose que parce que mon objet a été créé par désérialisation JSON, la méthode getTime()
n'a peut-être tout simplement pas été ajoutée au prototype.
Dans ce cas, recréer un objet date basé sur vos dates résoudra le problème.
var res = new Date(dat1).getTime() > new Date(dat2).getTime()
J'avais raison à ce sujet. Les types seront castés selon le type correspondant mais ils ne seront pas instanciés. Par conséquent, il y aura une chaîne convertie en une date, ce qui entraînera évidemment une exception d'exécution.
L'astuce est que si vous utilisez des interfaces avec uniquement des données non primitives telles que des dates ou des fonctions, vous devrez effectuer un mappage après votre requête http.
class Details {
description: string;
date: Date;
score: number;
approved: boolean;
constructor(data: any) {
Object.assign(this, data);
}
}
et pour effectuer la cartographie:
public getDetails(id: number): Promise<Details> {
return this.http
.get<Details>(`${this.baseUrl}/api/details/${id}`)
.map(response => new Details(response.json()))
.toPromise();
}
pour les tableaux, utilisez:
public getDetails(): Promise<Details[]> {
return this.http
.get<Details>(`${this.baseUrl}/api/details`)
.map(response => {
const array = JSON.parse(response.json()) as any[];
const details = array.map(data => new Details(data));
return details;
})
.toPromise();
}
Pour crédits et informations supplémentaires sur ce sujet, suivez le lien.
dat1 et dat2 sont des chaînes en JavaScript. Il n'y a pas de fonction getTime sur le prototype String. Je crois que vous voulez la fonction Date.parse (): http://www.w3schools.com/jsref/jsref_parse.asp
Vous l'utiliseriez comme ceci:
var date = Date.parse(dat1);