Safari中的日期无效

Shr*_*ath 129 javascript safari date

 alert(new Date('2010-11-29'));
Run Code Online (Sandbox Code Playgroud)

chrome,ff对此没有问题,但是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
Run Code Online (Sandbox Code Playgroud)

编辑2018年3月22日:似乎人们仍然在这里着陆 - 今天,我会使用momentdate-fns完成它.Date-fns非常轻松无忧.

Elz*_*ugi 195

对我来说,实现一个新的库只是因为Safari无法正确执行它太多而且正则表达式是过度的.这是oneliner:

console.log (new Date('2011-04-12'.replace(/-/g, "/")));
Run Code Online (Sandbox Code Playgroud)

  • 这一行帮助非常适合我的需求!谢谢! (12认同)
  • *掌声*没有实施图书馆. (9认同)
  • 这对我来说也很简单.无法相信Safari不喜欢 - 但是与\\的格式相同.谢谢@Elzo并感谢Shrinath发布了这个问题 (4认同)
  • 我仍然不明白为什么人们想要将整个库用于一次用途。感谢没有实现一个库。 (2认同)
  • 但不一样啊!!new Date('2011-04-12'.replace(/-/g, "/")) 是当地时间午夜,new Date('2011-04-12') 是午夜 GMT。我不敢相信在过去的十年里没有人指出这一点! (2认同)

dar*_*ioo 150

该模式yyyy-MM-dd不是Date构造函数的官方支持格式.Firefox似乎支持它,但不要指望其他浏览器做同样的事情.

以下是一些受支持的字符串,取自此站点:

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

DateJS似乎是一个很好的解析非标准日期格式的库.

编辑:刚刚检查过ECMA-262标准.引自第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

它还包括附加了可选时区偏移的仅限时间的表单:

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

还包括"日期时间",其可以是上述的任何组合.

因此,似乎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");
Run Code Online (Sandbox Code Playgroud)

  • ISO8601格式用于ECMAScript标准的第5版,并且尚未得到广泛支持,是最安全的IMO手段,手动解析日期:( (4认同)
  • 我的类似问题是由Safari不知道如何以RFC 822时区格式读取时区引起的.我能够通过使用ISO 8601格式来解决这个问题.如果您控制了日期格式,我可以使用"yyyy-MM-dd'T'HH:mm:ss.sssXXX"来创建ie."2018-02-06T20:00:00.000 + 00:00".无论出于何种原因,Safari无法阅读"2018-02-06T20:00:00.000 + 0000",请注意时区格式中缺少冒号. (4认同)
  • Safari 是新的 Internet Explorer! (4认同)

niz*_*ntz 36

我面临着类似的问题.Date.Parse("DATESTRING")正在使用Chrome(版本59.0.3071.115),但没有使用Safari(版本10.1.1(11603.2.5))

苹果浏览器:

Date.parse("2017-01-22 11:57:00")
NaN
Run Code Online (Sandbox Code Playgroud)

铬:

Date.parse("2017-01-22 11:57:00")
1485115020000
Run Code Online (Sandbox Code Playgroud)

对我有用的解决方案是用dateString替换空间"T".(例如:dateString.replace(/ /g,"T"))

苹果浏览器:

Date.parse("2017-01-22T11:57:00")
1485086220000
Run Code Online (Sandbox Code Playgroud)

铬:

Date.parse("2017-01-22T11:57:00")
1485115020000
Run Code Online (Sandbox Code Playgroud)

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

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

苹果浏览器:

Date.parse("2017-01-22T11:57:00Z")
1485086220000
Run Code Online (Sandbox Code Playgroud)

铬:

Date.parse("2017-01-22T11:57:00Z")
1485086220000
Run Code Online (Sandbox Code Playgroud)

  • 这个 `dateString.replace(/ /g,"T")` 神奇的代码行对我来说是有效的。:) (2认同)
  • 替换(/-/g,'/') (2认同)

小智 10

我用时间来解决问题.例如

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

  • 对于任何未来的观众,请注意“时刻”库现已弃用 (3认同)

Lux*_*uxx 9

要使解决方案适用于大多数浏览器,您应该使用此格式创建日期对象

(year, month, date, hours, minutes, seconds, ms)
Run Code Online (Sandbox Code Playgroud)

例如:

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

适用于IE,FF,Chrome和Safari.甚至是旧版本.

IE开发中心:日期对象(JavaScript)

Mozilla Dev Network:日期


Anj*_*ova 6

将字符串转换为Date fromat(您必须知道服务器时区)

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

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


Sam*_*ath 5

我遇到了同样的问题。然后我用了片刻.J。问题消失了。

从字符串创建时刻时,我们首先检查该字符串是否与已知的ISO 8601格式匹配,然后如果找不到已知格式,则退回到新的Date(string)。

警告:浏览器对字符串的支持不一致。因为没有关于应该支持哪种格式的规范,所以在某些浏览器中有效的格式在其他浏览器中无效。

为了获得一致的解析ISO 8601字符串以外的结果的结果,应使用字符串+格式。

例如

var date= moment(String);
Run Code Online (Sandbox Code Playgroud)


小智 5

对于使用date-fns我们的人可以parseISO约会并使用它来格式化

无效的

import _format from 'date-fns/format';

export function formatDate(date: string, format: string): string {
  return _format(new Date(date), format);
}
Run Code Online (Sandbox Code Playgroud)

这个函数在 safari 上会抛出错误Invalid date

解决方案
要修复它,我们应该使用:

import _format from 'date-fns/format';

export function formatDate(date: string, format: string): string {
  return _format(new Date(date), format);
}
Run Code Online (Sandbox Code Playgroud)