在javascript中排序UTC日期

时间:2012-04-12 19:56:27

标签: javascript mvvm knockout.js date-sorting

EDIT 4/16/2012:我解决了将时区缩写为字母格式的问题,必须下载第三方排序方法并添加一些内容才能获得所需的结果。现在唯一的问题是Daylight Savings Time处理程序,但是有很多主题。但是,如果有人知道如何处理UTC Daylight Savings hanlers,请随时提供帮助。

谢谢大家。 ////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// / 我已经创建了一个html表,我使用了一个javscript viewmodel,使用knockoutjs从私有服务器中获取信息,使用JSON函数。我正在尝试使每个列都可排序(单击列标题一次,根据该列的信息按降序排列所有内容;再次单击标题以使所有内容按升序排列,第三次单击以获取其中所有内容的原始顺序)。

请注意:我已经搜索了我的问题,并且已经看到了其他解决方案,但到目前为止没有任何方法对我有用。我希望找到一个针对我的代码的解决方案。

Javascript ViewModel.js文件基本上是这样的:

Event(column1, column2, ...., columnN){
    var self = this;
    self.column1 = column1;
    self.column2 = column2;
    .
    .
}

//Sort column2 that has the Dates (dd (day) HHMM (hours/minutes) mmm (month) yy (year) format)

self.sortColumn = "Column2"
self.sortAscending = true;

self.SortByDates = function(){
    if(self.sortColumn == "Column2")
        self.sortAscending = !self.sortAscending;
    else{
        self.sortColumn = "Column2"
        self.sortAscending = true;
    }
    self.rows.sort(function(a,b){
        if(self.sortAscending == true)
            for(self.Column2 in self.rows)
                return a.Column2 > b.Column2 ? 1 : a.Column2 < b.Column2 ? -1 : 0;
            else
                return a.Column2 < b.Column2 ? 1 : a.Column2 > b.Column2 ? -1 : 0;
    });
}

//specify location of server and info and get them
function getEvents(){
    $.getJSON("http://.........",
        function (data){
            $.each(data.d, function(i, item){
                handleEvent(item)
            })
        }
    );
}
//pushes (AKA populates) info from server into the table
function handleEvent(item){
    var newEvent = new Event(item.Column1InfoFromServer,
                                formatJSONDate(item.Column2DateInfoFromServer), .....)
    this.Model.rows.push(newEvent);
}
//Formats the date info from server into dd (day) HHMM (hours/minutes) mmm (month) yy (year)
formatJSONDate(jsonDate){
    var date = new Date(parseInt(jsonDate.substr(6)));
    return date.format("dd HHMM mmm yy");
}

this.Model = new ViewModel();
this.getEvents();
ko.applyBindings(this.Model);

我有一个很难的时间以转换后的形式获取日期(是的,它必须采用该形式 - &gt;实际上,我仍然需要弄清楚如何将时区缩写包括在内在'HHMM'部分基于UTC之后)。所以我可以说“11 1136 Apr 12”和“22 1624 Jan 12”等表中的其他日期。现在,当我尝试根据日期对表进行排序时,它们没有适当排序。感谢任何帮助,谢谢。

编辑:要清楚,我正在尝试在军事时区代码中显示时区(时区'A' - 'Z')。此外,从服务器获取的日期已经是UTC。

2 个答案:

答案 0 :(得分:1)

<强>更新

我正在看另一个问题,有人创建了一个淘汰网格插件: https://github.com/ericmbarnard/KoGrid

我打赌这可能会帮助你: - )

---怀旧的旧答案----

Underscore库中有一些很棒的辅助函数,其中一个是sort:

http://documentcloud.github.com/underscore/#sortBy

  

sortBy_.sortBy(list,iterator,[context])返回的排序副本   列表,按运行每个值的结果按升序排列   通过迭代器。迭代器也可以是属性的字符串名称   按(例如,长度)排序。

_.sortBy([1, 2, 3, 4, 5, 6], function(num){ return Math.sin(num); });
=> [5, 4, 6, 3, 1, 2]

我会给你一个机会,同时为你的约会创造一个更好的模型。听起来你需要存储一个独特的时间点属性,以及用户的文本值。

答案 1 :(得分:0)

好吧,要获取日期对象的数值,请按pDate.valueOf()排序。这将为您提供自纪元以来的毫秒数。

但是,排序函数内部存在问题,但我不确定它应该做什么。你不能在sort函数中遍历一个对象并返回这样的值。