Javascript将String转换为ISO Date

时间:2016-09-10 19:12:57

标签: javascript date parsing isodate

我想将日期字符串解析为ISO格式。有时它有时没有工作。

                            //17.08.2016 00:23:51 doesent work
                            //01.08.2016 00:05:32 work
                            var ParsedData = "COPY FROM ABOVE";

                            console.log("#####Start Date converstion########");
                            console.log("BEFORE Parsed Date: -" + ParsedData + "-");
                            tempdate = new Date(ParsedData);
                            console.log("AFTER Parsed Date: " + tempdate);
                            tempdate = tempdate.toISOString();
                            console.log("ISO Parsed Date: " + tempdate);
                          } catch (e) {
                            console.log(e);
                            if (e instanceof TypeError) {
                              //console.log(e);
                            }
                            else if(e instanceof RangeError) {
                              tempdate = ParsedDate
                            }
                            else {
                               console.log("Error not catched: " + e);
                            }
                          }

                          console.log("Parsed Date: " + tempdate);
                          console.log("#####END Date converstion########");

产地:

开始日期转换

在解析日期之前:2016年8月17日00:23:51 解析日期之后:无效日期 解析日期:17.08.2016 00:23:51

结束日期转换 开始日期转换

在解析日期之前:01.08.2016 00:19:02 解析日期:2016年1月8日星期五00:19:02 GMT + 0100(CET) ISO解析日期:2016-01-07T23:19:02.000Z 解析日期:2016-01-07T23:19:02.000Z

结束日期转换

我不知道为什么。我希望有人能告诉我原因。

此致

2 个答案:

答案 0 :(得分:0)

Date.parse

  

建议不要使用Date.parse直到ES5,解析   字符串完全取决于实现。还有很多   不同主机解析日期字符串的差异,因此是日期   字符串应该手动解析(如果很多,库可以帮助   要适应不同的格式)。

自己解析字符串的一个例子。

var datetimes = ['17.08.2016 00:23:51', '01.08.2016 00:05:32'];
datetimes.forEach(function(datetime) {
  var dateAndTime = datetime.split(' ');
  var date = dateAndTime[0].split('.').reverse();
  // month is zero indexed
  date[1] -= 1;
  var time = dateAndTime[1].split(':');
  // assuming datetimes are UTC
  dateAndTime = new Date(Date.UTC.apply(null, date.concat(time))).toISOString();
  // if not UTC but local
  //dateAndTime = new Date(date[0], date[1], date[2], time[0], time[1], time[2]).toISOString();
  console.log(dateAndTime);
});

或者,如果原始字符串已经是UTC,那么您可以只操作字符串而不使用Date

var datetimes = ['17.08.2016 00:23:51', '01.08.2016 00:05:32'];
datetimes.forEach(function(datetime) {
  var dateAndTime = datetime.split(' ');
  var date = dateAndTime[0].split('.').reverse();
  dateAndTime = date.join('-') + 'T' + dateAndTime[1] + '.000Z';
  console.log(dateAndTime);
});

答案 1 :(得分:0)

强烈建议不要使用Date构造函数解析字符串(就像使用Date.parse一样,因为它等同于解析)。您使用的格式不是ECMA-262支持的格式,因此解析完全取决于实现。即使是语言规范中的格式也不会被使用中的浏览器始终支持,因此要么使用定制函数,要么使用库。

由于日期和时间没有任何时区信息,因此应将其视为本地信息。

将字符串解析为日期后,您可以使用 toISOString 来获取所需的格式,并指出它始终会以UTC格式返回日期和时间。

/* Parse string in DD.MM.YYYY HH:mm:ss format
** @param {string} s - string to parse
** @returns {Date} if string has invalid date components,
**                 an invalid Date is returned
*/
function parseString(s) {
  var b = s.split(/\D/);
  var d = new Date(b[2], --b[1], b[0], b[3], b[4], b[5]);
  return d && d.getMonth() == b[1] && d.getHours() == b[3] &&
         d.getMinutes() == b[4]? d : new Date(NaN);
}

console.log(parseString('17.08.2016 00:23:51').toISOString());
console.log(parseString('01.08.2016 00:05:32').toISOString());