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

前に解析日:2016年8月17日午後12時23分51秒 を解析された日以降:無効な日付に 解析された日付:2016年8月17日午後12時23分51秒

を END日converstion スタート日converstion

前に解析日:2016年8月1日夜十二時19分02秒 AFTER解析された日:1月8日(金) 2016〇時19分02秒GMT + 0100(CET) ISO解析された日: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)これは推奨されませんES5までDate.parseを使用するには、文字列の解析は完全に実装に依存していました。異なるホストが日付文字列をどのように構文解析するかには依然として多くの違いがあります。したがって、日付文字列を手動で解析する必要があります(さまざまな形式があればライブラリが役立ちます)。 – Xotic750

答えて

0

Date.parse

ES5、 文字列の構文解析が完全に実装依存になるまでとDate.parseを使用することは推奨されません。異なるホストが日付文字列をどのように構文解析するかには依然として多くの違いがありますので、 文字列を手動で解析する必要があります( の異なる形式を使用する場合はライブラリが役立ちます)。

自分で文字列を解析する例です。また

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); 
 
});
強くお勧めしますDateコンストラクタと

0

解析文字列(それは構文解析のための等価であるとしてDate.parseを使用しているなど)。使用している形式はECMA-262でサポートされている形式ではないので、解析は完全に実装に依存します。言語仕様のフォーマットでさえ、使用中のブラウザーで一貫してサポートされていないため、別売の関数またはライブラリーを使用してください。

日付と時刻が任意のタイムゾーン情報を持っていないので、それがローカルとして扱われるべきです。

文字列を日付に解析したら、からisSSringまでの形式を使用して、日付と時刻を常に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());

関連する問題