在Flash AS3 DataGrid中对日期进行排序

时间:2012-01-17 09:42:56

标签: flash actionscript-3 datagrid

这让我很疯狂,我需要按日期对Flash DataGrid列(而不是Flex)进行排序。我试过给日期列一个类似下面的排序函数:

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

但是这似乎仍然试图按字母顺序对列进行排序。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分: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) - 我添加了“舍入”以使其表现为原始答案。

答案 1 :(得分: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;
        }
    }