it-swarm.com.de

Einen RFC 3339-Zeitstempel ähnlich der Google Tasks-API generieren?

Ich bin gerade dabei, eine App zu erstellen, die mit Google Tasks synchronisiert wird. Als Teil der Synchronisierung möchte ich die lokale Task und die API-Task vergleichen und sehen, welche in letzter Zeit geändert wurde.

Jede Aufgabe aus der Google-API enthält eine updated-Eigenschaft, die wie folgt aussieht:

2011-08-30T13:22:53.108Z

Jetzt möchte ich einen ähnlichen Zeitstempel generieren, so dass jedes Mal, wenn ich eine Aufgabe in meiner App aktualisiere, ein neuer updated-Wert festgelegt wird. Um den RFC 3339-Zeitstempel zu generieren, verwende ich - http://cbas.pandion.im/2009/10/generating-rfc-3339-timestamps-in.html , das etwa Folgendes generiert:

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

Das Problem ist, dass das API-Datum immer "größer" als das lokale Datum ist, selbst wenn das lokale Datum neuer ist. Ich vermute, es hat etwas mit der unterschiedlichen Formatierung zwischen den beiden zu tun.

Hier sind zwei Termine, der obere Teil stammt von der Google Tasks API (von vor ungefähr 10 Minuten) und der untere wurde vor einer Minute lokal generiert. Wenn verglichen wird, was größer ist, sagt es mir, dass die oberste ist.

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

Ist meine Formatierung falsch? Was mache ich hier falsch? Jede Hilfe zu diesem Thema wird sehr geschätzt.

22
levi

Die Formatierung ist ISO, also gibt Ihnen (new Date()).toISOString() dieses Formular. Welches, wie ich lese, muss möglicherweise angepasst werden:

/* 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

Quelle: https://developer.mozilla.org/de/JavaScript/Reference/Global_Objects/Date

38
Joe

Es scheint, dass viele komplizierte Antworten gegeben wurden, aber das funktioniert gut, nicht wahr?

(new Date()).toISOString()
36

Ich habe die Bibliothek moment.js gefunden. Schön, wenn Sie mit der Zeit in Javascript arbeiten. moment().format() liefert einen Zeitstempel in dem von der Google API erwarteten Format für eine datetime. Um nicht davon abhängig zu sein, dass das Standardformat für Ihre Anwendung korrekt ist,

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

Alle String-Optionen (einschließlich Sekundenbruchteilen, wenn Sie das benötigen): http://momentjs.com/docs/#/displaying/format/

10
Donny Winston

Wenn Sie Google Script verwenden, können Sie als URL die URL Utilities.formatDate verwenden:

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

Beispielcode von der obigen URL:

// 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

versuche dies:

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

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

2
Marek Sebera

Das Z hinter dem ersten Datum gibt die UTC-Zeit (Zulu-Zeit) an. Ohne das Z wird die lokale (Computer-) Zeit verwendet, die möglicherweise mehrere Zeitzonen überschreitet.

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

1
Aidamina

Es sieht hübscher aus: new Date().toISOString().split('.')[0] + 'Z'

1
Morbo