【问题标题】:Removing a timeframe from another timeframe从另一个时间范围中删除一个时间范围
【发布时间】:2022-01-03 22:06:33
【问题描述】:

我有一个案例场景,我真的不知道如何处理。 我有两个包含日期/时间范围的对象数组。我需要做的是检查第一组的范围是否包含在第二组的范围内,以及是否将其删除。例如:

abc:[
   {
      "start": "2021-11-25 16:30:00",
      "end": "2021-11-25 17:30:00"
   }
]

xyz:[
   {
      "start": "2021-11-25 09:00:00",
      "end": "2021-11-25 18:00:00"
   },
   {
      "start": "2021-11-26 15:00:00",
      "end": "2021-11-26 19:00:00"
   }
]

我需要从 xyz 中删除 abc 的范围,所以最后 xyz 看起来像这样:

xyz:[
   {
      "start": "2021-11-25 09:00:00",
      "end": "2021-11-25 16:30:00"
   },
   {
      "start": "2021-11-25 17:30:00",
      "end": "2021-11-25 18:00:00"
   },
   {
      "start": "2021-11-26 15:00:00",
      "end": "2021-11-26 19:00:00"
   }
]

这可以在 PHP 或 JS 中完成。

到目前为止,Google 还不是很充实。

提前感谢您的任何帮助

【问题讨论】:

    标签: javascript php datetime


    【解决方案1】:

    哎呀,谷歌将能够解决所有软件开发人员消失的算法的那一天。 这里有一些快速的 javascript:

            
    var abc=[
       {
          "start": "2021-11-25 16:30:00",
          "end": "2021-11-25 17:30:00"
       }
    ]
    
    var xyz =[
       {
          "start": "2021-11-25 09:00:00",
          "end": "2021-11-25 18:00:00"
       },
       {
          "start": "2021-11-26 15:00:00",
          "end": "2021-11-26 19:00:00"
       }
    ];
    
    var newXyz=[];
    for(var i in xyz){
      var start = new Date(xyz[i]["start"]).getTime();
      var end = new Date(xyz[i]["end"]).getTime();
      var collisionDetected=false;
      for(var j in abc){
        var start2 = new Date(abc[j]["start"]).getTime();
        var end2 = new Date(abc[j]["end"]).getTime();
        if(
          start2>start &&
          start2<end &&
          1
        ){
          newXyz.push({"start":xyz[i]["start"],"end":abc[j]["start"]});
    
          if(
            end2<end &&
            1
          ){
            newXyz.push({"start":abc[j]["end"],"end":xyz[i]["end"]});
          }
          collisionDetected=true;
          break;
        }
      }
      if(collisionDetected==false){
        newXyz.push({"start":xyz[i]["start"],"end":xyz[i]["end"]});
      }
    }
    
    xyz = newXyz;
    
    console.dir(xyz);

    【讨论】:

    • Re new Date(xyz[i]["start"]) 参见 Why does Date.parse give incorrect results?(提示:new Date("2021-11-26 15:00:00") 在 Safari 中生成无效日期)。鉴于字符串是 ISO 8601-ish 格式,它们可以作为字符串进行比较,无论如何都不需要转换为 Date 对象。一个好的答案应该解释代码是如何工作的,无论是文本还是 cmets(更不用说代码在 Safari 中不起作用)。 :-(
    • 另外,start2&lt;end 应该是end2&lt;end&amp;&amp; 1 的用途是什么?
    • 我在 stackoverflow 上还很新,所以下次我尝试更准确地使用世界快速 javascript 时,我的意思是代码没有经过全面测试。我不喜欢单行注释,如果代码的意图很明确,我认为单行注释是多余的(但我尝试更多评论并测试更多感谢您的建议)。 “start2
    • @emilianoc - 差不多。它工作得非常好,但只有在一天内发生一次碰撞时,如果 abc 包含 2 个条目,都在同一天(即 10-12 和 14-15),则只考虑第一个。跨度>
    猜你喜欢
    • 1970-01-01
    • 2017-02-10
    • 2012-08-05
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    相关资源
    最近更新 更多