我已经做了很多工作,以确保我的日期选择器创建的日期与转换为javascript Date对象兼容。我遵循了关于此堆栈溢出条目的建议:Invalid date in safari并使用以下命令从字符串中删除破折号: 新日期(' 2016年8月24日上午12:44' .replace(/ - / g," /"));除了Mac上的浏览器之外,它使所有其他操作系统和浏览器兼容。它仍然似乎safari不喜欢字符串中的完整月份名称。如果我被迫使用该格式,建议使用safari将字符串识别为日期的方法是什么?
答案 0 :(得分:1)
阅读有关Date()
的文档:
新日期(dateString)
表示日期的字符串值。该字符串应采用Date.parse()方法识别的格式(符合IETF的RFC 2822时间戳以及ISO8601的版本)。
另请注意以下内容,这意味着您在执行此操作时必须格外小心。
注意:由于浏览器差异和不一致,强烈建议不要使用Date构造函数(和Date.parse,它们是等效的)解析日期字符串。
请参阅Date.parse
的文档,其中明确说明了接受的日期格式:
表示RFC2822或ISO 8601日期的字符串(可以使用其他格式,但结果可能是意外的)。
您尝试解析的格式既不是受支持的格式,也不是必须期望在不同浏览器中使用不同的行为。
就个人而言,我总是使用ISO 8601格式的日期(例如2016-06-16T06:15:24.040Z
)。使用这样的标准还支持添加在多时区应用中至关重要的时区。
哦顺便说一句:将本地化的日期字符串添加到JavaScript方法通常是个坏主意。用户的浏览器可能使用的语言不是英语,除了奇怪的日期格式外,还可能会导致更多问题。
答案 1 :(得分:0)
尝试使用空格而不是破折号或斜杠进行格式化 - 它应适用于所有现代浏览器(包括IE和Safari):
var dateString = '24/August/2016 12:44 AM',
dateFormatted = dateString.replace(/\//g, ' '),
date = new Date( dateFormatted );
一个小问题:
如果在dateString
中指定没有时区,则默认为用户的当前时区。这可能不是您的用例的问题,但是如果爱尔兰的某个人运行上面的代码,他们将使用相同的代码获得与墨西哥某人不同的时间戳。
// defaults to the user's timezone (in my case AEST)
console.log(date); // "Wed Aug 24 2016 00:44:00 GMT+1000 (AEST)"
你可以通过追加时区来解决这个问题:
var date = new Date( dateFormatted + ' GMT' );
// timezone is now relative to GMT
console.log(date); // "Wed Aug 24 2016 10:44:00 GMT+1000 (AEST)"
答案 2 :(得分:0)
我投了两个答案。我选择你的(som)作为接受的答案,因为它提供了一个解决方案。我用moment.js解决了这个问题。 moment.js能够按原样获取字符串并返回有效的日期对象。我最终得到了类似的东西:
if (typeof service.trade.onlineEndTime == 'string'){
if(!moment(service.trade.onlineEndTime, moment.ISO_8601, true).isValid()){
service.trade.onlineEndTime = service.trade.onlineEndTime.replace(/-/g,'/'); // replaces all occurances of "-" with "/"
service.trade.onlineEndTime = moment(service.trade.onlineEndTime, 'DD/MMMM/YYYY hh:mm a');
}
else{
service.trade.onlineEndTime = new Date(service.trade.onlineEndTime);
}
}
if(typeof service.trade.onlineEndTime == 'number') {
service.trade.onlineEndTime = new Date(service.trade.onlineEndTime);
}