Date.prototype.get日期;不能在Safari中工作

Date.prototype.getDay doesn't work in Safari

本文关键字:Safari 工作 不能 prototype get 日期 Date      更新时间:2024-06-06

这个脚本在Chrome中运行得很好,但在Safari中没有定义。你知道怎么解决吗?

var dateString = "2013-07-31 12:00:00";
var daysOfWeek = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
var whichDay = daysOfWeek[new Date(dateString).getDay()];
alert(whichDay);

JSfiddle:http://jsfiddle.net/utn3yyzc/

让我们看看MDN对将日期字符串发送到Date构造函数有什么看法。

MDN:全局对象:日期


语法

new Date(dateString)

参数

dateString

表示日期的字符串值。字符串应采用Date.parse()方法识别的格式(符合IETF的RFC 2822时间戳以及ISO8601版本)。

注意:强烈建议使用Date构造函数(和Date.parse,它们是等效的)分析日期字符串,因为浏览器存在差异和不一致

我们看到这种解析方法是不可靠的;强烈气馁";,所以我们必须实现我们自己的解析,或者使用一个可以为我们做这件事的库


手动方式

只需从给定字符串中解析日期。

function parseDate(datestring) {
  var d = datestring.split(/'D+/g).map(function(v) { return parseInt(v, 10); });
  return new Date(d[0], d[1] - 1, d[2], d[3], d[4], d[5]);
}
var dateString = "2013-07-31 12:00:00";
var daysOfWeek = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ];
var whichDay = daysOfWeek[parseDate(dateString).getDay()];
alert(whichDay);

Library(MomentJS)解决方案

var whichDay = moment('2013-07-31 12:00:00', 'YYYY-MM-DD HH:mm:ss').format('dddd');
alert(whichDay);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.12.0/moment.min.js"></script>


更新

这是一个使用i18n:的现代版本

const
  parseDate = (datestring) => 
    (([year, month, date, hour, minute, second]) =>
      new Date(year, month - 1, date, hour, minute, second))
    (datestring.split(/'D+/g).map(v => parseInt(v, 10))),
  dateString = '2013-07-31 12:00:00',
  whichDay = parseDate(dateString)
    .toLocaleString('en-US', { weekday: 'long' });
console.log(whichDay);

new Date(dateString)返回无效日期。

我建议以更明确的方式解析日期字符串(Safari似乎不支持这种格式)。

例如:

var dateString = "2013-07-31 12:00:00";
var split = dateString.split(' ');
var dateSplit = split[0].split('-');
var hourSplit = split[1].split(':');
var d = new Date(dateSplit[0], dateSplit[1] - 1, dateSplit[2],     hourSplit[0], hourSplit[1], hourSplit[2]);