13

次のような形式の日付文字列を含むjsonフィードを取得しています。

// 2012-08-03T23:00:26-05:00

私はこれを新しい日付に渡すことができると思っていました

var dt = new Date("2012-08-03T23:00:26-05:00");

これはjsfiddleで機能しますが、googleスクリプトでは機能しません。無効な日付を返しています。この投稿を読んだ後、GASが日付文字列を解釈する方法である可能性があることを認識したため、日付を再フォーマットして機能させる方法がわかりません。

GASが日付文字列を日付として認識できるように、その日付文字列を再フォーマットする最良の方法はありますか?

4

5 に答える 5

21

Google Apps Scriptは特定のバージョンのJavaScript(ECMA-262 3rd Edition)を使用しており、ご存知のとおり、ISO8601形式の日付/時刻を解析することはできません。以下は、多くのAppsScriptで使用している変更された関数です。

var dt = new Date(getDateFromIso("2012-08-03T23:00:26-05:00"));

// http://delete.me.uk/2005/03/iso8601.html
function getDateFromIso(string) {
  try{
    var aDate = new Date();
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
        "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\\.([0-9]+))?)?" +
        "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
    var d = string.match(new RegExp(regexp));

    var offset = 0;
    var date = new Date(d[1], 0, 1);

    if (d[3]) { date.setMonth(d[3] - 1); }
    if (d[5]) { date.setDate(d[5]); }
    if (d[7]) { date.setHours(d[7]); }
    if (d[8]) { date.setMinutes(d[8]); }
    if (d[10]) { date.setSeconds(d[10]); }
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
    if (d[14]) {
      offset = (Number(d[16]) * 60) + Number(d[17]);
      offset *= ((d[15] == '-') ? 1 : -1);
    }

    offset -= date.getTimezoneOffset();
    time = (Number(date) + (offset * 60 * 1000));
    return aDate.setTime(Number(time));
  } catch(e){
    return;
  }
}
于 2012-08-05T21:43:04.653 に答える
9

この他の可能性のある非常に単純なコードを見つけましたが、これも仕事をしているようです:

function test(){
  Logger.log(isoToDate("2013-06-15T14:25:58Z"));
  Logger.log(isoToDate("2012-08-03T23:00:26-05:00"));
  Logger.log(isoToDate("2012-08-03T23:00:26+05:00"));
}

function isoToDate(dateStr){// argument = date string iso format
  var str = dateStr.replace(/-/,'/').replace(/-/,'/').replace(/T/,' ').replace(/\+/,' \+').replace(/Z/,' +00');
  return new Date(str);
}
于 2013-06-22T16:49:13.620 に答える
1

フォーマットが事前にわかっている場合にそれを機能させるためのハードで確実な方法は、それを解析することです。

var dtString = "2012-08-03T23:00:26-05:00";
var date = dtString.split('T')[0]; 
var time = dtString.split('T')[1].split('-')[0]; 
var tz = dtString.split('T')[1].split('-')[1]; 
var dt = new Date(date.split('-')[0] , date.split('-')[1] - 1,  // month is special
                  date.split('-')[2], time.split(':')[0],
                  time.split(':')[1], time.split(':')[2] , 0);

この正確なコードはテストしていませんが、同様のコードを使用しています。だから、これはあなたにどのように進めるかについての公正な考えを与えます。

于 2012-08-04T18:24:03.550 に答える
1

これは、GoogleScriptでdate-stringをdate-objectに変換するときに機能しました。

日付文字列は、getValue s()メソッドによってGoogleスプレッドシートのセルから取得されました。

From:01.01.2017 22:43:34to:2017/01/01 22:43:34仕事をしました。そしてnew Date()

var dateTimeObj = new Date(stringDate.replace(/^(\d{1,2})[-.](\d{1,2})[-.](\d{4})/g,"$3/$2/$1"));
于 2017-01-01T20:09:12.197 に答える
1

今のnew Date()ところうまくいくようです:

var dT = new Date("2012-08-03T23:00:26-05:00");
console.info("dT: %s or %d", dT, dT.getTime());

GoogleAppsScriptで返さdT: Sat Aug 04 06:00:26 GMT+02:00 2012 or 1.344052826E12れます

于 2019-11-02T23:30:33.097 に答える