2017-09-25 74 views
2

我正在开发一个Angular(4.1.2)Web应用程序以及相应的ASP.Net Core(1.1)Web API。从Web API响应的角度日期

我有一个Angular服务,它向我的Web API发出一个http请求数据,而从Angular服务返回的对象中的日期不是Date类型。

在我的场景中,我的web应用程序从我的SQL数据库获取Tasks,每个Task包括开始和结束DateTime。我的TasksController使用AutoMapper将每个Task映射到TaskViewModel对象,我的TaskViewModel具有DateTime类型的开始和结束属性。

如果我把我的TasksController一个断点并检查TaskViewModel对象要返回,该请求之后,开始和结束属性DateTime型的,因此对日,月,小时等无一不精。

在角我有一个task-api.service.ts文件,其中包含下面的代码:

public getTasks(): Observable<Task[]> { 
    let tasksArray: Observable<Task[]> = this.http.get("/api/tasks").map((response: Response) => { 
     return <Task[]>response.json(); 
    }).catch(this.handleError); 

    tasksArray.forEach(item => { 
     console.log("Start: " + 
      item.map(task => { 

       if (task.start instanceof Date) { 
        console.log(task.start + " is date."); 
       } else { 
        console.log(task.start + " is not date."); 
       } 

      })); 
    }); 

    return tasksArray; 
} 

当我console.log()它们看起来2017-01-01T1 0:00:00开始和结束日期。我测试了日期以检查它们。

我的角度Task类的定义是这样的:

export class Task { 

private _children: Task[]; 

get children(): Task[] { 
    //console.log("Getting children"); 
    return this._children; 
}; 
set children(value: Task[]) { 
    //console.log("Setting children"); 
    this._children = value; 
}; 

constructor(
    public id: string, 
    public scheduleId: string, 
    public description: string, 
    public taskTypeId: number, 
    public taskType: string, 
    public locationId?: number, 
    public start?: Date, 
    public finish?: Date, 
    public duration?: number, // milliseconds 
    public parentId?: string, 
    public dependentTaskId?: string, 
    public label?: string, 
    children?: Task[]) 
    { 
     if (children != null) 
     { 
      this.children = children; 
     }; 
    } 
}; 

如何确保开始和结束日期在我的打字稿对象是Date型的吗?

+0

为什么要检查的响应类型是最新的吗?你可以转换为你想要的类型。对? –

+0

我只是检查类型,以帮助我调查为什么日期不被我的使用日期的业务逻辑代码所理解。我可观察的Tasks数组中的开始和结束属性只是字母和数字的字符串,而不是日期,因此我的业务逻辑不能与它们一起工作。 – TDC

+0

你解决了这个问题吗?我正在经历同样的事情。从web api收到的日期有getMonth,getFullYear等未定义的值。 –

回答

0

你试过dateReviver吗?

public getTasks(): Observable<Task[]> { 
    let tasksArray: Observable<Task[]> = this.http.get("/api/tasks") 
       .map((response: Response) => { 
         return <Task[]>JSON.parse(response, dateReviver); 
       }).catch(this.handleError); 
} 

function dateReviver(key, value) { 
    var a; 
    if (typeof value === 'string') { 
     a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); 
     if (a) { 
      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], 
         +a[5], +a[6])); 
      } 
    } 
    return value; 
}; 

注意:小心日期时间种类。 UTC或本地。

参考:

https://docs.microsoft.com/en-us/scripting/javascript/reference/json-parse-function-javascript

http://james.newtonking.com/archive/2009/04/12/native-json-in-ie8-firefox-3-5-plus-json-net