2016-04-17 1 views
0

私は様々なソリューション、すなわち解析や部分文字列分割を見てきましたが、値。フォーマットは、SalesforceのAPIを介して受信SalesForce APIによって提供されるUTCの日付形式を変換し、Google Apps Scriptを使用してローカルの日付と時刻の形式に変換する方法

は「2014-08-19T02:26:00.000 + 0000」である

基本的に私はこの日付/時刻の形式を変換するために、Googleシート内で使用できるカスタム関数を希望し、検討

に夏時間を取る、私は以下のような簡単な関数を使用し、あらかじめ

+0

あなたは、その後に*コンストラクタ*日付を使用し、それそれの部品(例えば、 's.split(/ \ D /)')に文字列を分割し、簡単な解析関数を記述することができます値。バリデーションが必要な場合は2行だけ必要です。 – RobG

+0

Javascript DateはtoLocaleString関数を提供します。したがって、新しいDate( "2014-08-19T02:26:00.000 + 0000")。toLocaleString();ドキュメント/スプレッドシート/スクリプトにロケールの設定が適切に設定されていれば十分だと思います。 – jad

+0

@ jad- * toLocaleString *は、現地時間を表す実装依存の文字列を提供し、ブラウザによって大きく異なります。標準* toString *メソッドはより一貫性のある文字列を提供します(ブラウザに依存しますが)。しかし、それはOPの問題ではありません。 – RobG

答えて

0

ありがとう:

function parseDate(string) { 
    var parts = string.split('T'); 
    parts[0] = parts[0].replace(/-/g, '/'); 
    var t = parts[1].split(':'); 
    var refStr = new Date(new Date(parts[0])).toString();// use this to get TZ for daylight savings 
    var fus = Number(refStr.substr(refStr.indexOf('GMT')+4,2)); 
    return new Date(new Date(parts[0]).setHours(+t[0]+fus,+t[1],0)); 
} 
+0

時間部分から日付を取り除くのは意味がありません。文字列を解析するためにDateコンストラクタを信頼する場合(推奨されない)、時間とゾーンは添付されたままにしておきます。組み込み* toString *メソッドを信頼しないことも強く推奨されています。これは完全に実装に依存し、異なる実装で異なる文字列を返す可能性があります。ホストタイムゾーンオフセットは、[* getTimezoneOffset *](http://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.gettimezoneoffset)を使用して確実に使用できます。 – RobG

+0

ああ、上の例ではオフセットの分部分を無視しています(存在する場合).0430のようなオフセットを持つゾーンは間違って変換されます。ほとんどのブラウザではUTCと解釈される日付部分のみを使用しているため、適切なローカル日付または時刻が得られないため、夏時間適用の場合は、切り替え時間の約24時間間違って表示されます。 – RobG

+0

@Robあなたのコメントを理解していただきありがとうございますが、この投稿は特にサーバー側で動作するためブラウザに依存しないGoogle Apps Scriptに関するものです。それは、私はtzが非常にエレガントではない得ることに同意します:-)私は何か良いことを考えます。 –

0

は、まずあなたに感謝誰もが入力しますRobGとSerge insasによって提供された情報の組み合わせを使用することによって、私はスクリプトを改訂し、私のニーズに合ったスクリプトを作成しました。以下を参照してください、それ以上のアドバイスが歓迎されるでしょう。

/* 
 

 
The script first has all variables declared. 
 
As the script runs inconjunction with an API query running off single trigger for defined sequential functions where the previous parsed date records are cleared and then re-parsed and runs with loop function for a whole column of data within specified range 
 

 
*/ 
 

 
function parseDate() { 
 
    var source_spreadsheet = SpreadsheetApp.openById("Sheet_Id"); 
 
    SpreadsheetApp.setActiveSpreadsheet(source_spreadsheet); 
 
    var sheet = source_spreadsheet.getSheetByName("Sheet_Tab"); 
 
    var startRow = 2; 
 
    var numRows = 4500; 
 
    var startCol = 1; 
 
    var numCols = 7; 
 
    var dataRange = sheet.getRange(startRow, startCol, numRows, numCols) 
 
    sheet.getRange(startRow, startCol + 1, numRows, numCols - 1).clear({contentsOnly: true}); 
 
    var data = dataRange.getValues(); 
 
    for (var i = 0; i < data.length; ++i) { 
 
    var row = data[i]; 
 
    var SFConnectDate = row[0]; 
 
    var DConnected = row[1]; 
 
    var SFCutoverDate = row[2]; 
 
    var DInUse = row[3]; 
 
    var Lat = row[5]; 
 
    var Long = row[6]; 
 
    if (SFConnectDate != "" && DConnected == "" && Lat != "" && Long != "") { 
 
     var parts = SFConnectDate.split('T'); 
 
     parts[0] = parts[0].replace(/-/g, '/'); 
 
     var Fdd = parts[0].split('/'); 
 
     var AllTime = parts[1].split('.'); 
 
     var Ftt = AllTime[0].split(':'); 
 
     var D = new Date(Fdd[0],(Fdd[1]-1),Fdd[2] ,Ftt[0],Ftt[1],Ftt[2]); 
 
     var TZ = (D.getTimezoneOffset())/60; 
 
     var DConnected = new Date(Fdd[0],(Fdd[1]-1),Fdd[2],(Ftt[0]-TZ),Ftt[1],Ftt[2]); 
 
     sheet.getRange(startRow + i, 2).setValue(DConnected); 
 
    } 
 
    } 
 
}

関連する問題