【问题标题】:Inconsistent behavior of JavaScript Date() function in iOS [duplicate]iOS中JavaScript Date()函数的行为不一致[重复]
【发布时间】:2019-03-15 05:39:40
【问题描述】:

我使用Date() 函数将MySQL Date 转换为JS Date 对象。 以下是我如何做的代码:

var a = "2019-03-12 12:30:03"; //MySQL Date

function MySQLToDate(dateString) {
   if (typeof dateString === 'string') {
      return new Date(dateString);
   }
   else {
      return dateString; //in case the argument is already an object
   }
}

alert(MySQLToDate(a));
//iOS Output: Invalid Date
//Normal Output: Tue Mar 12 2019 12:30:03 GMT+0530 (India Standard Time)

在我在 iPad 浏览器中对其进行测试之前,它完全可以正常工作。

它在 iOS 中返回 Invalid Date。当然,使用Date() 的原型函数如getDate()getMonth() 等返回Nan

所以为了克服这种情况,我进行了研究,在其中一个答案中,我发现将 MySQL 日期直接传递给 JS Date 函数是一种错误的做法。 [Source]

现在我的代码如下所示:

var a = "2019-03-12 12:30:03"; //MySQL Date

function MySQLToDate(dateString) {
   if (typeof dateString === 'string') {
      return new Date(dateString.replace(" ","T"));
   } 
   else {
       return dateString; //in case the argument is already an object
   }
}

alert(MySQLToDate(a));
//iOS Output: Tue Mar 12 2019 18:00:03 GMT+0530 (India Standard Time)
//Normal Output: Tue Mar 12 2019 12:30:03 GMT+0530 (India Standard Time)

此解决方案没有给出无效日期错误,而是给出了一个无效日期。

我还尝试拆分 MySQL 日期并将年、月、日、小时、分钟、秒传递到 Date(),但对象中的时间仍然错误。

欢迎您的回答。

【问题讨论】:

  • @RK_15 这与我在我的问题中给出的答案(接受的)相同的问题。这个答案会给你一个错误的日期时间而不是一个无效的日期。
  • "2019-03-12 12:30:03" 不是 ECMA-262 支持的格式,因此解析取决于实现。 Apple 浏览器通常会返回无效日期。 "2019-03-12T12:30:03" 应该被解析为本地,但 Apple 浏览器将其解析为 UTC。手动解析的时候记得把月份减1。

标签: javascript ios date


【解决方案1】:

你可以拆分字符串,然后使用Date的构造函数:

// Use this constructor
    new Date(year, month, day, hours, minutes, seconds, milliseconds)

// code goes like this
    let tokens = "2019-03-12 12:30:03".split(/[-: ]/g)
    let date = new Date(tokens[0], parseInt(tokens[1]) -1, tokens[2], tokens[3], tokens[4], tokens[5]);
    console.log(date);

此解决方案适用于 safari、chrome 和 firefox 浏览器。

【讨论】:

  • 应该是new Date(tokens[0], tokens[1] - 1, ...) 并且这些位不是真正的标记,它们是子字符串。 ;-)
  • 小心,这个会带你回一个月。
  • 我已经更正了
【解决方案2】:

您得到的“无效”时间看起来很像“双”IST 时区日期。 IST = 印度标准时间比格林威治标准时间 (GMT+5.5) 早 5.5 小时(5 小时 30 分钟)。

在解析/替换日期中的'T' 时,请确保在末尾添加'Z',以指示祖鲁时间。祖鲁时间与时区无关 (UTC)。

return new Date(dateString.replace(" ","T") + "Z");

不确定 iPad 是否自行选择时区,但无论哪种方式,您都没有指定任何时区,因此您将其保留为开放状态,以供其自行解释和喜欢。

【讨论】:

  • 这似乎更像是评论而不是答案。 Apple 浏览器将没有时区的 ISO 8601 格式的时间戳解析为 UTC(这与 ISO 8601 和 ECMA-262 不一致)。在所有实现中,添加“Z”会将时间戳从本地更改为 UTC。
  • 谢谢@RobG 和@Ramon,我尝试了这个,没有添加 T 和 Z,但做了一点改动,即 return new Date(dateString.replace(/-/g, '/'));。它适用于多个时区。
  • @RJ——这是一个糟糕的解决方案,因为它将格式更改为 ECMA-262 不支持的格式,这意味着结果取决于实现。它可能在某个时候失败,只是你还没有发现。 RK_15's answer 是一个更好的解决方案,因为它符合标准。
猜你喜欢
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2014-08-23
  • 2015-10-24
  • 2013-05-13
相关资源
最近更新 更多