在Titanium Mobile中,日期不能正确比较

Dates don't compare correctly in Titanium Mobile

本文关键字:不能 比较 日期 Titanium Mobile      更新时间:2023-09-26

取以下代码:

var first = new Date("2011-09-17T15:12:04.331Z");
var second = new Date("2011-09-17T19:55:19.269Z");
alert(first < second);

在浏览器(http://jsfiddle.net/fdqjs/0/)中,它提示为true。在Titanium Mobile中,它警告0或false。为什么会这样?我无法获得与源文件不同格式的日期。

我的猜测是Titanium Mobile没有运行一个足够新的Javascript版本来覆盖你正在使用的日期格式。

如果你查找Date对象的规范,它采用RFC 1123中定义的日期,该日期从RFC 822中获得日期定义,这在我看来不像它支持你正在使用的确切格式。从Javascript 1.8.5开始,它也接受ISO 8601格式的日期,看起来它可能涵盖了你所拥有的。

如果可以的话,我建议修改你的日期字符串,使其像旧的规范一样工作。更多信息请看MDN。

一个有效的RFC822日期时间的例子是:
02 Oct 2002 15:00:00 +0200

如果你的日期总是与你在问题中显示的格式完全一致,那么你可以做一个简单的转换,像这样:

function ConvertDate(dateIn) {
    var monthStr = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    // desired format "02 Oct 2002 15:00:00 +0200"
    var dateOut = dateIn;
    var matches = dateIn.match(/('d+)'D+('d+)'D+('d+)T(.*)Z$/);
    if (matches) {
        dateOut = matches[3] + " " + 
            monthStr[parseInt(matches[2] - 1, 10)] + " " + 
            matches[1] + " " + 
            matches[4] + " GMT";
    }
    return(dateOut);
}

此处演示:http://jsfiddle.net/jfriend00/APxN7/.

注意:这个简单的函数假设你的日期总是在你的问题中显示的格式,并且总是有效的,因为它不会处理任何任意的ISO 8601日期作为输入,只处理你显示的格式。

要获得当前日期到一个javascript对象,你可以这样做:

var now = Date();

您可以在now对象上使用为Date对象定义的任何方法,包括获取日期的任何部分或将其转换为字符串的方法,等等....

要获取ConvertDate输出的日期的internet形式,您可以使用:

now.toUTCString();