iOS中的JavaScript Date()函数的行为不一致

时间:2019-03-15 05:39:41

标签: javascript ios date

我使用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日期函数是错误的做法。 [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(),但是对象中的时间仍然错误。

非常欢迎您回答。

2 个答案:

答案 0 :(得分: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浏览器中工作。

答案 1 :(得分:1)

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

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

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

不确定iPad是否自行选择时区,但是无论哪种方式都没有指定任何时区,因此您可以根据自己的理解和喜好保留它。