2010-11-30 155 views
77
alert(new Date('2010-11-29')); 

chrome,ff对此没有问题,但Safari会呼叫“无效日期”。为什么?safari中的日期无效

编辑:好的,按下面的评论中,我使用的字符串解析和尝试这样:

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 
+0

只为其他看着同样的问题: 我结束了使用DateJS,它解决了我的问题整体。请参阅公认的答案的细节。 – Shrinath 2010-12-29 05:24:45

+1

使用[moment.js](http://momentjs.com/docs/)解析时间戳。特别是在处理跨平台网页时 – 2013-08-07 05:52:25

+1

这是一个老问题。从ECMAScript 2015开始,ISO 8601仅限日期的字符串被解析为UTC。但是,可能仍然存在较旧的浏览器,它们根本不会解析它或将它视为本地。 – RobG 2017-03-14 06:07:02

回答

103

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

下面是一些支持串,从this site采取:

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

DateJS好像一个用于解析非标准日期格式的好库。

编辑:刚刚检查ECMA-262 standard。从部分15.9.1.15报价:

日期时间字符串格式

ECMAScript中定义了基于ISO 8601 扩展格式的简化的日期时间 字符串 交换格式。格式 如下:YYYY-MM-DDTHH:MM:ss.sssZ 凡字段说明如下:

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

此格式包括日期唯一形式:

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

还我ncludes仅时间形成与 可选的时区偏移所附:

  • THH:毫米
  • THH:MM:SS
  • THH:MM:SS.SSS

还包括“日期时间”,其中 可以是上述的任何组合。

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

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

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"); 
+3

ISO8601格式用于ECMAScript标准的第5版,并且还没有得到广泛支持,最安全的方法去IMO,手动解析日期:( – CMS 2010-11-30 06:25:09

+2

AAARRRGGGHHH !!!它再次手动回来..: ( – Shrinath 2010-11-30 07:09:25

+2

字符串也不能在safari中工作:( – Shrinath 2010-12-01 04:13:20

3

虽然你可能希望浏览器将支持ISO 8601(或其日期只子集) , 不是这种情况。我所知道的所有浏览器(至少在我使用的美国/英语语言环境中)都能够解析可怕的美国MM/DD/YYYY格式。

如果你已经有日期的部分,你可以改为尝试使用Date.UTC()。如果你没有,但你必须使用YYYY-MM-DD格式,我建议使用正则表达式来解析你知道的棋子,然后将它们传递给Date.UTC()

128

对我来说,只是因为Safari不能正确地执行它而实施一个新的库太多了,而正则表达式却是过度的。 这里是oneliner

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

为了有一个解决大多数浏览器上工作,你应该用这种格式创建日期对象

(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 Dev Center: Date Object (JavaScript)

Mozilla Dev Network: Date

4

我有我以前moment.Js .Problem消失了一样issue.Then。

当创建一个字符串的时刻,我们首先检查是否知道ISO 8601的格式字符串 匹配,然后回落到如果 未发现已知的格式新的日期(字符串)。

警告:浏览器对解析字符串的支持不一致。由于 没有规定应支持哪种格式,因此某些浏览器中的 工作将无法在其他浏览器中使用。

为了解析除ISO 8601字符串以外的任何其他结果,您应该使用String + Format。

例如,

var date= moment(String); 
-1

使用'mm/dd/yyyy'格式。例如: - 新日期('02/28/2015')。它适用于所有浏览器。

4

字符串转换为日期fromat(你必须知道服务器时区)

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

其中+08:00 =从服务器

6

的timeZone我用时间来解决这个问题。 例如

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

使用以下格式,它会在所有的浏览器工作

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); 

//你的输出应该是这样的“周三2016年3月23日00:00:00 GMT + 0530 (IST)”

//注意,这将是在这种情况下,当前时区由IST表示,转换为UTC时区可以包括

alert(dateObj.toUTCSting); 

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

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

“toUTCSting”函数检索格林威治子午线的相应时间。通过确定您当前的时区与格林尼治子午时区之间的时差来完成此操作。

在上述情况下,转换前的时间为2016年3月23日00:00小时和分钟。并且在从GMT + 0530(IST)小时转换为GMT(基本上减去5.30小时在这种情况下给出时间戳),则时间反映了2016年3月22日的18.30小时(恰好在第一次后的5.30小时)。

进一步转换任何Date对象时间戳您可以使用

alert(dateObj.getTime()); 

//输出将类似于此的东西“1458671400000”

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

1

如何劫持Datefix-date?没有依赖关系,min + gzip = 280 B

5

我正面临类似的问题。 Date.Parse( “DATESTRING”)正在对Chrome浏览器(版本59.0.3071.115),但不是Safari浏览器(版本10.1.1(11603.2.5))

Safari浏览器:

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

铬:

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

解决方案为我工作是用“T”替换dateString中的空间。 (例如:dateString.replace(//g的, “T”))

Safari中:

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

铬:

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

注意,从Safari浏览器的响应为8小时(28800000ms)小于Chrome浏览器中显示的响应,因为Safari在本地TZ(即UTC的后面8小时)返回响应

为了同时获得两个时间TZ

Safari浏览器:

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

铬:

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

在Safari面临同样的问题,这是通过在网页中插入该解决

<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script> 

希望它也将你的工作案例太

谢谢