我已經查看過發佈的各種解決方案,即解析,子字符串和分割,並且它們都不會生成值或必需的值。如何轉換SalesForce Api提供的UTC日期格式並使用Google Apps腳本將其轉換爲本地日期和時間格式
通過Salesforce的API接收到的格式爲「2014-08-19T02:26:00.000 + 0000」
基本上我想,可以谷歌表內使用此日期/時間格式轉換爲自定義函數和採取夏令考慮
謝謝您事先
我已經查看過發佈的各種解決方案,即解析,子字符串和分割,並且它們都不會生成值或必需的值。如何轉換SalesForce Api提供的UTC日期格式並使用Google Apps腳本將其轉換爲本地日期和時間格式
通過Salesforce的API接收到的格式爲「2014-08-19T02:26:00.000 + 0000」
基本上我想,可以谷歌表內使用此日期/時間格式轉換爲自定義函數和採取夏令考慮
謝謝您事先
我用一個簡單的函數象下面這樣:
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));
}
從時間部分中刪除日期是沒有意義的。如果您打算信任Date構造函數來解析字符串(不推薦),那麼時間和區域應該保留。強烈建議不要信任內置的* toString *方法,它完全依賴於實現,並可能在不同的實現上返回不同的字符串。使用[* getTimezoneOffset *](http://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.gettimezoneoffset)可以可靠地獲得主機時區偏移量。 – RobG
噢,上面忽略了偏移的分鐘部分(如果它存在的話),所以像0430這樣偏移的區域將被錯誤地轉換。而且它只使用日期部分,在大多數瀏覽器中這些日期部分將被解析爲UTC,所以無法獲得正確的本地日期或時間,所以如果採用夏令時,則在轉換時間周圍約24小時會出現錯誤。 – RobG
@Rob我理解你的評論,我很欣賞,但請記住,這篇文章是專門針對Google Apps腳本,它不是瀏覽器,因爲它在服務器端運行。這就是說,我同意我得到tz的方式不是很優雅:-)我會考慮更好的東西。 –
首先謝謝爲大家的輸入。通過使用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);
}
}
}
你可以寫,其將字符串轉換成它,它的零件的簡單解析函數(如's.split(/ \ d /)'),然後使用*日期*與構造值。它只需要2行代碼,如果需要驗證,則需要更多。 – RobG
Javascript日期提供toLocaleString函數。因此,新日期(「2014-08-19T02:26:00.000 + 0000」)。toLocaleString();應該足夠了,我認爲,提供文檔/電子表格/腳本具有正確設置的區域設置。 – jad
@ jad- * toLocaleString *提供了一個依賴於實現的字符串,它表示當地時間,並因瀏覽器而異。標準的* toString *方法提供了一個更一致的字符串(儘管仍然依賴於瀏覽器)。但這不是OP的問題。 – RobG