【问题标题】:How do I format this date string so that google scripts recognizes it?如何格式化此日期字符串以便谷歌脚本识别它?
【发布时间】:2012-08-04 17:08:01
【问题描述】:

我得到一个带有如下格式日期字符串的 json 提要:

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

我原以为我可以把它传递给一个新的日期

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

这适用于 jsfiddle,但不适用于 google 脚本。它返回一个无效的日期。阅读this post 后,我意识到这可能是 GAS 解释日期字符串的方式,所以现在我不确定如何重新格式化日期以使其正常工作。

是否有最好的方法来重新格式化该日期字符串,以便 GAS 可以将其识别为日期?

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    Google Apps 脚本使用特定版本的 JavaScript (ECMA-262 3rd Edition),您发现无法解析 ISO 8601 格式的日期/时间。以下是我在许多 Apps 脚本中使用的修改后的函数

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

    【讨论】:

    • 嗨。 “ECMA-262 第 3 版”的链接已断开。您知道记录 Google“日期”对象的任何地方(例如构造函数、方法等)吗?谢谢。
    • ECMA-262 Language Specification Page Date Objects Section Direct Link in HTML Documentation
    • 在您的正则表达式字符串的第 2 行,您需要在点之前使用两个反斜杠,例如:\\. \。不是有效的转义字符,如果您想在 STRING 中使用反斜杠,则需要对其进行转义。现在,如果你的正则表达式在 / 和 / 之间,你就不需要转义反斜杠
    • Google Apps 脚本 new Date(String) 不接受 ECMA-262 第 3 版所说的内容。所以显然谷歌没有通过 ECMA-262 3rd Edition。 lECMA-262 3rd Edition 15.9.3.2YYYY-MM-DDTHH:mm:ss.sssZ+HH:mm 但谷歌似乎只喜欢YYYY/MM/DD HH:mm:ss +HHmm
    【解决方案2】:

    发现了这个似乎也可以完成这项工作的其他可能且非常简单的代码:

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

    【讨论】:

    • 这不适用于“2016-07-12T16:30:00.000+0200”,mhawskeys 答案更可靠
    【解决方案3】:

    如果事先知道格式,那么让它工作的硬而可靠的方法是解析它。

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

    我没有测试过这段确切的代码,但使用了类似的代码。因此,这使您对如何进行有一个公平的想法。

    【讨论】:

    • @Srik...工作完美。谢谢你的帮助。知道为什么 google 脚本无法识别该日期字符串吗?
    • 仅适用于 GMT-XX:XX 时区,那么早于 GMT/UTC 的时区呢?
    【解决方案4】:

    这对我有用,在 Google 脚本中将 日期字符串转换为日期对象

    日期字符串是通过 getValues() 方法从 Google 表格单元格中获取的。

    从:01.01.2017 22:43:34 到: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"));
    

    【讨论】:

    • 注意: Google Sheet 时区和 Google Script 时区是相等的。
    【解决方案5】:

    截至目前new Date() 似乎有效:

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

    在 Google Apps 脚本中返回 dT: Sat Aug 04 06:00:26 GMT+02:00 2012 or 1.344052826E12

    【讨论】:

      猜你喜欢
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 2017-10-20
      • 1970-01-01
      相关资源
      最近更新 更多