为什么javascript getTime()不是函数?

uda*_*aya 33 javascript date function gettime

我用了以下功能,

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);
}
Run Code Online (Sandbox Code Playgroud)

我得到错误dat1.getTime()不是一个功能....

CMS*_*CMS 45

那是因为你dat1dat2变量只是字符串.

您应该解析它们以获取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
}
Run Code Online (Sandbox Code Playgroud)

我使用这个函数是因为Date.parse(string)(或new Date(string))方法是依赖于实现的,yyyy-MM-dd格式可以在现代浏览器上使用,但不适用于IE,所以我更喜欢手动操作.


Hai*_*vgi 11

要使用此函数/方法,您需要Date类的实例.

此方法始终与Date对象一起使用.

请参阅以下代码:

var d = new Date();
d.getTime();
Run Code Online (Sandbox Code Playgroud)

链接:http://www.w3schools.com/jsref/jsref_getTime.asp


Luc*_*key 7

对于所有来到这里并确实使用Date类型变量的人,这是我找到的解决方案。它也适用于TypeScript。

我遇到此错误是因为我尝试使用以下方法比较两个日期

var res = dat1.getTime() > dat2.getTime(); // or any other comparison operator
Run Code Online (Sandbox Code Playgroud)

但是我确定我使用了Date对象,因为我使用的是带有typescript的angularjs,并且我从类型化的API调用中获取了数据。

我不确定为什么会引发错误,但是我认为由于我的对象是通过JSON反序列化创建的,因此该getTime()方法可能根本就没有添加到原型中。

在这种情况下,根据您的日期重新创建日期对象将解决此问题。

var res = new Date(dat1).getTime() > new Date(dat2).getTime()
Run Code Online (Sandbox Code Playgroud)

编辑:

我是对的。类型将转换为相应的类型,但不会被实例化。因此,将有一个字符串转换为日期,这显然会导致运行时异常。

诀窍是,如果您使用仅包含非原始数据(例如日期或函数)的接口,则需要在http请求之后执行映射。

class Details {
    description: string;
    date: Date;
    score: number;
    approved: boolean;

    constructor(data: any) {
      Object.assign(this, data);
    }
}
Run Code Online (Sandbox Code Playgroud)

并执行映射:

public getDetails(id: number): Promise<Details> {
    return this.http
               .get<Details>(`${this.baseUrl}/api/details/${id}`)
               .map(response => new Details(response.json()))
               .toPromise();
}
Run Code Online (Sandbox Code Playgroud)

对于数组使用:

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();
}
Run Code Online (Sandbox Code Playgroud)

有关此主题的学分和更多信息,请单击链接。

  • 是的,我的问题确实很好。这是“JS 糟糕的原因”的另一件事 (5认同)
  • 是的,这不是历史上最好的错误消息。无论如何,事后看来,我可能会稍微改一下我的答案。显然,在 Angular 中使用 TypeScript 接口没有任何作用,而是将 json 数据对象隐藏在接口后面。这就是为什么日期字符串本身不会转换为正确的日期格式的原因。 (2认同)

Rya*_*rty 5

dat1和dat2是JavaScript中的字符串。String原型上没有getTime函数。我相信您想要Date.parse()函数:http : //www.w3schools.com/jsref/jsref_parse.asp

您可以这样使用它:

var date = Date.parse(dat1);
Run Code Online (Sandbox Code Playgroud)

  • 我会说应该是“ var date = new Date(Date.parse(dat1));” (3认同)