无法将日期字符串转换为YYYY-MM-DDTHH:MM:SS-HH:MM格式

时间:2018-11-16 20:26:52

标签: javascript date google-apps-script

我的开始日期如下:

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脚本,并在可能的情况下尝试避免使用jQuery。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我完全同意@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"

答案 2 :(得分:0)

您可以重新格式化字符串。 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()));