Javascript日期在iOS上无效

Javascript日期在iOS上无效,javascript,android,ios,cordova,Javascript,Android,Ios,Cordova,我正在开发一个基于Phonegap的iOS应用程序,这已经在Android上完成了。以下几行代码在Android上运行良好,但在iOS上运行不好。为什么? var d = new Date("2015-12-31 00:00:00"); console.log(d.getDate() + '. ' + d.getMonth() + ' ' + d.getFullYear(); Android的结果: 31.11 2015 在iOS上的结果: NaN. NaN NaN 差异从何而来?我无法告

我正在开发一个基于Phonegap的iOS应用程序,这已经在Android上完成了。以下几行代码在Android上运行良好,但在iOS上运行不好。为什么?

var d = new Date("2015-12-31 00:00:00");
console.log(d.getDate() + '. ' + d.getMonth() + ' ' + d.getFullYear();
Android的结果:

31.11 2015
在iOS上的结果:

NaN. NaN NaN

差异从何而来?

我无法告诉你原因。可能是因为iOS不像Android那样支持Javascript日期函数,或者不支持其他格式

但我可以给你一个解决办法:

var s = "2015-12-31 00:00:00".split(" ")[0].split("-"),
    d = new Date( s[0], s[1], s[2], 0, 0, 0 );

console.log(d);


尝试使用
var d=新日期(“2015/12/31 00:00:00”)适用于我。

您的日期字符串的格式不是指定用于
新日期的格式。规范中唯一的格式是,但这只是在ES5中添加的,因此支持可能是触控式的。您的字符串不是那种格式,但它非常接近

如果将空格更改为a
T
,则符合规范:

var dateString = "2015-12-31 00:00:00";
var d = new Date(dateString.replace(' ', 'T'));
(我假设您实际上没有使用字符串文字,因此调用了
replace

请注意,ES5规范中有一个错误已在ES2015(ES6)中更正:当字符串上没有时区指示器时会发生什么情况。在ISO-8601中,没有指示器表示“本地时间”,但ES5规范表示它默认为
Z
(UTC,GMT)。他们在ES2015规范中修复了它,但不幸的是,一些JavaScript引擎遵循ES5规范,而其他引擎遵循ISO-8601(现在是ES2015)。但是,等等,情况会变得更糟:对只包含日期的字符串使用本地时间对于现有代码来说是有问题的(TC39真的,真的试图不破坏现有代码),所以在ES2016中,他们不得不再次更改它,说:如果它是一个只包含日期的字符串,将其解释为UTC,但如果它是一个日期/时间字符串,则将其解释为本地时间

因此,为了获得可靠的跨浏览器支持,您需要包含一个时区指示器,因为否则您不知道它将被解释为UTC还是本地时间。您可以使用GMT的
Z
+/-
后跟
HH:MM
来给出偏移量。(不允许使用诸如
CST
之类的缩写,因为它们没有标准。)

如果他们还不支持这一点,那么对
yyyyy/MM/DD HH:MM:SS
(解释为本地时间)几乎有普遍的支持,即使没有指定。因此:

var dateString = "2015-12-31 00:00:00";
var d = new Date(dateString.replace(/-/g, '/'));

为我工作:)


感谢@dda

这是一个同时适用于IOS和Android的解决方案,并且在不需要时避免字符串操纵

let fullDate = "1991-03-29 00:00:00";
let date = new Date(fullDate);

// In case its IOS, parse the fulldate parts and re-create the date object.
if(Number.isNaN(date.getMonth())) {
  let arr = fullDate.split(/[- :]/);
  date = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
}

如果有人还在找的话

在IE、Safari、IOS-FF、IOS Safari中为我工作。。。等等

getIOSSaveDateObj = function(dateString){
    if(dateString.indexOf('-') > 0){
        var arr = dateString.split(/[- :]/);
        var date = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
    }else{
        var arr = dateString.split(/[. :]/);
        var date = new Date(arr[2], arr[1]-1, arr[0], arr[3], arr[4], arr[5]);
    }
    return date;
}

我花了很长时间试图解决这个问题,最终我找到了一个更简单的解决方案并使用了它。你不需要做太多事情,只需在每台设备上声明日期和工作方式。

@PhilippSiegfried:太好了,很高兴能帮上忙@NULL:我从未见过不支持它的JavaScript引擎。IE6及以上版本,我见过的每一个Firefox版本,每一个Chrome版本,每一个Opera版本。但是,我们必须始终在目标环境上进行测试(遗憾的是,有些东西是否“标准”)。在我自己的测试中,我发现
YYYY/MM/DD HH:MM:SS
解决方案在iOS上给出的日期与我希望从
YYYY-MM-DD HH:MM:SS
获得的日期相同,而用
T
替换空格的解决方案将我的日期调整为时区数量。。(时间增加10小时)。(小结:
YYYY/MM/DD HH:MM:SS
有效,
yyy-MM-DDTHH:MM:SS
根据时区和某些可能出错的情况进行调整)@user1290746:可能是规范中的
Z
错误,我在上面添加了一个注释。您节省了我的时间,非常感谢如果不使用a
t
替换空格,我的iPhone MN4P2X/a和Safari将无法正常工作。它需要日期和时间之间的T,或者它返回“无效日期”@NULLpointer它对我有效,可能是因为旧版本。无论如何,我编辑了我对你评论的回答。更正了我的评论-你编辑的回答(用T代替空格)这对我来说很有效。我会尝试一下,然后回复你这是一个有效的解决方案。可以在iOS和其他系统上使用。然而,由于某种原因,如果你的日期是2019年2月1日,那么由于某种原因,日期会倒退一个月<代码>var s=d.replace(/[:]/g,“-”).split(“-”)console.log(新日期(s[0],s[1]-1,s[2])这在我的iPhone MN4P2X/A和Safari上不起作用。它需要日期和时间之间的T,否则返回“无效日期”
let fullDate = "1991-03-29 00:00:00";
let date = new Date(fullDate);

// In case its IOS, parse the fulldate parts and re-create the date object.
if(Number.isNaN(date.getMonth())) {
  let arr = fullDate.split(/[- :]/);
  date = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
}
getIOSSaveDateObj = function(dateString){
    if(dateString.indexOf('-') > 0){
        var arr = dateString.split(/[- :]/);
        var date = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
    }else{
        var arr = dateString.split(/[. :]/);
        var date = new Date(arr[2], arr[1]-1, arr[0], arr[3], arr[4], arr[5]);
    }
    return date;
}