2010-12-15 91 views

Répondre

2
var someDate = new Date("2010-11-30T08:32:22+0000"); 

Je ne pense pas que ce soit plus simple.

+0

Firebug donne 'Date invalide'. – thirtydot

+0

@thirtydot: ah, une autre incompatibilité de navigateur, il semble. Cela fonctionne à la fois dans [jsFiddle] (http://jsfiddle.net/) et Chrome. Meilleur à utiliser [datejs] (http: //www.datejs.com /) pour un minimum de maux de tête. – darioo

6

Ce code fonctionne dans IE/Firefox/Chrome:

new Date("2010-11-30T08:32:22+0000".replace(/-/g,'/').replace(/T/,' ').replace(/\+/,' +')) 

Il change 2010-11-30T08:32:22+0000 à 2010/11/30 08:32:22 +0000 et crée ensuite l'objet Date de la chaîne fixe.

Je ne sais pas si vous devriez l'utiliser, il semble vraiment sale.

+0

J'ai utilisé ce hack et ça marche pour moi. C'est un peu sale! – happyhardik

+0

Pour une solution moins laide, essayez sugarjs Date.create ("isodatestring") –

+0

Grande solution qui fonctionne parfaitement - été à la recherche depuis des années –

4

Cette recette ne prend pas en compte TimeZone. Vous devez le pirater un peu plus pour le faire fonctionner avec des TZ. Si vous êtes sûr que le fuseau horaire est toujours +0000, ce code fonctionne:

var s = "2010-11-30T08:32:22+0000"; 
// Replace non-digit characters with a space 
s = s.replace(/\D/g," "); 
// Split the string on space 
var date_parts = s.split(" "); 

// subtract 1 from month to use in Date constructor 
var yyyy = date_parts[0], 
    mm = date_parts[1] - 1, 
    dd = date_parts[2], 
    hh = date_parts[3], 
    mi = date_parts[4], 
    ss = date_parts[5]; 

// Now, the date_parts has year, month, date and so on 
var dt = new Date(yyyy, mm, dd, hh, mi, ss); 

Ceci est une version légèrement bavard d'une recette que je l'ai appris de JavaScript Cookbook

3

Nouvelle prise en charge version navigateurs new Date ("2010-11-30T08: 32: 22 + 0000") (Chrome, FF4, IE9), mais pas les anciens navigateurs.

Si fuseau horaire ne fait pas sence (dans les cas où il a toujours zéro (votre cas) ou d'omettre), vous pouvez utiliser ceci:

Date.fromISOString = (function(){ 
    function fastDateParse(y, m, d, h, i, s, ms){ 
    return new Date(y, m - 1, d, h || 0, i || 0, s || 0, ms || 0); 
    } 

    // result function 
    return function(isoDateString){ 
    return fastDateParse.apply(null, isoDateString.split(/\D/)); 
    } 
})(); 

Si vous avez besoin d'analyser l'utilisation de fuseau horaire ceci:

Date.fromISOString = (function(){ 
    var tzoffset = (new Date).getTimezoneOffset(); 
    function fastDateParse(y, m, d, h, i, s, ms){ // this -> tz 
    return new Date(y, m - 1, d, h || 0, +(i || 0) - this, s || 0, ms || 0); 
    } 

    // result function 
    return function(isoDateString){ 
    var tz = isoDateString.substr(10).match(/([\-\+])(\d{1,2}):?(\d{1,2})?/) || 0; 
    if (tz) 
     tz = tzoffset + (tz[1] == '-' ? -1 : 1) * (tz[3] != null ? +tz[2] * 60 + (+tz[3]) : +tz[2]); 
    return fastDateParse.apply(tz || 0, isoDateString.split(/\D/)); 
    } 
})(); 

formes correctes de ce jour:

Date.fromISOString('2011-06-01'); 
Date.fromISOString('2011-06-01T00:00:00'); 
Date.fromISOString('2011-06-01T00:00:00Z'); 
Date.fromISOString('2011-06-01T00:00:00+30'); 
Date.fromISOString('2011-06-01T00:00:00-30'); 
Date.fromISOString('2011-06-01T00:00:00+0530'); 
Date.fromISOString('2011-06-01T00:00:00-0530'); 
Date.fromISOString('2011-06-01T00:00:00+05:30'); 
Date.fromISOString('2011-06-01T00:00:00-05:30'); 

// Your example valid as well. 
Date.fromISOString("2010-11-30T08:32:22+0000") 
-1

je trouve cas comme Date.fromISOString ('2011-06-01T00: 00: 00Z) crée date i s décalage par fuseau horaire, donc cela ne fonctionne correctement que si votre ordinateur est en GMT. Voici le changement que j'ai fait pour corriger cela.

Pour obtenir la date correcte d'une chaîne ISO donnée, vous souhaitez ajuster le fuseau horaire local même si l'entrée donnée est GMT.

Voici l'exemple de travail, vous pouvez enregistrer en tant que fichier .html et test sur votre ordinateur:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US"> 
    <head> 
     <title>ISO Dates String to Date</title> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script> 
     <script type="text/javascript" language="JavaScript"> 

// Modified from: http://stackoverflow.com/questions/4450837/javascript-string-to-date-php-iso-string-format 
// Thank you Roman Dvornov 
Date.fromISOString = (function(){ 
    var tzoffset = (new Date).getTimezoneOffset(); 
    function fastDateParse(y, m, d, h, i, s, ms){ // this -> tz 
     return new Date(y, m - 1, d, h || 0, +(i || 0) - this, s || 0, ms || 0); 
    } 

    // result function 
    return function(isoDateString){ 
     var tz = isoDateString.substr(10).match(/([\-\+])(\d{1,2}):?(\d{1,2})?/) || 0; 
     if (tz) { 
      tz = tzoffset + (tz[1] == '-' ? -1 : 1) * (tz[3] != null ? +tz[2] * 60 + (+tz[3]) : +tz[2]); 
     } else { 
      tz = tzoffset; 
     } 
     return fastDateParse.apply(tz || 0, isoDateString.split(/\D/)); 
    } 
})(); 

      function checkDate() { 
       showDateIso($('#IsoStringInput').val()); 
      } 

      function dates() { 
       showDateIso('2011-06-01'); 
       showDateIso('2011-06-01T00:00:00'); 
       showDateIso('2011-06-01T00:00:00Z'); 
       showDateIso('2011-06-01T00:00:00+30'); 
       showDateIso('2011-06-01T00:00:00-30'); 
       showDateIso('2011-06-01T00:00:00+0530'); 
       showDateIso('2011-06-01T00:00:00-0530'); 
       showDateIso('2011-06-01T00:00:00+05:30'); 
       showDateIso('2011-06-01T00:00:00-05:30'); 
      } 

      function showDateIso(isoString) { 
       var $tr = $('<tr/>').prependTo($('#DatesTable').find('tbody')); 
       $('<td/>').appendTo($tr).text(isoString); 
       var isoDate = Date.fromISOString(isoString); 
       $('<td/>').appendTo($tr).text(isoDate); 
       var now = new Date(); 
       $('<td/>').appendTo($tr).text(now); 
       $('<td/>').appendTo($tr).text(showTimeDiff(now.getTime() - isoDate.getTime())); 
       $tr.fadeOut(100).fadeIn(1400); 
      } 

      var ONE_YEAR_MS = 31536000000; 
      var ONE_WEEK_MS = 604800000; 
      var ONE_DAY_MS = 86400000; 
      var ONE_HOUR_MS = 3600000; 
      var ONE_MINUTE_MS = 60000; 
      function showTimeDiff(timeMs) { 
       var result = ''; 
       if (typeof(timeMs) !== 'undefined') { 
        var years = 0; 
        while (timeMs >= ONE_YEAR_MS) { 
         years = years + 1; 
         timeMs = timeMs - ONE_YEAR_MS; 
        } 
        if (years > 0) { 
         result = result + years + ((weeks === 1) ? ' year ' : ' years '); 
        } 
        var weeks = 0; 
        while (timeMs >= ONE_WEEK_MS) { 
         weeks = weeks + 1; 
         timeMs = timeMs - ONE_WEEK_MS; 
        } 
        if (weeks > 0) { 
         result = result + weeks + ((weeks === 1) ? ' week ' : ' weeks '); 
        } 
        var days = 0; 
        while (timeMs >= ONE_DAY_MS) { 
         days = days + 1; 
         timeMs = timeMs - ONE_DAY_MS; 
        } 
        if (days > 0) { 
         result = result + days + ((days === 1) ? ' day ' : ' days '); 
        } 
        var hours = 0; 
        while (timeMs >= ONE_HOUR_MS) { 
         hours = hours + 1; 
         timeMs = timeMs - ONE_HOUR_MS; 
        } 
        var minutes = 0; 
        while (timeMs >= ONE_MINUTE_MS) { 
         minutes = minutes + 1; 
         timeMs = timeMs - ONE_MINUTE_MS; 
        } 
        // Break down to seconds 
        var seconds = parseInt(timeMs/1000, 10); 
        if (hours > 0) { 
         result = result + hours + ':' + pad(minutes, 2) + ':' + pad(seconds, 2); 
        } else if (minutes > 0) { 
         result = result + minutes + ':' + pad(seconds, 2); 
        } else if (seconds > 0) { 
         result = result + seconds + ' sec'; 
        } 
       } 
       return result; 
      } 

      function pad(number, len) { 
       var result = ''; 
       if (!isNaN(number)) { 
        result = '' + number; 
        while (result.length < len) { 
         result = '0' + result; 
        } 
       } 
       return result; 
      } 

     </script> 
    </head> 
    <body> 
     <div> 
      <label>ISO String:</label> 
      <input id="IsoStringInput" type="text" value="" style="width: 300px;"/> 
     </div> 
     <button type="button" onclick="checkDate();">Check Entered Date</button> 
     <button type="button" onclick="dates();">ISO for June 01, 2011</button> 
     <table id="DatesTable"> 
      <thead> 
       <th>ISO String</th> 
       <th>Date Printed <span style="color: #888888;">(Local Timezone)</span></th> 
       <th>Now</th> 
       <th>Now - ISO <span style="color: #888888;">(minutes)</span></th> 
      </thead> 
      <tbody> 
      </tbody> 
     </table> 
    </body> 
</html> 
1

Très simple:

var Date = new Date("2014-02-03T08:32:22+0000"); 
0

Cela peut être une option

> s = '2010-11-30T08:32:22+0000'.split(/\D/); 
> new Date(Date.UTC(s[0], --s[1]||'', s[2]||'', s[3]||'', s[4]||'', s[5]||'', s[6]||'')) 
Tue Nov 30 2010 06:32:22 GMT-0200 (BRST)