2016-09-10 4 views
0

Я хочу, чтобы синтаксический анализ строки даты в формате ISO. Иногда это иногда работает.Javascript конвертировать строку в 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########"); 

Производит:

Даты начала converstion

ПЕРЕД разобранной Дата: 17.08.2016 00:23:51 ПОСЛЕ разобранной Даты: Неверная дата разобранной Дата: 17.08.2016 00:23:51

END Дата converstion Дата начала converstion

ДО Успешно разобран Дата: 01.08.2016 00:19:02 ПОСЛЕ Успешно разобран Дата: Пт янв 08 2016 00:19:02 GMT + 0100 (CET) ISO Parsed Дата: 2016-01-07T23: 19: 02.000Z Успешно разобран Дата: 2016-01-07T23: 19: 02.000Z

END Дата converstion

Я не знаю, почему. Надеюсь, кто-нибудь скажет мне, почему.

С уважением

+2

[ 'Date.parse'] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date/parse) Не рекомендуется использовать Date.parse, так как до ES5 разбор строк был полностью зависимым от реализации. Есть все еще много различий в том, как разные узлы анализируют строки даты, поэтому строки даты должны быть вручную проанализированы (библиотека может помочь, если нужно разместить много разных форматов). – Xotic750

ответ

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); 
 
});

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());

Смежные вопросы