iOS上的Javascript日期无效

Phi*_*ied 42 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();
Run Code Online (Sandbox Code Playgroud)

Android的结果:

31.11 2015
Run Code Online (Sandbox Code Playgroud)

iOS上的结果:

NaN. NaN NaN
Run Code Online (Sandbox Code Playgroud)

差异来自哪里?

T.J*_*der 99

您的日期字符串的格式不符合要求new Date.规范中唯一的格式是ISO-8601的简化版本,但仅在ES5中添加,因此支持可能是触摸和去.你的字符串不是那种格式,但它真的很接近.

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

var dateString = "2015-12-31 00:00:00";
var d = new Date(dateString.replace(' ', 'T'));
Run Code Online (Sandbox Code Playgroud)

(我假设你实际上并没有使用字符串文字,因此replace调用.)

请注意,ES5规范中存在错误,该错误已在ES2015(ES6)中得到纠正:当字符串上没有时区指示符时会发生什么.在ISO-8601中,没有指标表示"本地时间",但ES5规范表示它默认为Z(GMT).他们在ES2015规范中修复了它,但遗憾的是一些JavaScript引擎遵循ES5规范,其他一些遵循ISO-8601(现在是ES2015),因此为了实现跨浏览器支持,您需要包含时区指示器,否则您不会知道它是否会被解释为GMT或当地时间.你被允许Z用于GMT或者+/-随后HH:MM用于抵消.(CST不允许使用缩写,因为它们没有标准.)

如果他们还不支持,即使它没有证件,也几乎得到普遍的支持YYYY/MM/DD HH:MM:SS.所以:

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

  • 在我自己的测试中,我发现`YYYY/MM/DD HH:MM:SS`解决方案在iOS上给出了与我希望从YYYY-MM-DD HH:MM:SS`获得相同的日期,而解决方案用"T"替换空间用时区量调整我的日期..(加上10小时的时间).(摘要:**`YYYY/MM/DD HH:MM:SS`工作**,`YYYY-MM-DDTHH:MM:SS`根据时区进行调整,对于某些情况会出错) (6认同)
  • @NULL:我从未见过不支持它的 JavaScript 引擎。IE6 及更高版本,我见过的每个版本的 Firefox,每个版本的 Chrome,每个版本的 Opera。**但是**,必须始终在目标环境上进行测试(遗憾的是,无论某些东西是否“标准”)。 (2认同)

and*_*lrc 6

我不能告诉你为什么.也许是因为iOS不支持Javascript Date功能以及Android,或支持不同的格式?

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

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);
Run Code Online (Sandbox Code Playgroud)
var s = "2015-12-31 00:00:00".replace(/[ :]/g, "-").split("-"),
    d = new Date( s[0], s[1], s[2], s[3], s[4], s[5] );

console.log(d);
Run Code Online (Sandbox Code Playgroud)


小智 5

一种适用于 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]);
}
Run Code Online (Sandbox Code Playgroud)