2017-09-25 76 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