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

为什么JavaScript getTime()不是函数?,javascript,function,date,gettime,Javascript,Function,Date,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*mi

我使用了以下功能:

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);
}
// 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的实例

此方法始终与日期对象一起使用

请参阅下面的代码:

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

链接:

这是因为
dat1
dat2
变量只是字符串

您应该解析它们以获得
Date
对象,对于该格式,我始终使用以下函数:

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);
}
// 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
}

我之所以使用此函数,是因为(或
newdate(string)
)方法依赖于实现,并且yyyy-MM-dd格式将在现代浏览器上工作,但在IE上不起作用,因此我更喜欢手动操作。

dat1和dat2是JavaScript中的字符串。字符串原型上没有getTime函数。我相信您需要Date.parse()函数:

您可以这样使用它:

var date = Date.parse(dat1);

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

我面临这个错误,因为我试图用以下方法比较两个日期

var res = dat1.getTime() > dat2.getTime(); // or any other comparison operator
然而,我确信我使用了一个日期对象,因为我将angularjs与typescript一起使用,并且我从一个类型化API调用中获得了数据

我不知道为什么会出现这个错误,但我假设因为我的对象是通过JSON反序列化创建的,所以可能没有将
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(id:number):承诺{
返回此文件。http
.get(`${this.baseUrl}/api/details/${id}`)
.map(response=>newdetails(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();
}
public getDetails():承诺{
返回此文件。http
.get(`${this.baseUrl}/api/details`)
.map(响应=>{
const array=JSON.parse(response.JSON())作为任意[];
const details=array.map(data=>newdetails(data));
退货详情;
})
.toPromise();
}

关于这个主题,请点击链接。

我认为应该是
var date=new date(date.parse(dat1))@Hexodus:为什么会这样?@EdS.你是对的-两种方法都会产生相同的结果,因此应该使用Rayan的解决方案,因为它比较短。是的,我的问题就是这样。除了“JS糟糕的原因”之外,还有一件事需要补充,这并不是历史上最好的错误消息。不管怎样,事后看来,我很可能会把我的答案改写一点。显然,在angular中使用typescript接口没有任何作用,只是将json数据对象隐藏在接口后面。这就是为什么日期字符串本身无法转换为正确的日期格式。