Safari 中的日期无效

IT技术 javascript date safari
2021-01-18 01:49:34
 alert(new Date('2010-11-29'));

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

2018 年 3 月 22 日编辑:似乎人们仍然在这里登陆 - 今天,我会使用momentdate-fns完成它。Date-fns 也非常无痛且轻便。

6个回答

对我来说,仅仅因为 Safari 无法正确执行新库而实施新库太多了,而正则表达式太过分了。这是oneliner

console.log (new Date('2011-04-12'.replace(/-/g, "/")));
我认为这是我倾向于忘记 /-/g 而不是 '-' 的最佳答案
2021-03-20 01:49:34
这个单行帮助非常适合我的需要!谢谢!
2021-03-31 01:49:34
这对我来说也很简单。不敢相信 Safari 不喜欢 - 但带有 \\ 的相同格式有效。感谢@Elzo 并感谢 Shrinath 发布问题
2021-03-31 01:49:34
为没有实现图书馆而鼓掌
2021-04-11 01:49:34
我仍然不明白为什么人们想要将整个库用于单次使用。没有实现一个库的荣誉。
2021-04-11 01:49:34

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

以下是一些支持的字符串:

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

此格式包括仅日期格式:

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

它还包括带有可选时区偏移量的仅时间形式:

  • 高:毫米
  • 高:毫米:秒
  • 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");
ISO8601 格式用于 ECMAScript 标准的第 5 版,尚未得到广泛支持,这是 IMO 最安全的方法,手动解析日期:(
2021-03-15 01:49:34
那是非常有帮助的家伙.. 谢谢.. :) 最后最终使用 datejs 进行格式化。
2021-03-15 01:49:34
我的类似问题是由 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”,请注意时区格式中缺少冒号。
2021-03-16 01:49:34
对于将来的人,请注意,虽然 datejs 在大多数方面都很棒,但它并不能解决所有日期格式问题,尤其是 safari。这是一个 PITA,但如果您仍有问题,最好手动进行。
2021-03-27 01:49:34
Safari 是新的 Internet Explorer!
2021-04-01 01:49:34

我面临着类似的问题。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

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

苹果浏览器:

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

铬合金:

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

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

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

苹果浏览器:

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

铬合金:

Date.parse("2017-01-22T11:57:00Z")
1485086220000
不是特别有用,因为您以 UTC 而不是本地时间获取日期。
2021-03-24 01:49:34
替换(/-/g, '/')
2021-03-31 01:49:34
这条dateString.replace(/ /g,"T")神奇的代码行对我有用。:)
2021-04-04 01:49:34
或者,如果您不希望 Safari 和 Chrome 中的两个日期相同,则可以使用new Date(year, month, date, hours, minutes, seconds, milliseconds)构造函数。将字符串日期解析为其组件的数组,以便在构造函数中使用这些组件。@nizantz 如果您认为可以将这样的示例添加到您的答案中,那就太好了。
2021-04-09 01:49:34

我用 moment 来解决问题。例如

var startDate = moment('2015-07-06 08:00', 'YYYY-MM-DD HH:mm').toDate();
谢谢你的灵魂!它是互联网上唯一适用于 React 应用程序的应用程序:IOS IPAD/IPHONE: chrome/safari || 安卓:铬|| 窗户:镀铬。没有测试所有设备和操作系统版本,但它仍然适用于我找到的每个设备!
2021-03-12 01:49:34
对于任何未来的观众,请注意该moment库现已弃用
2021-03-14 01:49:34

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

(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 开发中心:日期对象 (JavaScript)

Mozilla 开发网络:日期

我认为 new Date(2014, 6, 25) 不会创建UTC时间,而是“2014-6-25T00:00”本地时区的时间戳。new Date(Date.UTC(2014, 6, 25)) 给出 UTC
2021-03-30 01:49:34