web-dev-qa-db-fra.com

Générer un horodatage RFC 3339 similaire à l'API Google Tasks?

Je suis en train de créer une application qui se synchronise avec Google Tasks. Dans le cadre de la synchronisation, je souhaite comparer la tâche locale et la tâche d'API et voir laquelle a été modifiée plus récemment.

Chaque tâche de l'API de Google contient une propriété updated, qui ressemble à ceci:

2011-08-30T13:22:53.108Z

Maintenant, j'aimerais générer un horodatage similaire à celui-ci, afin que chaque fois que je mette à jour une tâche sur mon application, elle définisse une nouvelle valeur updated. Pour générer l'horodatage RFC 3339, j'utilise - http://cbas.pandion.im/2009/10/generating-rfc-3339-timestamps-in.html qui génère quelque chose comme ceci:

2011-08-30T09:30:16.768-04:00

Le problème est que la date de l'API revient toujours comme "supérieure" à la date locale, même lorsque la date locale est plus récente. Je suppose que cela a quelque chose à voir avec le formatage différent entre les deux.

Voici deux dates, le haut provient de l'API Google Tasks (il y a environ 10 minutes) et le dernier a été généré localement il y a une minute. Quand on compare ce qui est plus grand, on me dit que le plus haut est.

2011-08-30T13:22:53.108Z
2011-08-30T09:41:00.735-04:00

Est-ce que ma mise en forme est incorrecte? Qu'est-ce que je fais mal ici? Toute aide à ce sujet est vraiment appréciée.

22
levi

Le formatage est ISO, donc (new Date()).toISOString() vous donnera ce formulaire. Ce que je lis pourrait avoir besoin d'être ajusté:

/* use a function for the exact format desired... */
function ISODateString(d){
 function pad(n){return n<10 ? '0'+n : n}
 return d.getUTCFullYear()+'-'
      + pad(d.getUTCMonth()+1)+'-'
      + pad(d.getUTCDate())+'T'
      + pad(d.getUTCHours())+':'
      + pad(d.getUTCMinutes())+':'
      + pad(d.getUTCSeconds())+'Z'}

var d = new Date();
print(ISODateString(d)); // prints something like 2009-09-28T19:03:12Z

Source: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date

38
Joe

Il semble que beaucoup de réponses compliquées ont été données, mais cela fonctionne très bien, n'est-ce pas?

(new Date()).toISOString()
36
Trenton D. Adams

J'ai trouvé la bibliothèque moment.js Bien pour travailler avec le temps en javascript. moment().format() génère un horodatage au format attendu par l'API Google pour une datetime. Ou, ne pas dépendre du format par défaut correct pour votre application,

moment().format("YYYY-MM-DDTHH:mm:ssZ")

Toutes les options de chaîne (y compris les fractions de seconde si c'est ce dont vous avez besoin): http://momentjs.com/docs/#/displaying/format/

10
Donny Winston

Si vous utilisez Google Script, une autre option consiste à utiliser l'URL Utilities.formatDate ci-dessous:

https://developers.google.com/apps-script/reference/utilities/utilities#formatDate(Date,String,String)

Exemple de code de l'URL ci-dessus:

// This formats the date as Greenwich Mean Time in the format
// year-month-dateThour-minute-second.
var formattedDate = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'");
4

essaye ça:

Date.prototype.setRFC3339 = function(dString) {
    var utcOffset, offsetSplitChar;
    var offsetMultiplier = 1;
    var dateTime = dString.split("T");
    var date = dateTime[0].split("-");
    var time = dateTime[1].split(":");
    var offsetField = time[time.length - 1];
    var offsetString;
    offsetFieldIdentifier = offsetField.charAt(offsetField.length - 1);
    if (offsetFieldIdentifier == "Z") {
        utcOffset = 0;
        time[time.length - 1] = offsetField.substr(0, offsetField.length - 2);
    } else {
        if (offsetField[offsetField.length - 1].indexOf("+") != -1) {
            offsetSplitChar = "+";
            offsetMultiplier = 1;
        } else {
            offsetSplitChar = "-";
            offsetMultiplier = -1;
        }
        offsetString = offsetField.split(offsetSplitChar);
        time[time.length - 1] == offsetString[0];
        offsetString = offsetString[1].split(":");
        utcOffset = (offsetString[0] * 60) + offsetString[1];
        utcOffset = utcOffset * 60 * 1000;
    }

    this.setTime(Date.UTC(date[0], date[1] - 1, date[2], time[0], time[1], time[2]) + (utcOffset * offsetMultiplier));
    return this;
};

source: http://blog.toppingdesign.com/2009/08/13/fast-rfc-3339-date-processing-in-javascript/

2
Marek Sebera

Le Z derrière la première date indique qu'il est l'heure UTC (Zulu). Sans le Z, il utilisera l'heure locale (de l'ordinateur), qui pourrait être désactivée pour plusieurs fuseaux horaires.

Voir: http://en.wikipedia.org/wiki/UTC

1
Aidamina

C'est plus joli: new Date().toISOString().split('.')[0] + 'Z'

1
Morbo