TDC*_*TDC 5 datetime angular2-observables angular
我正在开发一个 Angular (4.1.2) Web 应用程序以及相应的 ASP.Net Core (1.1) Web API。
我有一个 Angular 服务,它向我的 Web API 发出数据 http 请求,并且从 Angular 服务返回的对象中的日期不是类型Date
。
Tasks
在我的场景中,我的 Web 应用程序从 SQL 数据库获取数据,每个应用程序都Task
包含 start 和 finish DateTime
。我的 TasksController 使用 AutoMapper 将每个任务映射Task
到一个TaskViewModel
对象,并且我的 TasksControllerTaskViewModel
有一个类型为 的 start 和 finish 属性DateTime
。
如果我在 TasksController 中放置一个断点并检查TaskViewModel
要返回的对象,那么在请求之后,开始和结束属性都是类型DateTime
,因此日、月、小时等都可以。
在 Angular 中,我有一个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;
}
Run Code Online (Sandbox Code Playgroud)
当我console.log()
开始和结束日期时,它们看起来像2017-01-01T1 0:00:00
。我测试了日期来检查它们。
我的 AngularTask
类定义如下:
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;
};
}
};
Run Code Online (Sandbox Code Playgroud)
如何确保 Typescript 对象中的开始日期和结束日期符合类型Date
?
小智 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;
};
Run Code Online (Sandbox Code Playgroud)
注意:小心日期时间类型。UTC 或本地。
参考:
https://learn.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