Почему JavaScript getTime () не является функцией? - PullRequest
33 голосов
/ 13 апреля 2010

Я использовал следующую функцию,

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() это не функция ....

Ответы [ 4 ]

44 голосов
/ 13 апреля 2010

Это потому, что ваши 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)) зависит от реализации , а формат гггг-ММ-дд будет работать в современном браузере, но не в IE, поэтому я предпочитаю делать это вручную.

11 голосов
/ 13 апреля 2010

Чтобы использовать эту функцию / метод, вам нужен экземпляр класса Дата .

Этот метод всегда используется вместе с объектом Date .

См. Код ниже:

var d = new Date();
d.getTime();

Ссылка: http://www.w3schools.com/jsref/jsref_getTime.asp

7 голосов
/ 22 октября 2018

Для всех тех, кто пришел сюда и действительно использовал переменные с типом даты, вот решение, которое я нашел. Это также относится к TypeScript.

Я столкнулся с этой ошибкой, потому что я пытался сравнить две даты, используя следующий метод

var res = dat1.getTime() > dat2.getTime(); // or any other comparison operator

Однако я уверен, что я использовал объект Date, потому что я использую angularjs с машинописью, и я получил данные от типизированного вызова API.

Я не уверен, почему возникает ошибка, но я предполагаю, что, поскольку мой Объект был создан десериализацией JSON, возможно, метод getTime() просто не был добавлен в прототип.

Решение

В этом случае воссоздание объекта Date на основе ваших дат решит проблему.

var res = new Date(dat1).getTime() > new Date(dat2).getTime()

Edit:

Я был прав насчет этого. Типы будут приведены к соответствующему типу, но они не будут созданы. Следовательно, к дате будет приведена строка, которая, очевидно, приведет к исключению времени выполнения.

Хитрость в том, что если вы используете интерфейсы с не примитивными данными, такими как даты или функции, вам потребуется выполнить сопоставление после запроса 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();
}

Для кредитов и дополнительной информации по этой теме перейдите по ссылке.

4 голосов
/ 13 апреля 2010

dat1 и dat2 - это строки в JavaScript. В прототипе String нет функции getTime. Я полагаю, что вам нужна функция Date.parse (): http://www.w3schools.com/jsref/jsref_parse.asp

Вы бы использовали это так:

var date = Date.parse(dat1);
...