【问题标题】:How to convert UTC date format provided by SalesForce Api and convert it to local Date and Time format using Google Apps Script如何转换 SalesForce Api 提供的 UTC 日期格式并使用 Google Apps 脚本将其转换为本地日期和时间格式
【发布时间】:2016-04-17 20:39:45
【问题描述】:

我查看了发布的各种解决方案,即解析、子字符串和拆分,但它们都没有产生值或所需的值。

通过 Salesforce API 接收的格式为“2014-08-19T02:26:00.000+0000”

基本上我想要一个可在 Google 表格中使用的自定义函数来转换此日期/时间格式并考虑夏令时

先谢谢你

【问题讨论】:

  • 您可以编写一个简单的解析函数,将字符串拆分成各个部分(例如s.split(/\D/)),然后使用带有值的 Date 构造函数。它应该只需要 2 行代码,如果需要验证,则需要更多。
  • Javascript Date 提供 toLocaleString 函数。所以, new Date("2014-08-19T02:26:00.000+0000").toLocaleString();我认为,只要文档/电子表格/脚本正确设置了区域设置就足够了。
  • @jad — toLocaleString 提供了一个表示本地时间的依赖于实现的字符串,并且因浏览器而异。标准的 toString 方法提供了更一致的字符串(尽管仍然依赖于浏览器)。但这不是 OP 的问题。
  • 看看下面的问答:Link to SO Question
  • 问题本身应该是完整的,它不应该要求标题。我不清楚您要达到什么目的,您是否需要帮助解析字符串或将其格式化为本地日期和时间?尝试其中一种或另一种的一些代码将有很大帮助(并且在给出答案之前是预期的)。

标签: javascript google-apps-script google-sheets


【解决方案1】:

我使用了一个简单的函数,如下所示:

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 可以可靠地获得主机时区偏移量。
  • 哦,上面忽略了偏移量的分钟部分(如果它存在的话),因此具有像 0430 这样的偏移量的区域将被错误地转换。它仅使用日期部分,在大多数浏览器中将被解析为 UTC,因此无法获得正确的本地日期或时间,因此如果适用夏令时,它将在转换时间前后 24 小时内出错。
  • @Rob 我理解您的评论,我很感激,但请记住,这篇文章专门关于 Google Apps 脚本,它不依赖于浏览器,因为它在服务器端运行。也就是说,我同意我得到 tz 的方式不是很优雅 :-) 我会考虑更好的。
  • 好的,我猜想用“实现”交换“浏览器”。 OP 似乎推断它在客户端上运行。 Google Apps 脚本是否提供自己的 Date 实现?
【解决方案2】:

首先感谢大家的意见。通过结合使用 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);
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2015-06-06
    • 1970-01-01
    • 2013-03-24
    • 2021-10-14
    相关资源
    最近更新 更多