web-dev-qa-db-ja.com

Google Tasks APIに似たRFC 3339タイムスタンプを生成しますか?

私はGoogle Tasksと同期するアプリを作成中です。同期の一環として、ローカルタスクとAPIタスクを比較し、どちらが最近変更されたかを確認します。

GoogleのAPIの各タスクには、次のようなupdatedプロパティが含まれています。

2011-08-30T13:22:53.108Z

次に、それに似たタイムスタンプを生成して、アプリでタスクを更新するたびに新しいupdated値を設定するようにします。 RFC 3339タイムスタンプを生成するには、- http://cbas.pandion.im/2009/10/generated-rfc-3339-timestamps-in.html を使用します。

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

問題は、ローカルの日付が新しい場合でも、APIの日付は常にローカルの日付よりも「大きい」ものとして戻ってくることです。私はそれが2つの異なるフォーマットに関係していると推測しています。

2つの日付があります。上部はGoogle Tasks APIからのもので(約10分前から)、下部は1分前に​​ローカルで生成されました。どちらが大きいかを比較すると、一番上のものがわかります。

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

私のフォーマットは間違っていますか?ここで私が間違っているのは何ですか?これに関する助けは本当にありがたいです。

26
levi

形式はISOなので、(new Date()).toISOString()はそのフォームを提供します。私が読んでいるように、これはシムする必要があるかもしれません:

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

ソース: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date

40
Joe

多くの複雑な答えが出されたようですが、これはうまく機能しますか?

(new Date()).toISOString()
44

私は、javascriptで時間を操作するためのmoment.jsライブラリを見つけました。 moment().format()は、datetimeに対してGoogle APIが期待する形式でタイムスタンプを生成します。または、アプリケーションにとって正しいデフォルトの形式に依存しないようにするには、

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

すべての文字列オプション(必要に応じて秒の小数部を含む): http://momentjs.com/docs/#/displaying/format/

10
Donny Winston

Google Scriptを使用している場合、別のオプションは以下のUtilities.formatDate URLを使用することです。

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

上記の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

これを試して:

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

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

2
Marek Sebera

最初の日付の後ろのZは、UTC(Zulu)時間であることを示します。Zがない場合、ローカル(コンピューター)時間を使用します。

参照: http://en.wikipedia.org/wiki/UTC

1
Aidamina

よりきれいに見えます:new Date().toISOString().split('.')[0] + 'Z'

1
Morbo