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')。 它适用于所有浏览器。