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日:似乎人们仍然在这里着陆 - 今天,我会使用moment
或date-fns
完成它.Date-fns非常轻松无忧.
Elz*_*ugi 195
对我来说,实现一个新的库只是因为Safari无法正确执行它太多而且正则表达式是过度的.这是oneliner:
console.log (new Date('2011-04-12'.replace(/-/g, "/")));
Run Code Online (Sandbox Code Playgroud)
dar*_*ioo 150
该模式yyyy-MM-dd
不是Date
构造函数的官方支持格式.Firefox似乎支持它,但不要指望其他浏览器做同样的事情.
以下是一些受支持的字符串,取自此站点:
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)
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)
小智 10
我用时间来解决问题.例如
var startDate = moment('2015-07-06 08:00', 'YYYY-MM-DD HH:mm').toDate();
Run Code Online (Sandbox Code Playgroud)
要使解决方案适用于大多数浏览器,您应该使用此格式创建日期对象
(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.甚至是旧版本.
将字符串转换为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
我遇到了同样的问题。然后我用了片刻.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)
归档时间: |
|
查看次数: |
118673 次 |
最近记录: |