Почему JavaScript GetTime () не является функцией?
-
26-09-2019 - |
Вопрос
Я использовал следующую функцию,
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);
}
Я получаю ошибку dat1.getTime()
не функция ....
Решение
Это потому, что ваш dat1
и dat2
Переменные - это просто строки.
Вы должны разобрать их, чтобы получить Date
Объект, для этого формата я всегда использую следующую функцию:
// 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
}
Я использую эту функцию, потому что Date.parse(string)
(или new Date(string)
) метод есть зависит от реализации, и то yyyy-mm-dd Формат будет работать на современном браузере, но нет На IE, поэтому я предпочитаю делать это вручную.
Другие советы
Чтобы использовать эту функцию / метод, вам нужен экземпляр класса Дата .
Этот метод всегда используется в сочетании с Дата объект.
Смотрите код ниже:
var d = new Date();
d.getTime();
Для всех тех, кто пришел сюда и действительно использовал дату, набранные переменные, вот решение, которое я нашел. Это также относится к Teadercript.
Я сталкивался с этой ошибкой, потому что я пытался сравнить два дата, используя следующий метод
var res = dat1.getTime() > dat2.getTime(); // or any other comparison operator
Однако я уверен, что использовал объект даты, потому что я использую Angularjs с помощью Teadercript, и я получил данные из напечатанного вызова API.
Я не уверен, почему ошибка поднята, но я предполагаю, что потому, что мой объект был создан JSON Deserialisation, возможно, getTime()
Метод был просто не добавлен к прототипу.
Решение
В этом случае воссоздание объекта даты на основе ваших дат исправит вопрос.
var res = new Date(dat1).getTime() > new Date(dat2).getTime()
Редактировать:
Я был прав об этом. Типы будут выброшены на следующий тип, но они не будут значительно. Следовательно, на дату будет строка, которая, очевидно, приведет к исключительному времени выполнения.
Трюк, если вы используете интерфейсы с не примитивными толькоми данными, такими как даты или функции, вам нужно будет выполнить отображение после вашего HTTP-запроса.
class Details {
description: string;
date: Date;
score: number;
approved: boolean;
constructor(data: any) {
Object.assign(this, data);
}
}
и выполнить сопоставление:
public getDetails(id: number): Promise<Details> {
return this.http
.get<Details>(`${this.baseUrl}/api/details/${id}`)
.map(response => new Details(response.json()))
.toPromise();
}
Для массивов используют:
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();
}
За кредиты и дополнительная информация Об этой теме следуйте по ссылке.
DAT1 и DAT2 - это строки в JavaScript. На прототипе строкового прототипа нет функции получения. Я верю, что вы хотите DATY.PARSE () Функция: http://www.w3schools.com/jsref/jsref_Parse.asp.
Вы бы использовали это так:
var date = Date.parse(dat1);