【问题标题】:How to subtract two different dates from a date/time stamp?如何从日期/时间戳中减去两个不同的日期?
【发布时间】:2016-02-01 20:39:40
【问题描述】:

我需要从2016-01-27T01:10:57.569000+00:00 之类的日期时间中减去1/26/2015 之类的日期。从我读过的内容中,将两者转换为从 Epoch 到毫秒的距离,然后减去是最简单的方法。我尝试过使用各种方法,但所有方法似乎都说2016-01-27T01:10:57.569000+00:00 是无效数据。 .getTime() 方法适用于1/26/2015 格式,但无法读取2016-01-27T01:10:57.569000+00:00

如何将日期/时间 UTC 时间转换为毫秒?

【问题讨论】:

  • 你能贴出你试过的代码吗?如果我们知道您做了什么,我们可以帮助解决问题。
  • 我不使用谷歌应用程序脚本,但通常你不应该允许 Date 构造函数解析字符串,它是不可靠的(参见this answer,很多人都喜欢它)。创建一个函数将字符串拆分为其组件并将它们传递给构造函数很简单(记住要从月份中减去 1)。

标签: javascript date datetime google-apps-script


【解决方案1】:

通过一种复杂的方式,您可以使用正则表达式将日期的每个部分提取为字符串,然后在带有所有参数的 new Date 中使用它们:

function getTimeDifference(){
  var regEx = /(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):([\d.]+)/;
  var dateString = '2016-01-27T01:10:57.569000+00:00';
  var r = regEx.exec( dateString );
  var date1 = new Date(r[1], r[2]-1, r[3], r[4], r[5], r[6]); // Notice the -1 in the month
  var date2 = new Date('1/26/2015');
  var difference = date1 - date2;
  Logger.log(difference);
}

【讨论】:

  • 请注意,您正在将 UTC 日期字符串转换为本地日期字符串,您应该使用 new Date(Date.UTC(...))。否则,您在new Date('1/26/2015') 之前做得很好。永远不要将字符串传递给 Date 构造函数,它非常不可靠。最好手动解析它(2 行而不是 1 行)。
【解决方案2】:

我最终使用了这个。当我调用 parseDate() 时,我使用 getTime() 以毫秒为单位获取日期,然后减去它们并将它们转换为天。对于我的用例,时间不必精确到秒,但如果确实如此,从字符串中解析更多信息就不难了。最初我遇到了麻烦,因为作为一个 Javascript 初学者,我不知道为什么应用程序脚本不接受这种格式到日期构造函数中。

function parseDate(str) {
//This should accept 'YYYY-MM-DD' OR '2016-01-27T01:10:57.569000+00:00'
if(str.length == 10){
    var mdy = str.split('-');
    return new Date(mdy[0], mdy[1]-1, mdy[2]);
    }
else
   {
   var mdy = str.split('-');
   var time = mdy[2].split('T');
   var hms = time[1].split(':');
   return new Date(mdy[0], mdy[1]-1, time[0], hms[0], hms [1]);
   
   }
}

【讨论】:

    【解决方案3】:

    如果您确信日期字符串中的值始终有效并且 ISO8601 字符串的偏移量始终为 00:00(即 UTC),那么简单的解析函数是:

    // Parse ISO 8601 format 2016-01-27T01:10:57.569000+00:00
    function parseISOUTC(s) {
      var b = s.split(/\D/);
      return new Date(Date.UTC(b[0],b[1]-1,b[2],b[3],b[4],b[5],b[6]));
    }
    
    document.write(parseISOUTC('2016-02-04T00:00:00.000+00:00'));
    
    // Parse US format m/d/y
    function parseMDY(s) {
      var b = s.split(/\D/);
      return new Date(b[2],b[0]-1,b[1]);
    }
        
    document.write('<br>'+ parseMDY('2/4/2016'))    
        
    document.write('<br>'+ (parseISOUTC('2016-02-04T00:00:00.000+00:00') - parseMDY('2/4/2016')))

    请注意,第一个字符串是 UTC,第二个字符串将被视为本地字符串(根据 ECMAScript 2015),因此 2016-02-04T00:00:00.000+00:00 和 2/4/2016 之间的差异将是主机系统的时区偏移量。

    【讨论】:

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