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日:好像人们仍在这里着陆-今天,我将使用moment
或date-fns
完成此操作。Date-fns也非常轻巧。
该模式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是公历中年份的十进制数字。
- “-”(连音)在字符串中实际出现两次。
- MM是从01(一月)到12(十二月)的一年中的月份。
- DD是当月的一天,从01到31。
- “ T”字面上出现在字符串中,以指示时间元素的开始。
- HH是自午夜以来已经过去的完整小时数,为两位十进制数字。
- “:”(冒号)在字符串中实际出现两次。
- mm是从小时开始算起的完整分钟数,用两位十进制数字表示。
- ss是从分钟开始算起的完整秒数,以两位十进制数字表示。
- “。” (点)字面上出现在字符串中。
- sss是秒数开始以来的完整毫秒数,为三个十进制数字。这俩 ”。” 毫秒字段可以省略。
- Z是指定为“ Z”(对于UTC)或“ +”或“-”的时区偏移量,后跟时间表达式hh:mm
此格式包括仅日期形式:
- YYYY
- YYYY-MM
- YYYY-MM-DD
它还包括仅时间形式,并附加了可选的时区偏移量:
- 高度: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");
对我来说,仅仅因为Safari无法正确实现新库而实施一个新库就太多了,而正则表达式则显得过于刻板。这是oneliner:
console.log (new Date('2011-04-12'.replace(/-/g, "/")));
我面临着类似的问题。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
对我有用的解决方案是将dateString中的空间替换为"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返回了响应(比世界标准时间晚8个小时)
在同一个TZ中获得两个时间
苹果浏览器:
Date.parse("2017-01-22T11:57:00Z")
1485086220000
铬:
Date.parse("2017-01-22T11:57:00Z")
1485086220000
我用片刻来解决问题。例如
var startDate = moment('2015-07-06 08:00', 'YYYY-MM-DD HH:mm').toDate();
要使解决方案适用于大多数浏览器,您应使用以下格式创建日期对象
(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兼容。甚至旧版本。
将字符串从atat转换为Date(您必须知道服务器时区)
new Date('2015-06-16 11:00:00'.replace(/\s+/g, 'T').concat('.000+08:00')).getTime()
其中+08:00 =服务器的timeZone
我遇到了同样的问题。然后我用了片刻.J。问题消失了。
从字符串创建时刻时,我们首先检查字符串是否与已知的ISO 8601格式匹配,然后如果找不到已知格式,则退回到新的Date(string)。
警告:浏览器对字符串的支持不一致。因为没有关于应该支持哪种格式的规范,所以在某些浏览器中有效的格式在其他浏览器中无效。
为了获得一致的解析ISO 8601字符串以外的结果的结果,应使用字符串+格式。
例如
var date= moment(String);
尽管您可能希望浏览器支持ISO 8601(或其仅日期子集),但事实并非如此。我知道的所有浏览器(至少在我使用的美国/英语语言环境中)都可以解析可怕的美国MM/DD/YYYY
格式。
如果您已经拥有日期的各个部分,则可能要尝试使用Date.UTC()。如果不这样做,但必须使用YYYY-MM-DD
格式,我建议使用正则表达式来解析您知道的片段,然后将其传递给Date.UTC()
。
使用以下格式,它将在所有浏览器上正常工作
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);
//您现在的输出将是“ Tue,22 Mar 2016 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小时)。
进一步将任何日期对象转换为时间戳,您可以使用
alert(dateObj.getTime());
//输出看起来类似于此“ 1458671400000”
这将为您提供时间的唯一时间戳
如何劫持Date
与修复最新的?无依赖性,最小值+ gzip = 280 B
最好的方法是使用以下格式:
new Date(year, month, day, hours, minutes, seconds, milliseconds)
var d = new Date(2018, 11, 24, 10, 33, 30, 0);
所有浏览器均支持此功能,不会给您任何问题。请注意,月份从0到11。
在Safari中面临相同的问题,并将其插入网页即可解决
<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script>
希望它也能解决您的问题
谢谢
正如@nizantz先前提到的那样,在Safari中使用Date.parse()不适用于我。经过一些研究,我了解到File对象的lastDateModified属性已被弃用,而Safari不再支持该属性。使用File对象的lastModified属性解决了我的问题。当在网上发现错误信息时,一定会喜欢它。
感谢所有为这篇文章做出贡献的人,这些文章帮助我走上了学习我的问题所需要的道路。如果没有此信息,我可能永远也找不到我的根本问题。也许这会帮助我类似情况的其他人。
我在Safari浏览器中也遇到相同的问题
var date = new Date("2011-02-07");
console.log(date) // IE you get ‘NaN’ returned and in Safari you get ‘Invalid Date’
这里的解决方案:
var d = new Date(2011, 01, 07); // yyyy, mm-1, dd
var d = new Date(2011, 01, 07, 11, 05, 00); // yyyy, mm-1, dd, hh, mm, ss
var d = new Date("02/07/2011"); // "mm/dd/yyyy"
var d = new Date("02/07/2011 11:05:00"); // "mm/dd/yyyy hh:mm:ss"
var d = new Date(1297076700000); // milliseconds
var d = new Date("Mon Feb 07 2011 11:05:00 GMT"); // ""Day Mon dd yyyy hh:mm:ss GMT/UTC
尽管我只是捕捉到错误并发回当前日期,但这并不是最佳解决方案。我个人觉得如果用户要使用不符合sh * t标准的浏览器,就不能解决Safari问题-他们不得不忍受怪癖。
function safeDate(dateString = "") {
let date = new Date();
try {
if (Date.parse(dateString)) {
date = new Date(Date.parse(dateString))
}
} catch (error) {
// do nothing.
}
return date;
}
我建议您的后端发送ISO日期。
alert(new Date('2010-11-29'));
野生动物园无法正常使用这种处理日期格式的怪异/严格方法,alert(new Date(String('2010-11-29')));
例如:
(要么)
使用Moment js可以解决问题,但是在ios 14之后,Safari变得更奇怪了
尝试以下警报(moment(String(“ 2015-12-31 00:00:00”)));
瞬间JS
使用格式“ mm / dd / yyyy”。例如:-new Date('02 / 28/2015')。它适用于所有浏览器。
文章标签:date , javascript , safari
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!