javascript中的日期解析在safari和chrome之间是不同的

时间:2011-06-21 14:44:07

标签: javascript parsing date google-chrome safari

我有以下代码

var c = new Date(Date.parse("2011-06-21T14:27:28.593Z"));
console.log(c);

在Chrome上,它会在控制台上正确打印出日期。在Safari中 它失败。谁是正确的,更重要的是什么是最好的方式 处理这个?

11 个答案:

答案 0 :(得分:93)

你不能真正使用Date.parse。我建议你使用:new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )

要分割你可以尝试的字符串

var s = '2011-06-21T14:27:28.593Z';
var a = s.split(/[^0-9]/);
//for (i=0;i<a.length;i++) { alert(a[i]); }
var d=new Date (a[0],a[1]-1,a[2],a[3],a[4],a[5] );
alert(s+ " "+d);

答案 1 :(得分:14)

根据此问题的其他答案,我倾向于避免Date.parse。它似乎不是一种可靠的方式来可靠地处理日期。

相反,我使用了类似下面的功能。这使用jQuery将字符串数组映射到数字数组,但这是一个非常容易删除/更改的依赖项。我还包括我认为合理的默认值,允许您使用相同的函数解析2007-01-092007-01-09T09:42:00

function dateFromString(str) {
  var a = $.map(str.split(/[^0-9]/), function(s) { return parseInt(s, 10) });
  return new Date(a[0], a[1]-1 || 0, a[2] || 1, a[3] || 0, a[4] || 0, a[5] || 0, a[6] || 0);
}

答案 2 :(得分:11)

我在几个浏览器中检查了它,是的,safari返回invalid date。顺便说一句,您不必在此使用Date.parse,只需new Date([datestring])即可。 Safari显然需要更多格式化您提供的日期字符串。如果用'/'替换' - ',删除T和点后面的所有内容(.593Z),它会给你一个有效的日期。此代码经过测试并可在Safari中使用

var datestr = '2011-06-21T14:27:28.593Z'.split(/[-T.]/);
var safdat = new Date( datestr.slice(0,3).join('/')+' '+datestr[3] );

或使用String.replace(...)

new Date("2016-02-17T00:05:01+0000".replace(/-/g,'/').replace('T',' ').replace(/(\..*|\+.*/,""))

答案 3 :(得分:8)

我的类似问题是由Safari不知道如何以RFC 822时区格式读取时区引起的。我能够通过使用ISO 8601格式来解决这个问题。如果您控制了日期格式,我就可以使用java的SimpleDateFormat“yyyy-MM-dd'T'HH:mm:ss.sssXXX”为我生成ie。 “2018-02-06T20:00:00.000 + 04:00”。无论出于何种原因,Safari无法阅读“2018-02-06T20:00:00.000 + 0400”,请注意时区格式中缺少冒号。

// Works
var c = new Date("2018-02-06T20:00:00.000+04:00"));
console.log(c);

// Doesn't work
var c = new Date("2018-02-06T20:00:00.000+0400"));
console.log(c);

答案 4 :(得分:5)

我最终使用库来抵消这个:

http://zetafleet.com/blog/javascript-dateparse-for-iso-8601

包含该库后,您可以使用此代码创建新日期:

var date = new Date(Date.parse(datestring));

我们的项目没有使用毫秒说明符,但我认为这不会给您带来问题。

答案 5 :(得分:4)

我使用以下函数来解析带有时区的日期。适用于Chrome和Safari:

&#13;
&#13;
function parseDate(date) {
  const parsed = Date.parse(date);
  if (!isNaN(parsed)) {
    return parsed;
  }

  return Date.parse(date.replace(/-/g, '/').replace(/[a-z]+/gi, ' '));
}

console.log(parseDate('2017-02-09T13:22:18+0300'));  // 1486635738000 time in ms
&#13;
&#13;
&#13;

答案 6 :(得分:1)

我尝试通过截断并解析它来转换日期,它与safari和ios一起工作正常。

var dateString = "2016-01-22T08:18:10.000+0000";
 var hours = parseInt(dateString.split("+")[1].substr("0","2"));
 var mins = parseInt(dateString.split("+")[1].substr("2"));
 var date = new Date(dateString.split("+")[0]);
 date.setHours(date.getHours()-hours);
 date.setMinutes(date.getMinutes()-mins);

答案 7 :(得分:0)

您可以添加本地客户端时区偏移量,而不是在日期字符串末尾使用“Z”。您可能需要一种方法来为您生成:

let timezoneOffset = () => {
    let date = new Date(),
        timezoneOffset = date.getTimezoneOffset(),
        hours = ('00' + Math.floor(Math.abs(timezoneOffset/60))).slice(-2),
        minutes = ('00' + Math.abs(timezoneOffset%60)).slice(-2),
        string = (timezoneOffset >= 0 ? '-' : '+') + hours + ':' + minutes;
    return string;
}

所以最终的结果是:

var c = new Date("2011-06-21T14:27:28.593" + timezoneOffset());

答案 8 :(得分:0)

这是比其他用户更强大的ISO 8601解析器。它不处理星期格式,但应在所有浏览器中一致地处理所有其他有效的ISO 8601日期。

function newDate(value) {
  var field = value.match(/^([+-]?\d{4}(?!\d\d\b))(?:-?(?:(0[1-9]|1[0-2])(?:-?([12]\d|0[1-9]|3[01]))?)(?:[T\s](?:(?:([01]\d|2[0-3])(?::?([0-5]\d))?|24\:?00)([.,]\d+(?!:))?)?(?::?([0-5]\d)(?:[.,](\d+))?)?([zZ]|([+-](?:[01]\d|2[0-3])):?([0-5]\d)?)?)?)?$/) || [];
  var result = new Date(field[1], field[2] - 1 | 0, field[3] || 1, field[4] | 0, field[5] | 0, field[7] | 0, field[8] | 0)
  if (field[9]) {
    result.setUTCMinutes(result.getUTCMinutes() - result.getTimezoneOffset() - ((field[10] * 60 + +field[11]) || 0));
  }
  return result;
}

console.log(newDate('2011-06-21T14:27:28.593Z'));
console.log(newDate('1970-12-31T06:00Z'));
console.log(newDate('1970-12-31T06:00-1200'));

答案 9 :(得分:0)

这不是我的第三方库,而是我的-比较简单-解决方案:

function parseDateTime(datetime, timezone) {

  base = new Date(datetime.replace(/\s+/g, 'T') + 'Z');

  hoursUTC = base.toLocaleTimeString('de-AT',{ timeZone: 'UTC' }).split(':')[0];
  hoursLocal = base.toLocaleTimeString('de-AT',{ timeZone: 'Europe/Vienna' }).split(':')[0];
  
  timeZoneOffsetSign = (hoursLocal-hoursUTC) < 0 ? '-':'+';
  timeZoneOffset = Math.abs(hoursLocal-hoursUTC);
  timeZoneOffset = timeZoneOffsetSign + timeZoneOffset.toString().padStart(2, '0') + ':00';
  
  return new Date(datetime.replace(/\s+/g, 'T') + timeZoneOffset);
}

localDate = parseDateTime('2020-02-25 16:00:00','Europe/Vienna');
console.log(localDate);
console.log(localDate.toLocaleString('de-AT','Europe/Vienna'));

答案 10 :(得分:0)

同时使用这两个功能(Safari / Chrome):

['model_1.pdb', 'model_2.pdb', 'model_3.pdb', 'model_11.pdbmodel_4.pdb', 'model_17.pdb', 'model_240.pdb']