【问题标题】:Trouble converting dates string to YYYY-MM-DDTHH:MM:SS-HH:MM format无法将日期字符串转换为 YYYY-MM-DDTHH:MM:SS-HH:MM 格式
【发布时间】:2018-11-16 20:26:51
【问题描述】:

我的开始日期如下所示:

var startDate = "Mon Jun 30 2014 00:00:00 GMT-0400 (EDT)";

我正在尝试将其格式化为:

var endDate = "2014-06-30T00:00:00-04:00";

我已使用 toISOString() 方法将其正确半格式化:

var formattedDate = new Date(startDate);
formattedDate = formattedDate.toISOString();

将其格式化为“2014-06-30T04:00:00.000Z”。这接近我需要的,但我想知道是否有内置方法将其格式化为“-04:00”格式?还是我需要将我的字符串分成几部分并以正确的格式将其重新组合在一起?

另外,我正在使用 ES5 的 Google Apps Script,并且尽可能避免使用 jQuery。

【问题讨论】:

  • 除了使用像 moment.js 这样的库之外,您还必须自己解析字符串并将它们重新组合在一起。从第一个字符串中获取-4:00 并将其拼接到toISOString() 版本中
  • 这是什么格式?如果它是非标准的,则必须自己对其进行编码。请参阅 the docs for toISOString(); 中的 polyfill 示例并根据您的需要进行更改!
  • 这似乎是XY problem。您要解决的实际问题是什么? 2014-06-30T00:00:00-04:002014-06-30T04:00:00.000Z 是相同的时间戳。一个有时区偏移,另一个是 UTC (Z),但它们代表相同的时间点,任何理解 ISO 8601 的程序都可以正确处理。考虑到这一点,为什么需要时区偏移量?
  • @JordanRunning 我需要这种格式的唯一原因是因为我输入日期的这个应用程序需要这种格式,并且会抛出 Z 格式的错误。
  • @MattMcCode 检查我的答案。 Google Apps 脚本有一个内置方法来处理您的用例。

标签: javascript date google-apps-script


【解决方案1】:

Google Apps 脚本 (GAS) 有一个内置的实用程序方法,您可以利用它来格式化日期:

Utilities.formatDate()

它基于 Java 的 SimpleDateFormat 类。

要格式化日期以满足您的要求,以下内容就足够了:

var date = new Date("Mon Jun 30 2014 00:00:00 GMT-0400 (EDT)");

var formattedDate = Utilities.formatDate(
        date, 
        Session.getScriptTimeZone(), 
        "yyyy-MM-dd'T'HH:mm:ssXXX"
    );

注意:您可能需要通过 GAS GUI 菜单设置脚本的时区:

File->Project Properties->Info

【讨论】:

    【解决方案2】:

    我完全同意@JordanRunning 的评论。
    尽管如此,出于好奇,我还是很快整理了一种方法来获得您想要的格式:

    // two helper functions
    function pad(number) {
      if (number < 10) {
        return '0' + number;
      }
      return number;
    }
    
    function getOffset(offset) {
      if(offset<0) {
        wminutes = 0 - offset;
        var posneg = "-";
      } else {
        wminutes = offset;
        var posneg = "+";
      }
      var hours = pad(Math.floor(wminutes/60));
      var minutes = pad(wminutes % 60);
      return posneg+hours+":"+minutes;
    }
    
    // the actual format function
    Date.prototype.toMyFormat = function() {
      var format = this.getUTCFullYear() +
        '-' + pad(this.getMonth() + 1) +
        '-' + pad(this.getDate()) +
        'T' + pad(this.getHours()) +
        ':' + pad(this.getMinutes()) +
        ':' + pad(this.getSeconds());
    
      timezoneOffset = getOffset(this.getTimezoneOffset());
      format += timezoneOffset;
      return format;
    }
    
    // usage:
    console.log(new Date().toISOString());
       // "2018-11-16T20:53:11.365Z"
    console.log(new Date().toMyFormat());
       // "2018-11-16T21:53:11-01:00"
    

    【讨论】:

      【解决方案3】:

      您可以重新格式化字符串。 OP 中的格式与 ECMAScript 2018 中为Date.prototype.toString 指定的格式一致,因此您甚至可以使用相同的函数重新格式化:

      // Convert string in DDD MMM DD YYYY HH:mm:ss ZZ format to
      // YYYY-MM-DDTHH:mm:ssZZ format
      function formatDateString(s) {
        var m = {Jan:'01',Feb:'02',Mar:'03',Apr:'04',May:'05',Jun:'06',
                 Jul:'07',Aug:'08',Sep:'09',Oct:'10',Nov:'11',Dec:'12'};
        var b = s.split(' ');
        return `${b[3]}-${m[b[1]]}-${b[2]}T${b[4]}${b[5].slice(-5,-2)}:${b[5].slice(-2)}`;      
      }
      
      console.log(formatDateString("Mon Jun 30 2014 00:00:00 GMT-0400 (EDT)"));
      
      // Not recommended, but it will format any date where its 
      // toString method is consistent with ECMAScript 2018
      console.log(formatDateString(new Date().toString()));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-30
        • 1970-01-01
        相关资源
        最近更新 更多