Safari浏览器中的date无效

alert(new Date('2010-11-29')); 

铬,ff没有这个问题,但safari呼喊“无效date”。 为什么?

编辑:好的,根据下面的评论,我用stringparsing,并试图这样做:

 alert(new Date('11-29-2010')); //doesn't work in safari alert(new Date('29-11-2010')); //doesn't work in safari alert(new Date('2010-29-11')); //doesn't work in safari 

模式yyyy-MM-dd不是Date构造函数正式支持的格式。 Firefox似乎支持它,但不要指望其他浏览器也这样做。

以下是一些支持的string,取自这个网站 :

  • MM-DD-YYYY
  • YYYY / MM / DD
  • MM / DD / YYYY
  • MMMM dd,yyyy
  • MMM dd,yyyy

DateJS似乎是parsing非标准date格式的好库。

编辑 :只检查了ECMA-262标准 。 引用15.9.1.15节:

date时间string格式

ECMAScript根据ISO 8601扩展格式的简化定义了date时间的string交换格式。 格式如下:YYYY-MM-DDTHH:mm:ss.sssZ其中的字段如下:

  • YYYY是公历中的年份的十进制数字。
  • “:”(hyphon)字面上出现两次。
  • MM是从01(1月)到12(12月)的一年中的月份。
  • DD是从01到31的月份的一天。
  • T“T”字面上出现在string中,表示时间元素的开始。
  • HH是自午夜以来经过的完整小时数,以小数点后两位数表示。
  • :“:”(冒号)string中出现两次。
  • mm是小时开始以来的完整分钟数,为两位十进制数字。
  • ss是自分钟开始以来的完整秒数,以两位十进制数字表示。
  • 。 “” (点)字面上出现在string中。
  • sss是从第二秒开始的完整毫秒数,为三位十进制数字。 这俩 ”。” 毫秒字段可以省略。
  • Z是指定为“Z”的时区偏移量(UTC)或“+”或“ – ”,后跟时间expression式hh:mm

此格式包含仅限date的表单:

  • YYYY
  • YYYY-MM
  • YYYY-MM-DD

它还包括附带可选时区偏移的带时间表单:

  • THH:MM
  • THH:MM:SS
  • THH:MM:SS.SSS

还包括可能是上述任何组合的“date时间”。

所以,YYYY-MM-DD似乎被包括在标准中,但由于某些原因,Safari不支持它。

更新 :查看datejs文档后 ,使用它,你的问题应该使用这样的代码来解决:

 var myDate1 = Date.parseExact("29-11-2010", "dd-MM-yyyy"); var myDate2 = Date.parseExact("11-29-2010", "MM-dd-yyyy"); var myDate3 = Date.parseExact("2010-11-29", "yyyy-MM-dd"); var myDate4 = Date.parseExact("2010-29-11", "yyyy-dd-MM"); 

对于我来说,实施一个新的图书馆,只是因为Safari不能正确地做到这一点太多,正则expression式是矫枉过正。 这里是oneliner

 console.log (new Date('2011-04-12'.replace(/-/g, "/"))); 

我用时刻解决问题。 例如

 var startDate = moment('2015-07-06 08:00', 'YYYY-MM-DD HH:mm').toDate(); 

我有同样的问题。然后我用了一会儿。问题已经消失了。

当从string创build一个片刻时,我们首先检查string是否与已知的ISO 8601格式匹配,如果没有find已知的格式,则返回到新的Date(string)。

警告:浏览器支持分析string不一致。 因为没有关于哪种格式应该被支持的规范,所以某些浏览器中的工作在其他浏览器中将不起作用。

为了parsingISO 8601string以外的任何其他结果,应该使用String + Format。

例如

 var date= moment(String); 

将string转换为datefromat(你必须知道服务器时区)

 new Date('2015-06-16 11:00:00'.replace(/\s+/g, 'T').concat('.000+08:00')).getTime() 

其中+08:00 =来自服务器的时区

虽然您可能希望浏览器支持ISO 8601 (或仅限于date的子集),但事实并非如此。 我所知道的所有浏览器(至less在我使用的美国/英语语言环境中)都能够parsing可怕的美国MM/DD/YYYY格式。

如果你已经有date的部分,你可能会想尝试使用Date.UTC() 。 如果你不这样做,但你必须使用YYYY-MM-DD格式,我build议使用一个正则expression式来parsing你知道的部分,然后把它们传递给Date.UTC()

要在大多数浏览器上运行解决scheme,应该使用此格式创builddate对象

 (year, month, date, hours, minutes, seconds, ms) 

例如:

 dateObj = new Date(2014, 6, 25); //UTC time / Months are mapped from 0 to 11 alert(dateObj.getTime()); //gives back timestamp in ms 

适用于IE,FF,Chrome和Safari。 甚至更旧的版本。

IE开发人员中心:date对象(JavaScript)

Mozilla开发者networking:date

使用下面的格式,它将适用于所有的浏览器

 var year = 2016; var month = 02; // month varies from 0-11 (Jan-Dec) var day = 23; month = month<10?"0"+month:month; // to ensure YYYY-MM-DD format day = day<10?"0"+day:day; dateObj = new Date(year+"-"+month+"-"+day); alert(dateObj); 

//你的输出看起来像这样“Wed Mar 23 2016 00:00:00 GMT + 0530(IST)”

//注意,这将在当前时区(在这种情况下由IST表示)转换为您可以包含的UTC时区

 alert(dateObj.toUTCSting); 

//你的输出现在就是这样“2016年3月22日18:30:00 GMT”

请注意,现在dateObj以GMT格式显示时间,还请注意,date和时间已经相应更改。

“toUTCSting”函数检索格林威治子午线的相应时间。 这是通过build立您目前的时区与格林威治时区之间的时差来完成的。

在上述情况下,转换前的时间是2016年3月23日的00:00小时和分钟。在从GMT + 0530(IST)小时转换到GMT(基本上从此时的给定时间戳减去5.30小时的情况下)的时间反映了2016年3月22日18时30分(比第一次晚5.30小时)。

进一步将任何date对象转换为时间戳,您可以使用

 alert(dateObj.getTime()); 

//输出看起来类似于这个“1458671400000”

这会给你时间的唯一时间戳

如何劫持Date与修复date ? 没有依赖关系,min + gzip = 280 B

我正面临类似的问题。 Date.Parse(“DATESTRING”)正在使用Chrome(版本59.0.3071.115),而不是Safari(版本10.1.1(11603.2.5))

苹果浏览器:

 Date.parse("2017-01-22 11:57:00") NaN 

铬:

 Date.parse("2017-01-22 11:57:00") 1485115020000 

我的解决scheme是用“T”replacedateString中的空格。 (例如:dateString.replace(/ / g,“T”))

苹果浏览器:

 Date.parse("2017-01-22T11:57:00") 1485086220000 

铬:

 Date.parse("2017-01-22T11:57:00") 1485115020000 

请注意,Safari浏览器的响应时间比Chrome浏览器中的响应时间less8小时(28800000ms),因为Safari在本地TZ(UTC时间后8小时)返回响应,

要在同一个TZ获得两个时间

苹果浏览器:

 Date.parse("2017-01-22T11:57:00Z") 1485086220000 

铬:

 Date.parse("2017-01-22T11:57:00Z") 1485086220000 

使用格式“mm / dd / yyyy”。 例如: – 新的date('02 / 28/2015')。 它适用于所有浏览器。