2012-01-17 77 views
0

這一直讓我發瘋,我需要按日期對Flash DataGrid列(不是Flex)進行排序。我試圖給日期列排序功能象下面這樣:在Flash AS3 DataGrid中排序日期

  colTwo.sortCompareFunction = sortDate; 

,這是功能:

 private function sortDate ($obj1,$obj2) : int { 

     trace("created date in sort "+$obj1["created"]); 

     var t1:Array = $obj1["created"].toString().split("-"); 
     var t2:Array = $obj2["created"].toString().split("-"); 
     var t1dt:Number=(new Date(Number(t1[0]),Number(t1[1]),Number(t1[2]))).getTime(); 
     var t2dt:Number=(new Date(Number(t2[0]),Number(t2[1]),Number(t2[2]))).getTime(); 

     trace(t1dt); 

     if(t1dt < t2dt) { 
      return -1; 
     } else if(t1dt == t2dt) { 
      return 0; 
     } else { 
      return 1; 
     } 
    } 

但這似乎仍試圖將列按字母順序排序。

任何幫助,將不勝感激。

+1

難道你不能通過UNIX時間戳進行排序嗎? – AsTheWormTurns

+0

我做了一些搜索,並將我的日期轉換爲unix時間戳,它工作得很好,謝謝。 – redHouse71

+0

不客氣:-) – AsTheWormTurns

回答

1

通過redHouse71答案是確定的,因爲它會給你一個正確的結果,但作爲一個代碼示例......好吧,下面是另一種變體,它基本上是一樣的東西,但不那麼羅嗦。

private function sortDate(a:Object, b:Object):int 
{ 
    var difference:Number = 
     this.truncateDate(a) - this.truncateDate(b); 

    return difference/Math.abs(difference); 
} 
// replace Object with the proper type 
private function truncateDate(object:Object):uint 
{ 
    return (object.created as Date).time * 0.0001; 
} 

編輯:但爲什麼你必須截斷日期秒?此外,沒有必要嚴格返回-1,0,1,基本上你可以用this.truncateDate(a) - this.truncateDate(b)來取消 - 我添加了「四捨五入」以使其表現爲原始答案。

0

正如在評論中提到的,轉換爲UNIX時間戳的工作原理:

public function sortDate ($obj1,$obj2) : int { 

     var dateOne:Date = $obj1["created"]; 
     var epoch:Number = Math.round(dateOne.valueOf()/1000); 

     var dateTwo:Date = $obj2["created"];; 
     var epochTwo:Number = Math.round(dateTwo.valueOf()/1000); 


     var t1dt:Number = epoch; 
     var t2dt:Number = epochTwo; 

     if(t1dt < t2dt) { 
      return -1; 
     } else if(t1dt == t2dt) { 
      return 0; 
     } else { 
      return 1; 
     } 
    }